Apache SSI 远程命令执行漏洞复现

Apache SSI 远程命令执行漏洞复现

使用SSI(Server Side Include)的html文件扩展名(.shtml),通常称为”服务器端嵌入“或者叫”服务器端包含“。

shtml不是html而是一种服务器API,shtml是服务器动态产生的html。两者都是超文本格式,但shtml是一种用于SSI(Servcie Side Include ,服务器端包含指令)技术的文件,一般浏览器访问时会优先扫描依次shtml文件看有没有SSI指令存在,就就按服务器设定的规则去解释SSI指令,然后跟html一起被渲染。当shtml或shtm中不包含服务端可执行脚本时作用和html或htm一样。

在测试任意文件上传漏洞的时候,目标服务端可能不允许上传php后缀的文件。如果目标服务器开启了SSI与CGI支持,我们可以上传一个shtml文件,并利用`<!–#exec cmd=”id” –>`语法执行任意命令。

vulhub对该漏洞提供了文件上传的页面。

&lt;?php
if (!empty($_FILES)):
$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);
if (in_array($ext, ['php'])) {
die('Unsupported filetype uploaded.');
}
move_uploaded_file($_FILES['file_upload']['tmp_name'], './' . $_FILES['file_upload']['name']);
echo "&lt;a href='/{$_FILES['file_upload']['name']}'&gt;{$_FILES['file_upload']['name']}&lt;/a&gt;";
endif;
?&gt;

从代码可以看出只过滤了php后缀的文件,而当前环境是开启了SSI和CGI的,所以可以上传shtml文件。

<!–#exec cmd=”cat /etc/passwd”–>

再访问我们刚才上传的test.shtml文件,触发命令执行。

回显了执行结果。

漏洞需要满足的条件:

  • Web服务器为Apache和IIS(支持SSI功能的服务器)
  • 服务器有上传或者用户输入页面且未对相关SSI关键字做过滤
  • Web应用程序在返回响应的HTML页面时,嵌入用户输入
  • 未对输入的参数值进行输入过滤

因为Apache默认是不支持SSI的,所以需要我们更改httpd.conf来进行配置。

Apache配置ssi功能
我这里以windows平台的Apache2.2.22为例,打开conf目录下的httpd.conf文件。

#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
把这两句前面的”#”去掉,如果要使html也支持ssi可以改写成
AddType text/html .shtml .html
AddOutputFilter INCLUDES .shtml .html

并非所有文件中的ssi指令都会被解析,必须告诉Apache应该解析哪些文件,如果我们的指令放在了.htm类型的文件中,那么就需要在上面两条命令中分别加入.htm一项,否则便不会解析未指定的文件中的ssi命令,因为命令是放在注释中的,故不解析的将显示空。
#Options Indexes FollowSymLinks
把这句前的”#”去掉,改写成
Options Indexes FollowSymLinks Includes

zgao

如果有什么技术上的问题,可以加我的qq 1761321396 一起交流。