2.12 浅谈SSI和SSTI漏洞

一.SSI漏洞解析

1.原理

现在大多数Web服务很少用到SSI,但是还是有有必要了解一下。
SSI全称是Server Side Includes,即服务器端包含,是一种基于服务器端的网页制作技术。

SSI是嵌入HTML页面中的指令,在页面被提供时由服务器进行运算,以对现有HTML页面增加动态生成的内容,而无须通过CGI程序提供其整个页面,或者使用其他动态技术。

基本原理就是:SSI在HTML文件中,可以通过注释行调用命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。

SSI漏洞存在于shtml,stm,shtm文件中,就是应用ssi技术的html文件,当我在这个页面加入ssi指令后,服务器开始解析,将文件图片包含或者远程执行命令。


2.开启ssi

(1)Nginx

在配置文件中添加如下几项:

1
2
3
ssi on;
ssi_silent_errors off;
ssi_types text/shtml;

(2)Apache

修改Apache配置文件httpd.conf:

  • 确认加载include.so模块,将注释去掉:
    1
    LoadModule include_module libexec/apache2/mod_include.so
  • AddType部分去掉这两段注释:

    1
    2
    3

    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
  • Directory目录权限里面找到Options Indexes FollowSymLinks,并增加Includes修改为Options Indexes FollowSymLinks Includes;

  • 重新启动Apache;


3.SSI基本语法:

其语法格式必须是以html的注释符 <!– 开头、且后面紧接#符号和SSI命令,它们期间不能存在空格:

  • 显示服务器端环境变量 <#echo>

    1
    2
    3
    本文档名称:<!--#echo var="DOCUMENT_NAME"-->
    现在时间:<!--#echo var="DATE_LOCAL"-->
    显示IP地址:<!--#echo var="REMOTE_ADDR"-->
  • 将文本内容直接插入到文档中<#include>

    1
    2
    3
    4
    <!--#include file="文件名称"-->
    <!--#include virtual="index.html" -->
    <!--#include virtual="文件名称"–>
    <!--#include virtual="/www/footer.html" -->

    注:file包含文件可以在同一级目录或其子目录中,但不能在上一级目录中,virtual包含文件可以是Web站点上的虚拟目录的完整路径。

  • 直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序)

    1
    2
    3
    4
    <!--#exec cmd="命令"-->
    <!--#exec cmd="cat /etc/passwd"-->
    <!--#exec cgi="文件名称"-->
    <!--#exec cgi="/cgi-bin/access_log.cgi"-->

4.SSI注入漏洞

(1)如何利用

简单点说就是攻击者可以通过外部输入SSI标签到Web页面(stm、shtm、shtml文件)来动态执行代码。
SSI注入允许远程在Web应用中注入脚本来执行代码。
简单点说就是攻击者可以通过外部输入SSI语句到Web页面来动态执行代码。

一般地,在stm、shtm、shtml等文件中,存在XSS的页面,大概率是存在SSI注入漏洞的。
也就是说,用户输入的内容会显示在页面中的场景。
比如,一个存在反射型XSS漏洞的页面,如果输入的payload不是XSS代码而是SSI的标签,同时服务器又开启了对SSI的支持的话就会存在SSI注入漏洞。


(2)前提条件

攻击者要想进行SSI注入、在Web服务器上运行任意命令,需要满足下列几点前提条件才能成功:Web服务器支持并开启了SSI;
Web应用程序在返回HTML页面时,嵌入了用户输入的内容;
外部输入的参数值未进行有效的过滤;


参考博客
例题:BUUCTF [BJDCTF2020]EasySearch,BWAPP靶场的SSI注入漏洞。


二.SSTI漏洞

(1)原理

服务端模板注入是服务端接收了用户的输入,将其作为 Web 应用模板内容的一部分,在进行目标编译渲染的过程中,执行了用户插入的恶意内容,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。


(2)利用

检测方法如下:

当我们输入的内容,经过web模板解析后返回到html页面中,如果在web模板解析时没有进行很好的过滤就会出现SSTI模板注入漏洞。

以BUU上[护网杯 2018]easy_tornado为例,当我们的filname和filehash不一样的时候会跳转到error页面。


当我们输入2不会返回正常的1 * 2而是ORZ

证明存在SSTI漏洞
使用python web模板tornado中的handler.settings可以把cookie输出

这就可以证明有SSTI模板漏洞,这个漏洞在很多语言的web模板中都存在,不光只有python,因为python tornado模板使用简单,所以造成的危害更大些。

也可以使用system函数执行系统命令

1
{{system('命令')}}

例题:[BJDCTF2020]The mystery of ip
题目X-Forwarded-For可控,存在模板注入,可以使用system执行系统命令。
payload:
1
X-Forwarded-For {{system('cat /flag')}}

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×