ThinkPHP v6.0.x 反序列化漏洞利用
前言:
上次做了成信大的安询杯第二届CTF比赛,遇到一个tp6的题,给了源码,目的是让通过pop链审计出反序列化漏洞。
这里总结一下tp6的反序列化漏洞的利用。
0x01环境搭建
现在tp新版本的官网不开源了,但是可以用composer构建环境,系统需先安装composer。然后执行命令:
composer create-project topthink/think=6.0.x-dev v6.0
cd v6.0
php think run
或者可以去github上下载,但是需要改动很多,也可以去csdn上下载人家配好了的源码。
tp6需要php7.1及以上的环境才能搭建成功。
搭建完成后访问ip加/public即可
0x02利用条件
需要在根目录下的 /app/controller的index.php里面存在unserialize()函数且为可控点,例如存在
unserialize($_GET['payload'])
0x03POP链分析
总的目的是跟踪寻找可以触发__toString()
魔术方法的点
先从起点__destruct()或__wakeup方法
开始,因为它们就是unserialize的触发点。
刚装了系统,还没下载phpstorm,先利用seay审计,然后全局搜索__destruct()方法,这里用了/vendor/topthink/think-orm/src下的Model.php,因为它里面含有save()方法可以被触发。
跟进去,当$this->lazySave == true
时,$this->save()
方法将被触发
$this->lazySave == true
时,会触发$this->save()
方法
跟进save()方法
发现对$this->exists属性进行判断,如果为true则调用updateData()
方法,false则调用insertData()
方法。
试着跟进一下updateData()方法,发现updateData
方法可以继续利用
那么我们首先要构造参数使得updateData()被触发,需要将下面这个if过掉
跟进isEmpty()方法看一下,
保证isEmpty返回false,以及$this->trigger(‘BeforeWrite’)返回true即可绕过判断然后触发我们的updateData()方法。
构造$this->data为非空数组
构造$this->withEvent为false
构造$this->exists为true
继续跟进updateData()方法
需要绕过含有return的判断,第一个判断前面的save方法符合条件,第二个if需要$data非空
$data的属性值由方法getChangedData()控制,跟进它
如图两个变量初始值为[] 符合下面if的判断,结果返回1,即默认返回$data=1,确保这一步绕过之后我们就到了checkAllowFields()方法了
跟进checkAllowFields方法
发现了个字符串拼接
由于$this->field==null,$this->schema==null,因此默认满足
那么我们看上面的db()方法
跟进db()方法
发现满足判断条件的话,就存在$this->table . $this->suffix
参数的拼接,这不就是那两个熟悉的拼接吗,可以触发__toString
满足connect函数的调用即可。
后面就是延续tp5反序列化的触发toString
魔术方法了,就是原来vendor/topthink/think-orm/src/model/concern/Conversion.php的__toString开始的利用链
目前的逻辑链图:
也就是:
__destruct()——>save()——>updateData()——>checkAllowFields()——>db()——>$this->table . $this->suffix(字符串拼接)——>toString()
这一部分构造的参数为:
$this->exists = true;
$this->$lazySave = true;
$this->$withEvent = false;
寻找__toString触发点
全局搜索__toString(),找到vendor/topthink/think-orm/src/model/concern/Conversion.php
跟进toJson()方法
跟进toArray()方法
第三个foreach里面存在getAttr
方法,他是个关键方法,我们需要触发他
触发条件:
$this->visible[$key]存在,即$this->visible存在键名为$key的键,而$key则来源于$data的键名,$data则来源于$this->data,也就是说$this->data和$this->visible要有相同的键名$key
构造参数,把$key
做为参数传入getAttr
方法
跟进getAttrr()方法
然后$key值就传入到了getData()方法,跟进getData方法
第一个if判断传入的值,$key值不为空,因此绕过,然后$key值传入到了getRealFieldName()方法,跟进getRealFieldName
方法
当$this->strict
为true
时直接返回$name
,即$key
回到getData
方法,此时$fieldName = $key
,进入判断语句:
返回$this->data[$fielName]也就是$this->data[$key]
,记为$value
,再回到getAttr
也就是返回 $this->getValue($key, $value, null);
跟进getValue()方法
只要满足$this->withAttr[$key]存在且$this->withAttr[$key]不为数组就可以触发命令执行。
最终会把$this->withAttr[$key]作为函数名动态执行函数,而$value作为参数,就可以利用执行系统函数达到命令执行。
到这里呈现了一条完整的POP链。
后半部分__toString的逻辑链图
这一部分参数赋值:
$this->table = new think\model\Pivot();
$this->data = ["key"=>$command];
$this->visible = ["key"=>];
$this->withAttr = ["key"=>$function];
$this->$strict = true;
因为这里的Model
类为抽象abstract
类,所以我们需要找一个继承于Model
的类,比如Pivot
类
0x04 利用exp
tp默认主页目录为/public/,这下面的index.php会定位到/app/controller/index.php文件,因此url中/public/将调用app/controller/index.php,那么我们要知道里面的GET变量,用来传参数。
那么我们定位到app/controller/index.php,找到里面的unserialize()函数里面的GET变量。我这里的环境里面没有unserialize()函数,我们手动加上并加上一个GET变量
网上我看到其他tp6框架的这个文件里面用的是$u这个变量来装unserialize()的值,并且用的GET变量是c,而且还对GET变量进行了base64_decode()编码,我这里为了对应安询杯比赛环境,没有加上base64编码。
首先利用phpggc工具生成exp,phpggc是一个反序列化payload生成工具,大佬们已经将tp6的exp上传到了phpggc,需要安装在linux上,然后执行以下命令生成exp的payload
./phpggc -u ThinkPHP/RCE2 'phpinfo();'
将生成的序列化字符串的payload传参给GET变量c,发送请求,然后将执行phpinfo()。
如果是真实的tp6框架,试试将payload进行base64编码后再发送请求。
ThinkPHP v6.0.x 反序列化漏洞利用的更多相关文章
- xxl-job <=2.0.2 反序列化漏洞
xxl-job <=2.0.2 反序列化漏洞 搭建 https://github.com/xuxueli/xxl-job/releases/tag/2.0.2 下载源码,导入idea,mysql ...
- CVE-2017-12149JBoss 反序列化漏洞利用
CVE-2017-12149 漏洞描述 互联网爆出JBOSSApplication Server反序列化命令执行漏洞(CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主机 ...
- CVE-2017-3248——WebLogic反序列化漏洞利用工具
著名的web中间件WebLogic被曝出之前的反序列化安全漏洞补丁存在绕过安全风险,用户更新补丁后,仍然存在被绕过成功执行远程命令攻击的情况,安全风险高,Oracle官方及时发布了最新补丁,修复了该漏 ...
- tp6.0.x 反序列化漏洞
tp6 反序列化漏洞复现 环境 tp6.0 apache php7.3 漏洞分析 反序列化漏洞需要存在 unserialize() 作为触发条件,修改入口文件 app/controller/Index ...
- Shiro反序列化漏洞利用汇总(Shiro-550+Shiro-721)
Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能.Shiro框架直观.易用,同时也能提供健壮的安全性. 文章目录: 1.Shiro rememberMe ...
- fastjson 反序列化漏洞利用总结
比赛遇到了,一直没利用成功,这里做个记录. 环境搭建 首先用 vulhub 搭建 fastjson 的漏洞环境. 漏洞环境程序的逻辑为接收 body 的数据然后用 fastjson 解析. 漏洞利用 ...
- Shiro 反序列化漏洞利用
环境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 # 80 ...
- FastJson反序列化漏洞利用的三个细节 - TemplatesImpl的利用链
0. 前言 记录在FastJson反序列化RCE漏洞分析和利用时的一些细节问题. 1. TemplatesImpl的利用链 关于 parse 和 parseObject FastJson中的 pars ...
- NodeJS反序列化漏洞利用
原文来自:http://www.4hou.com/web/13024.html node.js是一个服务器端的运行环境,封装了Google V8引擎,V8引擎执行JavaScript速度非常快,性能非 ...
随机推荐
- BJUT数字图像处理作业
一. n的正方形图像,用FFT算法从空域变换到频域,并用频域图像的模来进行显示. 2) 使图像能量中心,对应到几何中心,并用频域图像的模来进行显示. 3)将频域图象,通过FFT逆变换到空域,并显示. ...
- keywords in my life
在脑子里出现的灵光一现的话语总是美好的: 1.当你试图站在人的发展,历史的发展的角度上看待问题,会发现我们身上所发生的任何事情都是必然的. 2.永远不要以好人的身份去看待和分析一件事情. 3.历史悲剧 ...
- LeetCode 664. Strange Printer 奇怪的打印机(C++/Java)
题目: There is a strange printer with the following two special requirements: The printer can only pri ...
- eclipse导入项目时的一些准备
导入前的工作: 1.因为别人项目的运行环境可能和我们不一样,所以首先要在要导入的项目里面找到.setting文件,修改下面的xml文件,这个文件里面是关于服务器的一些配置的信息,你可以改成与你电脑一样 ...
- CCF_201612-4_交通规划
http://115.28.138.223/view.page?gpid=T44 好像也没想象中的那么难,没办法,当初连个优先队列dij都不会写= = 在优先队列dij算法上加上相等的时候的处理就可以 ...
- ARTS Week 5
Nov 25, 2019 ~ Dec 1, 2019 Algorithm 深度优先搜索--书籍分配 题目描述:有b1-b5五本书,要分配给五个学生,分别是a1-a5.但每个学生都有其喜欢的书,要检查是 ...
- go net包简记
TCP服务端 go语言中可以每次建立一次链接就创建一个goroutine去处理,使用goroutine实现并发非常方便和高效. TCP服务端程序的一般处理流程1.建立并绑定 Socket:首先服务端使 ...
- Altium Designer打印多块PCB到热转印纸上、拼板发给工厂
接下来介绍的方法的优势有: 节省电脑性能(来自不同PCB文件的图案被放置时只在第1块会卡顿一小会儿,之后不再卡顿) 便于排版(拖放图案时绝不会改变图案内容,拖放图案时鼠标拖住的矩形框的尺寸与图案的尺寸 ...
- MySQL必知必会官方提供的数据库和表
创建表 Create customers table CREATE TABLE customers ( cust_id int NOT NULL AUTO_INCREMENT, cust_name c ...
- One Stage目标检测
在计算机视觉中,目标检测是一个难题.在大型项目中,首先需要先进行目标检测,得到对应类别和坐标后,才进行之后的各种分析.如人脸识别,通常是首先人脸检测,得到人脸的目标框,再对此目标框进行人脸识别.如果该 ...