CTF Web安全

[CISCN2019 华北赛区 Day1 Web2]ikun(python反序列化)

Posted on 2020-02-12,2 min read

进入主页。就说要买V6


根据特征。V6图片地址为/static/img/lv/lv6.png
那么我们用脚本遍历page。然后判断返回内容中是否有V6的图片地址

import requests
for i in range(200):
    url='http://70a35b89-8044-4dd2-8a10-f6c98daa9a70.node3.buuoj.cn/shop?page='+str(i)
    result=requests.get(url).text
    if '/static/img/lv/lv6.png' in result:
        print (url)

得到结果。181页。购买

可以看到。这里有两个变量可控。一个是钱。一个是折扣。我们只有1000。
修改尝试修改钱/折扣来买V6
修改钱时。会提示操作失败

修改折扣为0.00000000001。302跳转b1g_m4mber

只允许admin访问。看下cookie。有jwt头

遇到jwt。一般就是ssti拿密钥。或者爆破
这里试下爆破。得到密钥1Kun
'
修改JWT为admin

得到web源码

在sshop/views/admin.py发现一个反序列化漏洞

python反序列化漏洞和PHP反序列化不一样。
php反序列化必须是存在一个类。序列化可以修改类中的值造成一定危害。如果类中没有什么危险函数。那么修改了类中的值危害也有限。
python反序列化通过__reduce__可以重构对象。比如

class Person(object):
    def __init__(self,username,password):
        self.username = username 
        self.password = password 
    def __reduce__(self):
        return (os.system, ('whoami',))

这个__reduce__魔术方法会在反序列化的时候改变对象。也就是php中unserialize()触发
python序列化和两个函数有关。
cPickle.dumps()
#序列化
cPickle.loads()
#反序列化

参考文章:https://www.jianshu.com/p/061d2c594d97
将上图中的URL编码的exp。通过POST become参数发送。拿到flag

下一篇: [网鼎杯 2018]Comment(Git恢复+二次注入)→