你真的够努力吗?

从bwapp学服务端包含注入(SSI injection)

0x00 背景

SSI是英文"Server Side Includes"的缩写,翻译成中文就是服务器端包含的意思。SSI是用于向HTML页面提供动态内容的Web应用程序上的指令。 它们与CGI类似,不同之处在于SSI用于在加载当前页面之前或在页面可视化时执行某些操作。 为此,Web服务器在将页面提供给用户之前分析SSI。

可在SHTML文件中使用SSI指令引用其他的html文件(#include),此时服务器会将SHTML中包含的SSI指令解释,再传送给客户端,此时的HTML中就不再有SSI指令了。Server-Side Includes攻击允许通过在HTML页面中注入脚本或远程执行任意代码来利用Web应用程序。 一种对于这类漏洞的挖掘方式即是查看.stm,.shtm和.shtml的页面是否存在,但是缺少这些类型的页面并不意味着不存在SSI攻击。

0x01 SSI语法

目前,SSI主要有以下几种用用途:
  1、显示服务器端环境变量<#echo>
  2、将文本内容直接插入到文档中<#include>
  3、显示WEB文档相关信息<#flastmod #fsize> (如文件制作日期/大小等)
  4、直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序)
  5、设置SSI信息显示格式<#config>(如文件制作日期/大小显示方式)
  高级SSI<XSSI>可设置变量使用if条件语句。

SSI指令基本格式:<!-– 指令名称="指令参数">

如程序代码:

<!--#exec cmd="cat /etc/passwd"-->

说明:
1.<!-- -->是HTML语法中表示注释,当WEB服务器不支持SSI时,会忽略这些信息。
2.#exec 为SSI指令之一。
3.cmd 为exec的参数, cat /etc/passwd为参数值,在本指令中指将要执行的命令。

注意:

1.<!--与#号间无空格,只有SSI指令与参数间存在空格。
2.上面的标点="",一个也不能少。
3.SSI指令是大小写敏感的,因此参数必须是小写才会起作用。

因此,如果网站存在SSI漏洞的时候就会能够执行该命令来查看系统口令。

0x02 bwapp实例

这里输入<!--#exec cmd="cat /etc/passwd"-->提交后台会提示运行出错,但是这也表示确实是解析执行了,尝试更换为另一个语句来试试:<!--#echo var="DATE_LOCAL"-->这个语句会在页面加上一个本地时间,示例如图:

可以看到成功的解析执行了。medium难度下"被转义加上反斜杠,但是在这里可以使用`来代替'执行,一样能够触发。但是在high难度就无法绕过了,可能因为我太菜(:

给出high难度的防御代码,也可以作为实际环境中的防御措施:

function check($data, $encoding = "UTF-8")
{

    // htmlspecialchars - converts special characters to HTML entities    
    // '&' (ampersand) becomes '&amp;' 
    // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
    // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
    // '<' (less than) becomes '&lt;'
    // '>' (greater than) becomes '&gt;'  
    
    return htmlspecialchars($data, ENT_QUOTES, $encoding);
       
}

0x03 总结

在实际的很多业务中,用户输入的内容会显示在页面中。比如,一个存在反射型XSS漏洞的页面,如果输入的payload不是XSS代码而是SSI的标签,同时服务器又开启了对SSI的支持的话就会存在SSI漏洞。因此,对于SSI注入的挖掘大概思路也同XSS的挖掘类似。

从定义中看出,页面中有一小部分是动态输出的时候使用SSI,比如:

  • 文件相关的属性字段

  • 当前时间

  • 访客IP

  • 调用CGI程序

 

posted @ 2018-08-05 17:42  陈一生  阅读(2117)  评论(0编辑  收藏  举报