[SCTF2019]Flag Shop(jwt,Ruby)
我们通过页面可以发现,需要我们获得1000000000000000000000000000才能得到flag,我们考虑抓包
获得了一串jwt
我们进行解析
我们可以伪造jwt来获得钱,但我们不知道密钥是什么,我们再找找有没有其他的信息
我们查看robots.txt,获得了源码
1 | require 'sinatra' |
通过代码审计,我们可以知道这段代码是用Ruby编写的一个基本的Web应用程序,使用了Sinatra框架
由此我们可以想到ruby模块注入
注入点在/work
1 | if params[:do] == "#{params[:name][0,7]} is working" then |
我们只要满足了这个if params[:do] == "#{params[:name][0,7]} is working" then
,就会进行模板渲染
但是这题有长度的限制,除去<%=%>
,就只剩下2个字符可用了。可以用ruby的Ruby的预定义变量
我们利用$’,最后一次成功匹配右边的字符串
1 | <%=$'%> |
payload
1 | /work?SECRET=&name=<%=$'%>&do=<%=$'%> is working |
为什么需要SECRET参数,是为了可以搜索SECRET参数内容,然后是<%=$’%>返回最后一次匹配的字符串是我们的密钥
但我们不能直接传入,需要进行一次url编码
1 | ?SECRET=&name=%3C%25%3D%24%27%25%3E&do=%3C%25%3D%24%27%25%3E%20is%20working |
得到密钥
我们构造jwt
进行抓包上传
我们购买flag,进行抓包,将得到的jwt进行解密,就能得到flag了