SSI总结
SSI是”Server Side Includes”即服务器端包含。SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。
从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。
这么一听是不是很危险?能够直接控制服务器执行命令,太恐怖了。当然这么危险的东西常见的服务器中间件中是默认不开启的。
开启SSI
Nginx
找到Nginx的配置文件,在http段中加入下面几句即可:
ssi on;
ssi_silent_errors off;
ssi_types text/shtml;
Apache
找到Apache的配置文件,修改以下内容
- 加载ssl模组
找到ssl_module模组,把前面的#
号去掉
LoadModule ssl_module modules/mod_ssl.so
- 添加.shtml支持
找到以下两个,把前面的#
号去掉
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
- 添加INCLUDES
找到这一行:
Options +Indexes +FollowSymLinks +ExecCGI
在后面添加INCLUDES,如下面所示:
Options +Indexes +FollowSymLinks +ExecCGI +INCLUDES
这里nginx的我开启成功了,但是apache似乎不行??
SSI语法
首先,介绍下SHTML,在SHTML文件中使用SSI指令引用其他的html文件(#include
),此时服务器会将SHTML中包含的SSI指令解释,再传送给客户端,此时的HTML中就不再有SSI指令了。比如说框架是固定的,但是里面的文章,其他菜单等即可以用#include
引用进来。
注意:
1.<!--
与#号间无空格,只有SSI指令与参数间存在空格。
2.上面的标点=""
,一个也不能少。
3.SSI指令是大小写敏感的,因此参数必须是小写才会起作用。
显示服务器端环境变量echo
本文档名称:
<!--#echo var="DOCUMENT_NAME"-->
现在时间:
<!--#echo var="DATE_LOCAL"-->
显示IP地址:
<!--#echo var="REMOTE_ADDR"-->
将文本内容直接插入到文档中include
file:给出到当前目录的相对路径,其中不能使用”../
“,也不能使用绝对路径
<!--#include file="index.html" -->
virtual:给出到服务器端某个文档的虚拟路径
<!--#include virtual="/www/footer.html" -->
注:file包含文件可以在同一级目录或其子目录中,但不能在上一级目录中,virtual包含文件可以是Web站点上的虚拟目录的完整路径
显示WEB文档相关信息
文件最近更新日期:
<!--#flastmod file="文件名称"-->
文件的长度:
<!--#fsize file="文件名称"-->
接执行服务器上的各种程序exec(如CGI或其他可执行程序)
cmd:常规应用程序
<!--#exec cmd="cat /etc/passwd"-->
cgi:CGI脚本程序
<!--#exec cgi="/cgi-bin/access_log.cgi"–>
将某一外部程序的输出插入到页面中。可插入CGI程序或者是常规应用程序的输入,这取决于使用的参数是cmd还是cgi。
修改SSI的默认设置
errmsg:设置默认的错误信息,该指令必须入在其它指令的前面
<!--#config errmsg="error!please email mamager!"-->
Timefmt:设置日期与时间的显示格式,需放在echo指令前
<!--#config timefmt="%A, %B %d, %Y"-->
<!--#echo var="last_modified"-->
Sizefmt:设置表示文件大小的单位。如bytes。该指令需要放在fsize指令前使用。
<!--#config sizefmt="bytes"-->
<!--#fsize file="head.html"-->
更多SSI的操作见:SSI指令
漏洞场景
在很多业务中,用户输入的内容会显示在页面中。比如,一个存在反射型XSS漏洞的页面,如果输入的payload不是XSS代码而是SSI的标签,同时服务器又开启了对SSI的支持的话就会存在SSI漏洞。
从定义中看出,页面中有一小部分是动态输出的时候使用SSI,比如:
- 文件相关的属性字段
- 当前时间
- 访客IP
- 调用CGI程序
利用条件:
- Web 服务器已支持SSI(服务器端包含)
- Web 应用程序未对对相关SSI关键字做过滤
- Web 应用程序在返回响应的HTML页面时,嵌入用户输入
example:
<?php
echo $_POST["data"];
后端将传入的数据直接不过滤就回显到前端中,输入:
<!--#echo var="DATE_LOCAL"-->
实现了SSI注入。