web做题日记之反序列化喵
[TOC]
1.0喵喵喵
1 |
|
审计代码ing➡
三个类:Modifier、Show、Test
因为要执行system(“whoami”) ,那么Test类肯定是链条终点
Modifier为链条起点(存在__destruct()函数,因为__desatruct()函数可以自动运行),存在一个变量var,存在echo $this->var;
Show类中的__toString()函数需要当Show类里的变量被打印的时候才会触发,触发后会调用$this->source里的action()
要从Modifier到Test,那么中间量就是Show,即show为跳板
思路➡
先把$var赋值为一个Show里的对象,运行结束之后__desatruct()触发echo $this->var;➡
到Show类里去触发$this->source->action()➡
再事先将Show类里的$source赋值为Test的对象➡
最后转到Test运行system($this->p);
代码如下:
1 |
|
2.0喵喵喵喵
1 |
|
继续审计X_X➡
四个类:EasyStart、MediumJump、HardGet、Sink
EasyStart类,看到__destruct()函数,作为POP链起点
要执行的system('whoami')出现在Sink类里,Sink作为链条终点
依旧将**$var变量设为MediumJump类的对象**,触发toString()
然后将$b设为HardGet的对象,因为HardGet里面根本没有$secret这个属性,所以会触发__get(),访问了$name这个变量。
所以我们再将$c这个变量设为Sink的对象,就把火引导了Sink里,最终执行whoami
接下来写代码➡
1 |
|
3.0喵喵
题目:
1 |
|
审计POP➡(微丝)
类UserProfile为起点,Executor为终点执行eval函数,Logger为中间踏板
通过触发__get函数达到触发Executor中__invoke来执行eval的目的
因此考虑将Executor对象设为Logger的$this->handler
再将Logger 对象设为$this->username即可触发这段链条
再因为没有unserialize(),考虑phar反序列化
编写➡
1 |
|
🤔,换汤不换药了说是……
本来是想找phar反序列化的题做做来着,也是没找到……😓,所以去做反序列化的题目了
4.0 ctfshow-web259
题目:
and
依旧审计ing➡
先看index.php:
直接对$vip变量进行反序列化,然后执行$vip->getFlag(),但是根本没有看到这个方法,
所以要去考虑PHP内置的类,即SoapClient,因为SoapClient里有一个函数叫__call,当调用类里不存在的方法就会触发
然后__call就会发送HTTP POST请求到指定的location(SSRF)
再看flag.php:
首先检查了X-Forwarded-For
然后需要POST token=ctfshow
我们来编写一下代码➡
1 |
|
好吧,做一半寄了,没学会SSRF,太坏了,这道题回头学完了SSRF补上X_X
5.0 ctfshow-web260
题目:
1 |
|
审计ing➡
GET传参并对其进行序列化,出现ctfshow_i_love_36D就给出flag
编写代码➡
好的,你是不是要编码写代码了,好的,你个傻蛋你上当了(好的我要嘲笑你了)
只要参数中存在ctfshow_i_love_36D就行了(构造类也行其实…)
6.0 ctfshow-web261
题目:
1 |
|
严肃审计➡
__wakeup()函数里面$username和$password有一个不为空,就触发die
butbutbut,在 PHP 7.4+ 中,如果类中同时定义了 __unserialize 和 __wakeup,反序列化时只会执行 __unserialize,而完全无视 __wakeup
然后捏,有一个弱比较,如果$code和0x36d(十进制为877)相等,在__unserialize里,code被赋值为$username . $password
因此,如果我们将$username写为877.php,拼接后的字符串在进行弱比较时会强制转换为877,刚好相等
然后file_put_contents($this->username, $this->password)写入任意文件,我们考虑让 $this->username 变成文件名,再让 $this->password 变成一句话木马
严肃编写代码➡
绷不住了写不下去了,严肃昏迷
1 |
|
得到O%3A10%3A%22ctfshowvip%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A9%3A%22877aa.php%22%3Bs%3A8%3A%22password%22%3Bs%3A26%3A%22%3C%3Fphp+%40eval%28%24_POST%5B1%5D%29%3B+%3F%3E%22%3Bs%3A4%3A%22code%22%3BN%3B%7D
访问http://题目地址/index.php?vip=O%3A10%3A%22ctfshowvip%22%3A3%3A%7Bs%3A8%3A%22username%22%3Bs%3A9%3A%22877aa.php%22%3Bs%3A8%3A%22password%22%3Bs%3A26%3A%22%3C%3Fphp+%40eval%28%24_POST%5B1%5D%29%3B+%3F%3E%22%3Bs%3A4%3A%22code%22%3BN%3B%7D,将恶意文件877aa.php写入(忘记截屏了,题目地址是啥忘了喵…)
没有报错就是成功了
再访问http://题目地址/877aa.php(因为一句话木马写在这里)
POST传参即可
这里先看的ls
然后找的根目录,最后得到flag
tac一下喵
7.0 cttfshow-web265
题目:
1 |
|
审计一下➡
存在一个类:ctfshowAdmimn
要得到flag,就要使得$ctfshow->login()结果为True,即$token和$password强等于
从 URL 的 GET 参数 ctfshow 中读取字符串,并通过反序列化将其还原成一个 ctfshowAdmin 对象,但是存在$ctfshow->token=md5(mt_rand());使得$token完全随机
思路➡
考虑PHP引用,如果$password不是$token的副本,而是$token的引用(&),那么$password和$token绑定,MD5值相同
编写代码➡
1 |
|
序列化得到O%3A12%3A%22ctfshowAdmin%22%3A2%3A%7Bs%3A5%3A%22token%22%3BN%3Bs%3A8%3A%22password%22%3BR%3A2%3B%7D
然后GET传参得到flag
8.0 ctfshow-web266
题目:
1 |
|
依旧审计➡
首先看见php://input,选择POST传参
还是强等于,这里没有随机了,所以直接让$username和$password相等即可
只是多了一个对ctfshow的过滤,这里考虑大小写绕过,因为PHP类名不区分大小写
编写代码➡
1 |
|
得到payload
O:7:"CTFSHOW":2:{s:8:"username";s:5:"admin";s:8:"password";s:5:"admin";}
直接hackbar post进去就可以(阿巴阿巴……不知道为什么出不来flag,可恶喵,步骤是没有问题的…)
Leave a comment