[CISCN2019 华东南赛区]Web4
我们点击链接,它会弹出一个百度的页面
观察url,我们考虑ssrf,分别试一下url=/etc/passwd
url=file:///etc/passwd
url=local_file:etc/passwd
,发现file:
回应了nohack
,另外两个打开了文件。
我们访问/app/app.py
发现了一串代码,我们审计代码
如果username为fuck时,才能拿到flag,username在session中,用burp抓个包,访问/flag
1 | import re, random, uuid, urllib |
可以看到session中加密的内容,通过.隔开的3段内容,第一段其实就是base64 encode后的内容,但去掉了填充用的等号,若decode失败,自己需要补上1-3个等号补全。中间内容为时间戳,在flask中时间戳若超过31天则视为无效。最后一段则是安全签名,将sessiondata,时间戳,和flask的secretkey通过sha1运算的结果。
通过base64解码可以得到前面的内容是{“username”:{“ b”:“d3d3LWRhdGE=”},其中d3d3LWRhdGE=是www-data的base64编码,从源码中也可以看出来,然后源码中可以看到Secre_Key的生成方式,其中用于生成伪随机数seed的函数uuid.getnode(),用来获取Mac地址并且将其转换为整数,那么需要我们先读取Mac地址,read?url=/sys/class/net/eth0/address,读取到mac地址为5e:29:a4:8d:4b:1f
1 | random.seed(uuid.getnode()) |
然后可以编写脚本获得Secre_Key,需要在python2下运行因为生成的位数会不一样,得到结果为187.158318454
1 | import random |
然后便可以利用以下脚本伪造session了
1 | #!/usr/bin/env python3 |
eyJ1c2VybmFtZSI6eyIgYiI6IlpuVmphdz09In19.ZtmrCw.bLaAGZHj-EsZu-pT8YmMKRb7Ils
然后伪造session
提交,访问/flag得到flag