一、SSI(服务端包含)简介
1、SSI(服务端包含)简介
SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。
SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。
SSI工作原理:将内容发送到浏览器之前,可以使用“服务器端包含 (SSI)”指令将文本、图形或应用程序信息包含到网页中。
基本指令:
<!-– 指令名称="指令参数"-->
1.显示服务器端环境变量<#echo>
2.将文本内容直接插入到文档中<#include>
3.显示WEB文档相关信息<#flastmod #fsize> (如文件制作日期/大小等)
4.直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序)
5.设置SSI信息显示格式<#config>(如文件制作日期/大小显示方式) 高级SSI<XSSI>可设置变量使用if条件语句。
2、SHTML简介
因为包含 SSI 指令的文件要求特殊处理,所以必须为所有 SSI 文件赋予 SSI文件扩展名。默认扩展名是 .stm、.shtm 和 .shtml。
SHTML是标准通用标记语言下的一个应用,包含有嵌入式服务器方包含命令的文本,在被传送给浏览器之前,服务器会对SHTML文档进行完全地读取、分析以及修改。以shtml命名的文件里,使用了ssi的一些指令,你可以在SHTML文件中写入SSI指令,当客户端访问这些shtml文件时,服务器端会把这些SHTML文件进行读取和解释,把SHTML文件中包含的SSI指令解释出来。
二、漏洞复现
当目标服务器满足以下条件时:
1、目标服务器开启了SSI与CGI支持;
2、服务器有上传或者用户输入页面且未对相关SSI关键字做过滤;
3、Web应用程序在返回响应的HTML页面时,嵌入用户输入;
4、未对输入的参数值进行输入过滤。
我们就可以上传shtml,并利用语法执行任意命令。
利用<!--#exec cmd="id" -->
语法执行命令。
访问上传的1.shtml文件即可看到命令得到了执行: