[SCTF2019]Flag Shop (RUBY模板注入)

news2025/1/11 9:56:17

打开界面发现一个通过金钱来获得flag的,然后点击work或增加金钱但都是个位数

首先想了一下如果做一个脚本一直点击work不就好了吗,但是又想了一下服务器响应太快也不行,如果设置sleep那时间太长了

然后换一个思路,burp抓包看了一下,

发现了里面三段中间用.链接,妥妥的jwt形式, 

直接修改会报错,所以我们现在需要密钥secret,到这里没什么提示了,dirsearch扫一下发现了robots.txt, 

然后访问目录

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 do
  enable :logging
  file = File.new(File.dirname(__FILE__) + '/../log/http.log',"a+")
  file.sync = true
  use Rack::CommonLogger, file
end

get "/" do
  redirect '/shop', 302
end

get "/filebak" do
  content_type :text
  erb IO.binread __FILE__
end

get "/api/auth" do
  payload = { uid: SecureRandom.uuid , jkl: 20}
  auth = JWT.encode payload,ENV["SECRET"] , 'HS256'
  cookies[:auth] = auth
end

get "/api/info" do
  islogin
  auth = JWT.decode cookies[:auth],ENV["SECRET"] , true, { algorithm: 'HS256' }
  json({uid: auth[0]["uid"],jkl: auth[0]["jkl"]})
end

get "/shop" do
  erb :shop
end

get "/work" do
  islogin
  auth = 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"]
    end
  end

  if params[:do] == "#{params[:name][0,7]} is working" then

    auth["jkl"] = auth["jkl"].to_i + SecureRandom.random_number(10)
    auth = JWT.encode auth,ENV["SECRET"] , 'HS256'
    cookies[:auth] = auth
    ERB::new("<script>alert('#{params[:name][0,7]} working successfully!')</script>").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

发现了很长的一段代码,呃呃呃没见过的样子,百度发现是Ruby的语法

这道题就用到了Ruby模板注入,我们要通过<%=%>进行模板注入

 if params[:do] == "#{params[:name][0,7]} is working" then

    auth["jkl"] = auth["jkl"].to_i + SecureRandom.random_number(10)
    auth = JWT.encode auth,ENV["SECRET"] , 'HS256'
    cookies[:auth] = auth
    ERB::new("<script>alert('#{params[:name][0,7]} working successfully!')</script>").result

这里需要do和name相等,然后回alert弹出

然后<%=%>模板注入七个字符已经五个了

然后我们需要查找匹配前的内容, 然后查看运行到这方面之前的模式

get "/work" do
  islogin
  auth = 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"]
    end

 SECRET不为空所以需要传入一个值,这个预定义字符的作用是将匹配之后的字符进行返回

/work?SECRET=&name=<%=$'%>&do=<%=$'%> is working

直接使用不行,需要用16进制进行加密

改完之后发现还是不对

解码里面只有uid和金额,苦苦不得解

最后发现下面还有代码需要post请求,/shop目录下 进行比较>值就输出

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

 

 解码获得flag

参考链接:

【技术分享】手把手教你如何完成Ruby ERB模板注入-安全客 - 安全资讯平台

Ruby全局变量汇总_zdq0394的博客-CSDN博客

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络技术基础测试(一)

在一般布线中双绞线最长不可超过&#xff1a;100米网络拓扑图中路由器的图形为&#xff1a; Pv4地址由哪俩部分组成&#xff1a;网段地址和主机地址查询DNS域名信息的CMD命令为&#xff1a;NSLOOKUP关于局域网交换机&#xff0c;描述错误的是&#xff1a;用户可以有不同权限某…

Linux 性能分析工具大全

出于对Linux操作系统的兴趣&#xff0c;以及对底层知识的强烈欲望&#xff0c;因此整理了这篇文章。本文也可以作为检验基础知识的指标&#xff0c;另外文章涵盖了一个系统的方方面面。如果没有完善的计算机系统知识&#xff0c;网络知识和操作系统知识&#xff0c;文档中的工具…

12月编程语言排行榜公布!C+首超 Java

前言 日前&#xff0c;全球知名TIOBE编程语言社区发布了12月编程语言排行榜&#xff0c;有哪些新变化&#xff1f; C 首超 Java 和上个月相比&#xff0c;12 月榜单中最大的变化莫过于 C 以 0.12% 微弱的优势&#xff0c;凭借 11.94% 的市场份额首次超过了 11.82% 的 Java。…

重磅!阿里巴巴三入Java 全球管理组织执行委员会 龙蜥拥抱上游开源生态

近日&#xff0c;Java 全球管理组织 Java Community Process&#xff08;以下简称 JCP&#xff09;经过公平公正的投票&#xff0c;披露了入选最高执行委员会的成员名单&#xff0c;阿里巴巴作为唯一中国代表实现第三次连任。作为龙蜥社区理事长单位&#xff0c;阿里巴巴的此次…

“双重主要上市”潮流来袭,中通快递“赶时髦”意欲何为?

“双重主要上市”的风今年悄然在资本市场刮起。 7月26日&#xff0c;阿里巴巴申请将香港新增为主要上市地&#xff0c;7月27日&#xff0c;雷军的金山云递交了港股双重主要上市申请&#xff0c;据不完全统计&#xff0c;已有贝壳、小鹏、理想、知乎、B站等9家中概股公司&#…

20 个基础实用的 JavaScript 技巧

1.确定对象的数据类型 function myType(type) { return Object.prototype.toString.call(type).slice(8, -1); 使用Object.prototype.toString&#xff0c;通过传入不同类型的判断返回不同的判断函数&#xff0c;一行代码&#xff0c;简洁优雅灵活&#xff1b; 2.循环遍历数…

HylicOS --- 内存抽象

HylicOS已经完成了部分硬件抽象层的工作&#xff0c;包括MMU的初始化并对虚拟内存到物理内存做了映射&#xff0c;创建了页表目录。对串口进行了初始化&#xff0c;实现了printk格式化打印函数&#xff0c;方便了日志输出和程序调试。建立了异常向量表。 现在要做的是内存管理…

复方一枝蒿复合磷脂/IgG二性霉素B/阿糖胞苷修饰载甲氨喋呤/酶促合成半乳糖配体脂质体制备

小编今天为大家分享的科研知识是复方一枝蒿复合磷脂/IgG二性霉素B/阿糖胞苷修饰载甲氨喋呤/酶促合成半乳糖配体脂质体&#xff0c;一起来看&#xff01; 点击输入图片描述&#xff08;最多30字&#xff09; 复方一枝蒿复合磷脂脂质体&#xff1a; 采用硫酸铵梯度法制备复方一枝…

gunicorn走私漏洞

gunicorn走私漏洞 源码&#xff1a;https://github.com/benoitc/gunicorn漏洞定位&#xff1a;https://github.com/benoitc/gunicorn/blob/20.x/gunicorn/http/message.py#142 漏洞分析 只要header里面存在Sec-Websocket-Key1 那么就将content_length强制赋值为8 比较简单直接…

【java】java JSR 269 自定义注解实战 Lombok @Data注解

1.概述 本节会演示一个实际的例子,使用JSR 269 API为类中的字段自动生成get、set 方法。首先定义一个自定义注解类Data,如下所示。 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import

智能工业之数据采集

现状 工业物联网飞速发展&#xff0c;但是相对于实时IT技术还是明显滞后的。个人理解&#xff0c;有两点原因&#xff1a;一是因为涉及的知识面也比较广&#xff0c;工业物联网开发成本比较高&#xff0c;不像做一个纯软件的管理系统&#xff0c;坐在电脑前借助开源框架就能完成…

你好,Ultrachess 里程碑更新了。

Cartesi Labs 资助的完全去中心化国际象棋项目即将来到你的面前。在10月&#xff0c;我们宣布了第一个由Cartesi Rollup 技术支持的完全链上国际象棋应用程序Ultrachess。Ultrachess允许用户将真正的价值放在赌注上&#xff0c;并在下棋时考虑的不仅仅是他们的隐藏分值。此外&…

Java中的StringBuilder类

目录 一、介绍 二、StringBuilder类的体系图 三、StringBuilder的常用方法 四、String、StringBuffer和StringBuilder比较 1、效率比较 2、如何选择&#xff1f; 一、介绍 StringBuilder也是lang包中的类&#xff0c;即java.lang.StringBuilder类。它也是一个可变的字符序…

设计模式原则-三-依赖倒转原则

设计模式原则---依赖倒转原则依赖倒转原则一 官方定义基本介绍二 案例演示普通方式实现**解决方案****案例分析****案例总结**依赖倒转原则方式实现**解决方案**案例分析**案例总结**注意事项&细节三 依赖关系传递方式一、通过接口传递二、通过构造方法传递三、通过set()方…

原来 Android 的 R 文件里还有这么多道道

前言 nonTransitiveRClass&#xff1a;非传递性 R 类的属性&#xff0c;在 gradle.properties 文件里使用。 不少开发者可能听过它&#xff0c;但了解可能仅限于是对 R 文件做了优化&#xff0c;甚至以为它可以解决资源冲突&#xff01;但它到底做了什么优化、能否解决资源冲突…

Manacher算法

0、概括 Manacher算法用于求解字符串中最长回文子串问题。 Manacher算法的核心&#xff1a; 理解回文半径数组&#xff1b;理解所有中心的回文最右边界 R&#xff0c;和取得 R 时的中心点 C&#xff1b;理解 L...(i)...C...(i)...R 的结构&#xff0c;以及根据 i′ii′ 回文长…

C-RNN-GAN:具有对抗训练的连续循环神经网络2016--生成音乐

C-RNN-GAN: Continuous recurrent neural networks with adversarial training 2016 Abstract 生成对抗网络已被提出作为一种有效训练深度生成神经网络的方法。我们提出了一种生成对抗模型&#xff0c;它适用于连续的序列数据&#xff0c;并通过在古典音乐集合上训练它来应用它…

计算机毕设Python+Vue校园学生体温管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

相见恨晚,Git这些功能太好用了

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 作为一名开发者&#xff0c;想必绝大多数同学都无法绕开Git。 作为一款工具&#xff0c;我认为它和word、powerpoint、Excel这些办公工具一样。 对于一部分同学&#xff0c;会一些基本的用法&#x…

【经验帖】项目经理的核心价值:以目标为导向做正确的事

项目经理小李的年终汇报心路历程&#xff08;心情犹如坐过山车&#xff0c;起起落落最后一蹶不振。&#xff09; 汇报前&#xff1a; 终于到年终汇报的日子了&#xff0c;毕竟我负责的项目任务从来没有延期过&#xff0c;都是按时完成&#xff0c;这次肯定得加薪了&#xff01…