0x00 前言

无论何处学习,都应勤于思考。本题因为对木马的理解不够深刻,耗了很长一段时间。

最低等的学习即是拿来就用,不去思考这么用的原理是什么,能不能提炼出基于目的的一般性原则甚至方法。更高等的学习即是从特定的方法总结出一般性、普适性的规律和本质。


0x01 题目

题目来源:2020-第五空间智能安全大赛-Web-hate-php

image-20240830132309970

过滤了以下内容:

  • flagpg(不区分大小写)
  • ./;"|[]_以及反引号
  • PHP 所有的内置函数

参数在assert()提供的PHP环境里执行。


0x02 解决

system()

不难看出直接使用system()是不行的,因为题目禁止了PHP 所有的内置函数。但是我们必须要使用内置函数去跟系统交互,那该怎么解决这个问题呢?其实P神早已给出解决方案:

PHP7前是不允许用($a)();这样的方法来执行动态函数的,但PHP7中增加了对此的支持。所以,我们可以通过(‘phpinfo’)();来执行函数,第一个括号中可以是任意PHP表达式。

PHP7允许:()();这样的语法。

既然如此,那我们采用取反或者异或等把字符串先变形,绕过waf,在PHP执行代码时再转换为正确的命令即可。如此,那个看似禁止了全部内置函数的waf其实什么都没禁止。

目标命令:system(“ls /”)?>

system取反:~%8C%86%8C%8B%9A%92

ls取反:~%93%8C

payload:

1
?code=(~%8C%86%8C%8B%9A%92)(~%93%8C)?>

highlight_file()

没错,是不是很骚很刁钻的函数。

目标命令:highlight_file(“flag.php”)?>

再按照上述方法即可。有人可能会问,为什么你就知道flag.php会在同一目录下呢?其实这一试就出来了,CTFer就是应该具备多猜猜、多试试的能力。

0x03 木马?

本题可以使用木马吗,我试了很长一段时间。其实完全没必要上传木马:

首先,我的目的是得到flag,或者说getshell。这其中有着非常细节的逻辑:

  • 第一步:可以前端输入。
    • 希望payload可以到达PHP环境
  • 第二步:payload到达PHP环境,可以任意执行PHP命令。
    • 希望到达系统的环境
  • 第三步:到达系统的环境,可以执行系统命令,但是权限不够。
    • 希望能提权至管理员
  • 第四步:得到管理员权限,无所不能。

什么时候需要木马呢?如果我们卡在第一步,没法在PHP环境下执行payload,那我们可以上传木马到网站,通过访问木马到达PHP环境。

木马最重要的功能就是创建PHP环境,但是本题的payload已经放在PHP环境了,完全没有必要再上传木马,所以本题从需求上就不需要上传木马,直接执行system()就很方便。