目录
开启SSI功能需先对apache配置文件(httpd.conf)进行设置 详情请百度
接上一篇文章apache常见漏洞解析
漏洞起因:
在某些web页面上传.php后缀文件的时候,最常见的情况就是无法上传,因为前端开发人员是肯定做了黑白名单的限制的,而且在中间件也做了相关限制。可是在某些特定版本或者运维人员出现一些不起眼的配置失误时,那么就可以利用这类机会上传恶意代码答道攻击或者信息收集的目的,中间件安全往往是企业开发或者运维人员很容易忽视掉的问题,因为大伙会把非常多的精力放在代码安全上,这也给了我们可以钻空子的机会。ok话不多说:
在测试任意文件上传漏洞的时候,目标服务端可能不允许上传php后缀的文件。如果目标服务器开启了SSI与CGI支持,我们可以上传一个shtml后缀文件,并利用<!--#exec cmd="id" -->
语法执行任意命令。
ssi和cgi模块是什么?
简单做个描述:
Apache SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器的网页制作技术。
默认扩展名是 .stm、.shtm 和 .shtml。
在技术上,SSI就是在静态HTML文件中,根据需求插入不同的内容。
例如一个article的频道,每一个article内页都生成一个静态的HTML,如此时,header某个位置需要修改,则需要重新生成所有article的静态HTML文件。
如使用了SSI,可以在HTML文件中通过注释行嵌入经常会变化的共用部分,例如登入讯息等。可以不需要重新生成所有article,服务器会根据嵌入文件自动生成网页,输出到浏览器,如要修改则只需要修改嵌入的文件即可,无需重新生成所有HTML文件,服务器包含这种方式与php的include类似。
开启SSI功能需先对apache配置文件(httpd.conf)进行设置 详情请百度
<Directory "D:/myProject/web">
AddType text/html .ssi #这里可以是 .shtml 或其他 不一定要 .ssi, 设置.ssi后缀的也是text/html类型的文件
Options Includes
AddOutputFilterByType INCLUDES; DEFLATE text/html #输出处理器
</Directory>
测试SSI是否成功启用 编辑文件
// test.ssi :
# echo指令输出变量 DATE_LOCAL
<!--#echo var="DATE_LOCAL" -->
## 特别注意 <!--# 之间不能有任何空格,不然指令是无效的,被当作html注释
**因为很多IDE都有注释代码行的快捷键, 如 sublime text( ctrl + /) 但是会变成 <!-- #echo var="..." -->
,由于多了个空格,所以ssi指令被当成注释了。 **
CGI:
Apache CGI(Common Gateway Interface)模块用于执行外部应用程序,例如脚本语言程序。它为HTTP服务器与其他内容产生过程提供了一个标准接口。CGI模块的主要功能包括:
1. 支持多种语言:CGI支持各种脚本语言,如Perl、Python、Ruby等。这使得Apache可以通过这些语言来生成动态内容。
2. 通信接口:CGI定义了HTTP服务器和 executed 程序之间的标准接口。这个接口包括:- 环境变量:CGI通过环境变量将客户端请求信息传递给executed程序。如REMOTE_ADDR, REQUEST_METHOD等。- STDIN:executed程序可以从STDIN读取请求数据。- STDOUT:executed程序需要向STDOUT打印响应头和内容。- 返回值:executed程序通过返回值向服务器报告程序执行状态。
3. 独立执行:每次HTTP请求,服务器都会启动一个新的CGI进程来处理。此进程独立于服务器独立执行,即使其发生致命错误,也不会影响服务器进程。
4. 可插拔:可以很容易装入和移除CGI功能。服务器管理员可以随意选择支持CGI的语言。但是,CGI也存在一定缺点:
1. 性能较差:每次请求都需要启动一个新的进程,这会消耗较多系统资源并影响性能。
2. 代码容错性较差:如果CGI程序发生致命错误,那么当前请求就无法完成服务。
长话短说:
Apache SSI(Server Side Includes)和CGI(Common Gateway Interface)都是Apache的动态内容生成机制,两者有一些区别:
漏洞场景/挖掘思路
- 业务场景Fuzz,比如获取IP、定位、时间等
- 识别页面是否包含.stm、.shtm和.shtml后缀
- 一些业务中,用户输入内容会展现在在页面中(一个存在反射性xss漏洞页面,输入的payload不是xss代码而是SSI标签,同时服务器又开启了对SSI支持就会利用xss远程执行命令)
触发条件
当符合以下条件时,攻击者可以在Web服务器上运行任意命令:
- Web服务器为Apache和IIS(支持SSI功能的服务器)
- 服务器有上传或者用户输入页面且未对相关SSI关键字做过滤
- Web应用程序在返回响应的HTML页面时,嵌入用户输入
- 未对输入的参数值进行输入过滤
漏洞复现:
原理:
在测试任意文件上传漏洞的时候,目标服务端可能不允许上传php / jsp / asp后缀的文件。如果目标服务器开启了SSI与CGI支持,我们可以上传一个shtml文件,并利用 语法执行任意命令。
Tips:(shtml释义)
T1(作用?):
一些大的门户网站如sohu、sina,如果是动态的一个页面会有多次数据库查询,如此庞大信息量如何保证速度和质量那? 高性能的服务器是其一; 其二是使用shtml静态页面,如此为提升访问质量!
T2(shtml和html区别?)
(shtml不是html而是一种服务器API,shtml是服务器动态产生的html)
两者都是超文本格式,但shtml是一种用于SSI(Servcie Side Include ,服务器端包含指令)技术的文件,一般浏览器访问时会优先扫描依次shtml文件看有没有SSI指令存在,就就按服务器设定的规则去解释SSI指令[ 当作一种动态编程语言来处理 ],然后跟html一起被渲染。
当shtml或shtm中不包含服务端可执行脚本时作用和html或htm一样。
环境:
[~/vulhub/httpd/ssi-rce]
└─# docker-compose up -d
运行一个开启了ssi和cgi功能的apache服务。
复现:
访问文件上传的php页面:
正常情况下是无法上传php恶意代码的,查看站点源码是有做了黑名单的限制:
我们可以构造一个shell.shtml并上传,试一下:
<!--#exec cmd="ls" -->
上传成功,我们可以看到出现了一个shtml的超链接,
ok命令执行成功,ls命令打印了此目录下的所有文件!再来一个cat命令
总结来说:此漏洞在开启ssi支持或者cgi的情况下,并且再没有对文件上传做很细致的限制的情况下会触发,利用shtml的和apache的ssi支持和cgi开启的情况下会触发。属于不常见但是一旦出现非常危险的漏洞!
防御措施
- 关闭服务器SSI功能
- 过滤特殊字符(‘<,>,#,-,",‘’)
(具体防御措施可参考:https://blog.youkuaiyun.com/qq_29277155/article/details/52751364)