thinkphp v5.1.29 任意代码执行漏洞分析


thinkphp v5.1.29 远程代码执行漏洞

v5.1.30更改位置为

image-20210407131705716

可以单步跟一下,然后大概可以发现是判断path路径方向的,找一些分析报告发现主要漏洞点在thinkphp/library/think/Request.php中,具体漏洞在于开发者留下的这个参数

image-20210407131848602

跟着这个参数跳转,可以看到进入pathinfo函数,效果是获得当前请求URL的pathinfo后缀

image-20210407131936192

大概逻辑基本是判断当前get是否有这个参数,如果有就把值传给$pathinfo,然后销毁get变量,当我们传入http://localhost/tp5.1/html/public/index.php/?s=index/zzj\zzj

image-20210407132542305

然后继续走,发现调用这个pathinfo函数的是path函数

image-20210407132706787

因此我们对于path的返回值this->path是可控的,而调用其的是app.php 583行的routecheck函数,这是个路由检测,而path泽被传递给了check函数

image-20210407132926537

check里面存在路由判断,即开启了强制路由则会出现不匹配线则,则会throw

image-20210407133035868

正常must是不开启的,而我们传递来的path参数变成了$url参数,参与了UrlDispath的实例化操作,而在进入check函数之前,就可以发现强制将第一个/变成了|

image-20210407133240534

继续看urldispatch的实例化函数

image-20210407133643042

url被赋值给了dispatch函数,然后check相关函数结束,调用了init(),其中调用了parseUrl函数

image-20210407133744191

然后将当前的url进行解析

image-20210407133809242

然后调用parseurlpath函数

image-20210407133901974

根据代码和结果,简单判断基本上就是将|转换回/,然后将其按照/进行切分,切分成数组保存

然后就是各种赋值,最后调用Module Dispatch的init()函数,将dispatch也就是刚才得到的数组赋值给了result

然后继续跟,他会进行一个简单的判断,判断你第一个参数是否存在,官方存在的demo是index,然后将参数传给this->controller

image-20210407140301916

image-20210407140952823

调用了controller函数,其中name参数是我们可以控制的

image-20210407141030050

将name参数传递到parsemoduleandclass函数中

image-20210407141317299

代码大概意思就是如果我们传递的参数name存在反斜杠,则直接赋值给class并返回,因此可以通过控制操作类的实例化过程来实现代码执行漏洞

尝试实例化app类

image-20210407141610320

app类中不存在index方法,但是漏洞已经出现,可以用命名空间的方式来调用任意方法的任意类

thinkphp中存在file类,write方法

image-20210407141828922

因此可以借助这个类实现shell的写入

payload:http://localhost/tp5.1/html/public/index.php/?s=/index/\think\template\driver\file/write?cacheFile=shell.php&content=<?php phpinfo();

image-20210407142047880


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM