0x00漏洞描述
SSI 英文是 Server Side Includes
的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI 就是在 HTML 文件中,可以通过注入注释调用的命令或指针。SSI 具有强大的功能,只要使用一条简单的 SSI 命令就可以实现整个网站的内容更新
,时间和日期的动态显示,以及执行 shell 和 CGI 脚本程序等复杂的功能。SSI 可以称得上是那些资金短缺、时间紧张、工作量大的网站开发人员的最佳帮手。
服务器端包含提供了一种对现有 HTML 文档增加动态内容的方法。Apache 和 IIS 都可以通过配置支持 SSI,在网页内容被返回给用户之前,服务器会执行网页内容中的 SSI 标签
。在很多场景中,用户输入的内容可以显示在页面中,比如一个存在反射 XSS 漏洞的页面,如果输入的 payload 不是 XSS 代码而是 SSI 标签,服务器又开启了 SSI 支持的话就会存在 SSI 漏洞。
0x01检测条件
1、Web 服务器已支持 SSI。
2、Web 应用程序在返回 HTML 页面时,嵌入用户输入。
3、参数值未进行输入清理。
0x02检测方法
①、黑盒测试
通过信息收集技术,了解我们的检测目标运行哪些类型的 Web 服务器,查看检测网站的内容来猜测是否支持 SSI,由于 .shtml 文件后缀名是用来表明网页文件是否包含 SSI 指令的,因此如果该网站使用了 .shtml 文件,那说明该网站支持 SSI 指令。然而 .shtml 后缀并非强制规定的,因此如果没有发现任何 .shtml 文件,并不意味目标网站没有 SSI 注入漏洞。
接下来的步骤就是是否可以进行 SSI 注入攻击,还有恶意代码的注入点。我们需要找到运行用户输入的每一个页面,并确认应用程序是否正确验证了所提交的输入,反之则确认是否存在按输入原样显示的数据(如错误信息、论坛发帖等)。除了常见的用户提供的数据外,还要考虑 HTTP 请求头
和 Cookie
内容。
示例:
GET/HTTP/1.0
Referer:<!--#exec cmd="/bin/psax"-->
User-Agent: <!--#virtualinclude="/proc/version"-->
②、白盒测试
1、是否使用 SSI 指令,如果使用,则 Web 服务器就启动了 SSI 支持。这就导致 SSI 注入至少成为需要调查的潜在问题;
2、用户输入、Cookie 内容和 HTTP 标题头在哪里处理;
3、如何处理输入、使用什么样的过滤方式、应用程序不允许什么样的字符通过、考虑了多少种编码方式。使用 grep 执行这些步骤,找到源代码中的正确关键字(SSI 指令、CGI 环境变量、涉及用户输入的变量任务、过滤函数等等)。
0x03案例演示
buuctf 的题目:[BJDCTF2020]EasySearch 1
具体可看 CSDN 文章:渗透测试练习题解析 7 (CTF web)第一题
文章内容支持 .shtml、按输入原样输出,种种迹象表明该网站存在 SSI 注入漏洞,那么我们在 username 文本框中输入恶意代码
<!--#exec cmd="id" -->
还可以利用 SSI 注入执行反弹 Shell
0x04防御方法
1、清除用户输入,禁止可能支持 SSI 的模式
2、过滤敏感字符,比如( <
, >
, #
, -
, "
, '
)