本文内容来自蚁景网安课程。
服务端包含基本概念
何为SSI
SSI(Server Side Includes),是一种基于服务器端的网页制作技术。
SSI是嵌入HTML页面的指令,在页面被提供时由服务器进行运算,以对现有HTML页面动态生成的内容,而无需通过CGI程序提供其整个页面或使用其他动态技术。
SSI可以说是赋予HTML静态页面的动态效果,通过SSI执行命令,返回对应的结果。若在网站目录中发现.stm .shtm .shtml等,则该网站可能存在SSI注入漏洞。
SHTML文件
shtml文件(stm、shtm)就是应用了SSI技术的html文件。
SHTML特点
如果没有服务器包含指令就和普通HTML文件一样,如果有的话就需要服务器支持并开启服务器包含功能以便执行包含指令。
存在服务器包含指令的SHTML(或SHTM)文件与后端脚本语言无区别。
SSI指令
SSI指令基本格式:
<!--指令名称="指令参数"-->
显示服务端环境变量
本文档名称
<!--#echo var="DOCUMENT_NAME"-->
现在时间
<!--#echo var="DATE_LOCAL"-->
显示IP地址
<!--#echo var="REMOTE_ADDR"-->
直接执行服务器上的各种程序<#exec>
(如CGI或其他可执行程序)
<!--#exec cmd="文件名称"-->
<!--#exec cmd="cat /etc/password"-->
<!--#exec cgi="文件名称"-->
<!--#exec cgi="/cgi-bin/access_log.cgi"-->
将某一外部程序的输出插入到页面中。可插入CGI程序或者是常规应用程序的输入,这取决于使用的参数是cmd还是cgi。
补充说明
是HTML语法中表示注释,当WEB服务器不支持SSI时,会忽略这些信息。
#exec
是SSI指令之一。
cmd
为exec
的参数,cat /etc/passwd
为参数值,在本指令中指将要执行的命令。
<!--
与#
之间无空格,只有SSI指令与参数间存在空格。
服务端包含注入漏洞
何为SSI注入
SSI(Server-Side Includes Injection)。
在stm、shtm、shtml等Web页面中,如果用户可以从外部输入SSI标签,并且输入内容会显示到上述后缀的Web页面时,就导致可以远程在Web应用中注入脚本来执行代码。
即攻击者可以通过外部输入SSI标签到Web页面(stm、shtm、shtml文件)来动态执行代码。
前提条件
Web服务器支持并开启了SSI。
Web应用程序在返回HTML页面时,嵌入了用户输入的内容。
外部输入的参数值未进行有效的过滤。
漏洞场景
在stm、shtm、shtml等文件中,如果存在XSS,大概率也存在SSI注入漏洞(用户输入的内容会显示在页面中)。如果某页面存在反射型XSS漏洞,如果PayLoad不是XSS代码而是SSI标签,并且服务器开启了对SSI的支持,那么就会存在SSI漏洞。
服务端包含注入利用
利用上传
在测试任意文件上传漏洞时,目标服务端可能不允许上传.php
后缀的文件,可以尝试上传.shtml
文件。
修复方案
检查用户输入,禁止可能支持SSI的模式或字符。
因为SSI会带来许多安全风险,不建议在Web站点中使用SSI,即关闭服务器对SSI的支持。