一、漏洞原理
在测试任意文件上传漏洞的时候,目标服务端可能不允许上传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一样。
二、漏洞场景/挖掘思路
- 业务场景Fuzz,比如获取IP、定位、时间等
- 识别页面是否包含.stm、.shtm和.shtml后缀
- 一些业务中,用户输入内容会展现在在页面中(一个存在反射性xss漏洞页面,输入的payload不是xss代码而是SSI标签,同时服务器又开启了对SSI支持就会利用xss远程执行命令)
三、触发条件
当符合以下条件时,攻击者可以在Web服务器上运行任意命令:
- Web服务器为Apache和IIS(支持SSI功能的服务器)
- 服务器有上传或者用户输入页面且未对相关SSI关键字做过滤
- Web应用程序在返回响应的HTML页面时,嵌入用户输入
- 未对输入的参数值进行输入过滤
四、漏洞复现
(使用docker搭建,具体搭建操作传送门)
4.1 启动环境
# 进入漏洞(进入vulhub对应的漏洞环境的目录)
》》cd /Kevin/vulhub-master/httpd/ssi-rce
# 编译并运行环境
》》docker-compose build && docker-compose up -d
Tips:
# 只运行以下命令也可以,因为docker-compose up -d 运行后会自动查找目录下的配置文件,如果配置文件中包含的环境已经存在则不会再编译了,如果不存在会重新编译,因此此命令包含了docker–compose build命令
》》docker-compose up -d
4.2 访问环境
# 浏览器访问: http://<vul’s ip>:8080/upload.php
4.3 复现过程
# 我们随便上传一个文件探一下服务器是否为Apache
(Unsupported filetype uploaded. 不支持的文件上传格式!)
# 我们上传一个poc文件(Apache SSI_poc exp.shtml)
<!--#exec cmd="cat /etc/passwd"-->
Tips:因为IIS和Apache都支持SSI功能,因此poc中cmk="ls"比较稳妥一些!
# 上传成功
# 浏览器访问上传的文件成功执行命令
五、防御措施
- 关闭服务器SSI功能
- 过滤特殊字符(‘<,>,#,-,",’’)
(具体防御措施可参考:https://blog.csdn.net/qq_29277155/article/details/52751364)