打省赛的时候遇到了,这里记录学习一下姿势
前言
这个漏洞是一个比较老的漏洞,因为今年的省赛遇到了,所以在这里记录学习一下。
关于SSI
SSI是英文”Server Side Includes”的缩写,翻译成中文就是服务器端包含的意思。
SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。
从技术角度上来说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。
启用SSI
示例:Nginx 配置SSI功能
在http段中加入下面几句即可:
1 | ssi on; |
默认Apache不开启SSI,SSI这种技术已经比较少用了。如果应用没有使用到SSI,关闭服务器对SSI的支持即可。
IIS和Apache都可以开启SSI功能,具体可参考:Apache、Nginx 服务配置服务器端包含(SSI)](http://m.jb51.net/article/25725.htm
SSI语法
config指令:用于修改SSI的默认设置
参数:errmsg
,timefmt
, sizefmt
errmsg:设置默认的错误信息,该指令必须入在其它指令的前面
eg:<!--#config errmsg="error!please email mamager!"-->
Timefmt:设置日期与时间的显示格式,需放在echo指令前
eg:<!--#config timefmt="%A, %B %d, %Y"-->
<!--#echo var="last_modified"-->
Sizefmt:设置表示文件大小的单位。如bytes。该指令需要放在fsize指令前使用。
eg:<!--#config sizefmt="bytes"-->
<!--#fsize file="head.html"-->
Include指令:用于将其它文档或元素包含在当前文档中
参数:virtual
,file
virtual:给出到服务器端某个文档的虚拟路径
eg:<!--include virtual="/includes/header.html"-->
file:给出到当前目录的相对路径,其中不能使用”../“,也不能使用绝对路径
eg:<!--include file="header.html"-->
这就要求每一个目录中都包含一个header.html文件。
exec指令:将某一外部程序的输出插入到页面中,执行CGI脚本或者shell命令
参数:cmd,cgi
cmd 常规应用程序:<!--#exec cmd="文件名称"-->
cgi CGI脚本程序:<!--#exec cgi="文件名称"-->
注意:这个指令相当方便,但是也存在安全问题。
echo:用于显示各种环境变量
参数:var
eg:<!--#config timefmt="%A,the %d of %B,in the year %Y"-->
<!--#echo var="DATE_LOCAL"-->
输出结果:Saturday, the 15 of April, in the year 2000
以下是常见的服务器变量
DOCUMENT_NAME
:显示当前文档的名称
DOCUMENT_URI
:显示当前文档的虚拟路径
QUERY_STRING_UNESCAPED
:显示未经转义处理的由客户端发送的查询字串,其中所有的特殊字符前面都有转义符”\
DATE_LOCAL
:显示服务器设定时区的日期和时间。用户可以结合config命令的timefmt参数,定制输出信息
DATE_GMT
:功能与DATE_LOCAL一样,只不过返回的是以格林尼治标准时间为基准的日期
LAST_MODIFIED
:显示当前文档的最后更新时间
除了SSI环境变量之外,echo命令还可以显示以下CGI环境变量
SERVER_SOFTWARE
:显示服务器软件的名称和版本
SERVER_NAME
:显示服务器的主机名称,DNS别名或IP地址
SERVER_PROTOCOL
:显示客户端请求所使用的协议名称和版本,如HTTP/1.0
SERVER_PORT
:显示服务器的响应端口
REQUEST_METHOD
:显示客户端的文档请求方法,包括GET, HEAD, 和POST
REMOTE_HOST
:显示发出请求信息的客户端主机名称
REMOTE_ADDR
:显示发出请求信息的客户端IP地址
AUTH_TYPE
:显示用户身份的验证方法
REMOTE_USER
:显示访问受保护页面的用户所使用的帐号名称
Fsize:显示指定文件的大小,可以结合config命令的sizefmt参数定制输出格式
参数:file
eg:<!--#fsize file="index_working.html"-->
Flastmod
显示指定文件的最后修改日期,可以结合config命令的timefmt参数控制输出格式
参数:file
eg:<!--#config timefmt="%A, the %d of %B, in the year %Y"-->
<!--#flastmod file="file.html"-->
XSSI(Extended SSI)
一组高级SSI指令,内置于Apache1.2或更高版本的mod-include模块之中。
#printenv:显示当前存在于WEB服务器环境中的所有环境变量。
语法:<!--#printenv-->
#set:可给变量赋值,以用于后面的if语句。
语法:<!--#set var="变量名" value="变量值"-->
eg:<!--#set var="color" value="red"-->
<!--#echo var="color"-->
#if:创建可以改变数据的页面,这些数据根据使用if语句时计算的要求予以显示。
语法:<!--#if expr="$变量名='变量值A'"-->
显示内容<!--#elif expr="$变量名='变量值B'"-->
显示内容<!--#else-->
显示内容<!--#endif-->
eg:<!--#if expr="$color='red'"-->
红色<!--#elif expr="$color='blue'"-->
蓝色<!--#else-->
黑色<!--#endif-->
SSI内置的变量
AUTH_TYPE
——针对用户的认证授权方式: BASIC , FORM , etc. 和 Tomcat 内的认证方式同步CONTENT_LENGTH
——从服务器表单传过来的数据长度,字符数目或者数据的字节数CONTENT_TYPE
——服务器访问呢数据的 MIME 类型,比如“ text/html ”DATE_GMT
——目前的时间格式方式使用 GMTDATE_LOCAL
——目前的时间格式方式设置成为本地时间格式DOCUMENT_NAME
——当前上下文环境的文件地址DOCUMENT_URI
——虚拟路径定义的文件地址GATEWAY_INTERFACE
—— CGI 的版本定义:“ CGI/1.1 ”HTTP_ACCEPT
——一个客户端可以接受的 MIME 类型列表HTTP_ACCEPT_ENCODING
——客户端可以接受的压缩文件类型的列表HTTP_ACCEPT_LANGUAGE
——客户端可以支持的语言列表HTTP_CONNECTION
——管理客户端的连接:是“ Close ”还是“ Keep-Alive ”HTTP_HOST
——客户端请求的站点地址HTTP_REFERER
——客户端请求之前所在的 URL 地址HTTP_USER_AGENT
——客户使用的浏览器端的请求结果LAST_MODIFIED
——当前页面上一次访问和修改的时间PATH_INFO
——访问此 Servlet 的路径信息PATH_TRANSLATED
—— PATH_INFO 提供的 translated 版本QUERY_STRING
——在 URL 地址 ? 之后的请求参数列表QUERY_STRING_D
——没有经过编码过的请求参数REMOTE_ADDR
——用户请求客户端 IP 地址REMOTE_HOST
——用户发送请求的主机名REMOTE_PORT
——用户发送请求的端口号REMOTE_USER
——认证授权需要的发送请求的用户名REQUEST_METHOD
——请求使用方法: GET 或者 POSTREQUEST_URI
——客户端原来访问请求的 Web 页面的 URI 地址SCRIPT_FILENAME
——在服务器上当前页面的地址SCRIPT_NAME
——当前页面的名称SERVER_ADDR
——服务器所在的 IP 地址SERVER_NAME
——服务器的主机名或者 IP 地址SERVER_PORT
——服务器接受请求的端口号SERVER_PROTOCOL
——服务器处理请求的协议:“ HTTP/1.1 ”SERVER_SOFTWARE
——服务器响应客户端请求的名称和版本号
SSI中日期格式的定义
%a
一周七天的缩写形式 Thu%A
一周七天 Thursday%b
月的缩写形式 Apr%B
月 April%d
一个月内的第几天 13%D
mm/dd/yy日期格式 04/13/00%H
小时(24小时制,从00到23) 01%I
小时(12小时制,从00到11) 01%j
一年内的第几天,从01到365 104%m
一年内的第几个月,从01到12 04%M
一小时内的第几分钟,从00到59 10%p
AM或PM AM%r
12小时制的当地时间,格式为 01:10:18 AM%S
一分钟内的第几秒,从00到59 18%T
24小时制的%H:%M:%S时间格式 01:10:18%U
一年内的第几个星期,从00到52,以星期天作为每个星期的第一天%w
一星期内的第一天,从0到6 4%W
一年内的第几个星期,从00到 53,以星期一作为每个星期的第一天%y
年的缩写形式,从00到99 00%Y
用四位数字表示一年 2000%Z
时区名称
SSI漏洞产生的条件
用户存在可控输入,并且未过滤,并且还能回显嵌入到html中,如其中一条
1 | <!--#exec cmd=""...""-->(会执行给定的 shell 命令) |
如果没有过滤吧<!#–
等敏感字符,就会造成系统命令执行,
通常存在XSS的地方如果开启了SSI服务,那么就会造成服务器注入
1 | <!--#include file=""...""-->(会显示给定的文件) |
但感觉这个漏洞在目前的状况来说就是绝迹了,因为apache和nginx都默认关闭了ssi,就算开启了ssi,也不一定有开启回显的,除非有哪个程序员真的自己作死,😂
SSI防护
- 关闭服务器SSI功能
- 过滤相关SSI特殊字符(
<,>,#,-,",'
)