内容简介:ThinkPHP是一个快速、简单的基于 MVC 和面向对象的轻量级 PHP 开发框架,遵循 Apache2 开源协议发布,一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验和易用性,为 WEB 应用和 API 开发提供了强有力的支持。之前放出来这个Thinkphp5.1~5.2全版本代码执行漏洞,这个漏洞在5.0.*部分版本中也适用。漏洞执行流程分为两个阶段,第一阶段为利用变量覆盖漏洞,第二阶段利用代码执行触发漏洞。需要的应用和环境:
0x01 简介
ThinkPHP是一个快速、简单的基于 MVC 和面向对象的轻量级 PHP 开发框架,遵循 Apache2 开源协议发布,一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验和易用性,为 WEB 应用和 API 开发提供了强有力的支持。
之前放出来这个Thinkphp5.1~5.2全版本代码执行漏洞,这个漏洞在5.0.*部分版本中也适用。漏洞执行流程分为两个阶段,第一阶段为利用变量覆盖漏洞,第二阶段利用代码执行触发漏洞。
0x02 环境配置
需要的应用和环境:
1、Windows 10
2、phpStudy
3、phpStorm
4、XDebug
5、火狐浏览器
6、火狐浏览器插件-XDebug-ext
7、ThinkPHP 5.1.30
首先需要将phpStudy和phpStorm安装,安装成功后,phpStudy如图1所示,phpStorm如图2所示,请注意需要使用PHP5.6以上版本,不然运行ThinkPHP 5.1.30会报错。
图 1
图 2
XDebug 配置需要编辑php.ini,将配置替换如下,路径需要按照实际情况修改,访问PHPINFO,如果存在XDebug信息说明配置成功。如图3所示。
[XDebug] xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" xdebug.trace_output_dir="D:\phpStudy\tmp\xdebug" zend_extension="D:\phpStudy\PHPTutorial\php\php-5.6.27-nts\ext\php_xdebug.dll" xdebug.remote_enable=1 //是否允许远程终端 这里标示开启 xdebug.profiler_enable_trigger=0 xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.idekey=PHPSTORM
图 3
然后需要配置phpStorm,选择File=>Settings=>php,选择好需要的PHP版本,如图4所示
图 4
选择File=>Settings=>Debug,配置好端口,端口需要和之前的配置文件对应,如图5所示。
图 5
选择File=>Settings=>Servers,配置如图6所示,Name需要和xdebug.idekey对应一致。
图 6
接下来配置火狐浏览器,火狐浏览器用的版本如图7所示。
图 7
需要安装XDebug-ext,配置如图8所示。
图 8
最后将ThinkPHP 5.1.30的环境,拷贝到WWW目录中,如图9所示,配置完成。
图 9
0x03 代码审计
在火狐浏览器中使用POC,通过phpStrom跟踪执行流程。
POC如下:
(post)public/index.php (data)c=system&f=calc.exe&_method=filter
找到变量覆漏洞,变量覆盖漏洞导致能控制$this->{$method},调用链如下:
Request.php:814, think\Request->method() RuleGroup.php:151, think\route\RuleGroup->check() Domain.php:76, think\route\Domain->check() Route.php:885, think\Route->check() App.php:604, think\App->routeCheck() App.php:402, think\App->run() index.php:21, {main}()
代码位置:thinkphp/library/think/Request.php 814行。如图10所示。
图10
找到变量覆盖漏洞触发后,执行流程会逐步返回App.php:435, think\App->run(),找到Middleware.php:130, think\Middleware->dispatch()跟着流程审计会找到执行call_user_func(“system”,”calc.exe”),调用链如下:
Request.php:1455, think\Request->filterValue() Request.php:1370, array_walk_recursive() Request.php:1370, think\Request->input() Request.php:956, think\Request->param() Module.php:121, think\route\dispatch\Module->think\route\dispatch\{closure}() Middleware.php:185, call_user_func_array:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:185}() Middleware.php:185, think\Middleware->think\{closure}() Middleware.php:130, call_user_func:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:130}() Middleware.php:130, think\Middleware->dispatch() Module.php:140, think\route\dispatch\Module->exec() Dispatch.php:168, think\route\Dispatch->run() App.php:432, think\App->think\{closure}() Middleware.php:185, call_user_func_array:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:185}() Middleware.php:185, think\Middleware->think\{closure}() Middleware.php:130, call_user_func:{D:\phpStudy\PHPTutorial\WWW\thinkphp_5.1.30\thinkphp\library\think\Middleware.php:130}() Middleware.php:130, think\Middleware->dispatch() App.php:435, think\App->run() index.php:21, {main}()
代码位置:thinkphp/library/think/Request.php 1455行,如图11所示。
图 11
通过放出的POC进行复现,漏洞复现结果,如图12所示。
图12
0x04 修复建议
1.利用Composer 或官网更新至最新版本。
2.如果不能及时更新,建议参考最新版本的Request类的method方法进行手工修复。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- phpcms网站漏洞修复之远程代码写入缓存漏洞利用
- JMX远程代码漏洞研究
- WinRAR 代码执行漏洞复现
- 2018开源代码安全报告:每个代码库平均包含64个漏洞
- ecshop 全系列版本网站漏洞 远程代码执行sql注入漏洞
- struts2远程代码执行漏洞
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。