thinkphp v5.1.29 远程代码执行漏洞
v5.1.30更改位置为
可以单步跟一下,然后大概可以发现是判断path路径方向的,找一些分析报告发现主要漏洞点在thinkphp/library/think/Request.php中,具体漏洞在于开发者留下的这个参数
跟着这个参数跳转,可以看到进入pathinfo函数,效果是获得当前请求URL的pathinfo后缀
大概逻辑基本是判断当前get是否有这个参数,如果有就把值传给$pathinfo,然后销毁get变量,当我们传入http://localhost/tp5.1/html/public/index.php/?s=index/zzj\zzj
然后继续走,发现调用这个pathinfo函数的是path函数
因此我们对于path的返回值this->path是可控的,而调用其的是app.php 583行的routecheck函数,这是个路由检测,而path泽被传递给了check函数
check里面存在路由判断,即开启了强制路由则会出现不匹配线则,则会throw
正常must是不开启的,而我们传递来的path参数变成了$url参数,参与了UrlDispath的实例化操作,而在进入check函数之前,就可以发现强制将第一个/变成了|
继续看urldispatch的实例化函数
url被赋值给了dispatch函数,然后check相关函数结束,调用了init(),其中调用了parseUrl函数
然后将当前的url进行解析
然后调用parseurlpath函数
根据代码和结果,简单判断基本上就是将|转换回/,然后将其按照/进行切分,切分成数组保存
然后就是各种赋值,最后调用Module Dispatch的init()函数,将dispatch也就是刚才得到的数组赋值给了result
然后继续跟,他会进行一个简单的判断,判断你第一个参数是否存在,官方存在的demo是index,然后将参数传给this->controller
调用了controller函数,其中name参数是我们可以控制的
将name参数传递到parsemoduleandclass函数中
代码大概意思就是如果我们传递的参数name存在反斜杠,则直接赋值给class并返回,因此可以通过控制操作类的实例化过程来实现代码执行漏洞
尝试实例化app类
app类中不存在index方法,但是漏洞已经出现,可以用命名空间的方式来调用任意方法的任意类
thinkphp中存在file类,write方法
因此可以借助这个类实现shell的写入