首先有个提示要买到lv6 写脚本跑一下
1 | import requests |
在第181页 lv6
价格太贵了买不起抓包改包 改discoount的值
到达新世界但是要admin权限 然后就不会了 ╮(╯▽╰)╭
看别的大佬的文章 需要伪造jwt 那么什么是jwt
https://www.cnblogs.com/cjsblog/p/9277677.html
https://jwt.io/ 用来查看jwt包含的信息 jwt的官网
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjEyMyJ9.t_quUTD2cAx9tGvCi1tmfSmgP_z_hr2N8lx_Ij5bh78
需要将username改为admin 但是后面的部分需要破解key sha256的加密算法
得破解一下 工具:https://github.com/brendan-rius/c-jwt-cracker
生成一下新的jwt
成功进入新页面查看源码发现新的页面然后页面的源码可以下载下来了
题目这边提示pickle
1 | pickle或cPickle,作用和PHP的serialize与unserialize一样,两者只是实现的语言不同 |
1 | #序列化 |
讲解pickle反序列化漏洞的文章https://blog.csdn.net/qq_43431158/article/details/108919605
1 | setting.py那边有个hint 一串Unicode 解码一下 |
刚才lv6购买后那边提示要admin权限那可能在一个叫做admin的文件里面
admin.py 里面发现了pickle
1 | self.render('form.html', res=p, member=1) |
意思是找到模板文件进行渲染然后显示画面
看一下form.html
传入可以直接回显并将自定义的类进行序列化和反序列化,存在pickle反序列化漏洞,可以构造一个pickle.dumps序列化payload,从而被解析读取东西
payload构造使用_ ruduce _(self)需要先获取flag的位置后进行读取
os.system 调用系统命令完成后退出返回结果是命令行执行状态一般是0
os.popen() 无法进行读取程序执行的返回值
这俩只能print输出是才有回显,以return返回没有回显
使用commands.getoutput()这个函数来进行代替
1 | # coding=utf8 |
跑得ccommands%0Agetoutput%0Ap0%0A%28S%27ls%20/%27%0Ap1%0Atp2%0ARp3%0A.
然后发包
flag在flag.txt
(‘ls /‘,)->(‘cat /flag.txt’)
就好了