首页 > Web开发 > 详细

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

时间:2021-04-08 20:47:52      阅读:29      评论:0      收藏:0      [点我收藏+]

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的写入

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

技术分享图片

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

原文:https://www.cnblogs.com/buchiyexiao/p/14633908.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!