D^3CTF
MISC
Baldur’s Gate 3 Complete Spell List
附件是json文件,里面全是法术名称
猜测先将法术名都提取出来,每一对{}为一行,不同的法术名用#分割
1 |
|
得到
将每个法术名都转化为对应的等级,这边用到了网页的爬虫
1 |
|
得到
可以看到是1-9的范围,想到可能是9进制,将每个数字都-1,然后转ascii
1 |
|
去将后面的base64解密
得到flag图片地址,去访问
Baldur’s Gate 3 Comlete Spell List
扫码得到flag
d3ctf{y0u_are_spells_m4ster}
WEB
d3pythonhttp
源代码审计,发现有后门,先进入
1 |
|
首先要绕过
1 |
|
找到具体的验证token的函数
1 |
|
关键是key是通过访问文件接收的,只要访问的文件不存在,那么key就是空,这时候就不用key加密jwt了,在线加密jwt,得到eyJhbGciOiJIUzI1NiIsImtpZCI6ImZyb250ZW5kIiwidHlwIjoiSldUIn0.eyJ1c2VybmFtZSI6InNhIiwiaXNhZG1pbiI6dHJ1ZX0.YjSeqw_-Mw5gUnoawx6NDz6DaVAulbNFOwZBgAGUEE4
第二步绕过前后端的差异
1 |
|
其中后端又复制了前端的请求头
1 |
|
其实Transfer-Encoding和Content-Length均存在的时候是以Transfer-Encoding编码方式为准,当Transfer-Encoding字段不能被解析的时候就看Content-Length,又因为前端可以解析大写的chunked,后端不行,利用这一点,我们传数据的时候用Transfer-Encoding:Chunked加上对应的Content-Length字段,使传给前端的数据是完整的数据,传给后端的只是Content-Length字段长度的数据
最后一步是pickle反序列化,因为不能出网和返回结果,我们写马,利用
1 |
|
去得到回显的数据,得到pickle反序列化脚本
1 |
|
这个脚本中的payload的意思是,会将后端的/路由重导到test函数中,传入cmd参数就可以命令执行了。
完整的发包
去访问/backend路由,传入cmd参数就可以命令执行了
stack_overflow
1 |
|
分析一下源代码,是模拟了一个栈的操作,看到了eval函数,我们关键是要将注入代码让eval执行,分析代码逻辑之后发现,read方法能读取28个,但是栈中初始的0只有20个,刚好覆盖掉[[short - 3]],而本来[[short - 3]]是被送到eval里去执行的
现在利用栈溢出将[[short - 3]]改成js的代码执行就可以了,加\n是为了绕过下面waf中的正则匹配
1 |
|