ctf题目练手·二
0x00 前言
无论何处学习,都应勤于思考。本题因为对木马的理解不够深刻,耗了很长一段时间。
最低等的学习即是拿来就用,不去思考这么用的原理是什么,能不能提炼出基于目的的一般性原则甚至方法。更高等的学习即是从特定的方法总结出一般性、普适性的规律和本质。
0x01 题目
题目来源:2020-第五空间智能安全大赛-Web-hate-php
过滤了以下内容:
f
、l
、a
、g
、p
、g
(不区分大小写).
、/
、;
、"
、‘
、|
、[
、]
、_
以及反引号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()
就很方便。