这一篇和上一篇文章文件上传漏洞是互为姊妹篇,在利用思路会相互补充。文件上传漏洞的另外一些特殊情况,上传的文件检测严格,只能常规上传图片,但是如果中间存在一些解析漏洞的话我们就可以利用解析漏洞进行上传后门。
由此可知,该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
配置失误之处
cgi.fix_pathinfo
该选项位于配置文件php.ini中,默认值为1,表示开启。例如一个文件:test.png/x.php
当解析这个文件时,如果找不到的话,就会寻找是否存在 test.png。如果存在的话就会以php进行解析。
测试思路:上传后门图片,再房屋访问图片,再尾部加上/x.php即可
复现环境:借助vulhub的docker测试环境
上传恶意图片,并且访问。
加上/x.php
建议不要在图片里面放后门马,建议放一些命令。
漏洞修复建议:
原理:漏洞原理是在IIS6.0处理PROPFIND指令的时候,由于url的长度没有进行有效的长度控制和检查,导致执行memcpy对虚拟路径进行构造的时候引发栈溢出
利用条件:
构成解析漏洞的方式:有两种
第一种:文件目录错误解析
xxx.asp/1.jpg
目录xxx.asp下的所有文件都会以asp进行解析
第二种:文件名错误解析
xxx.asp;.1.jpg
会把这个jpg格式文件按照asp进行解析
这个漏洞的利用还需要考虑一个问题,就是文件路径的问题,后门就是能上传,如果没法链接的话就无法构成文件上传漏洞。
文件上传后的命名规则:
这个时候一方面需要知道文件存储的位置,另外一方面需要考虑到文件的名字。当然有的数据包我们也许能看到一个filepath的字段。如果上传路径可控,也是可以的。
原理:正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。但是在这漏洞情况下,当我们上传1.gif后,访问我们上传的文件,但是这样请求1.gif[0x20][0x00].php 就会把这个文件发给fastcgi及解析,但是进行解析却发现解析的是1.gif。
上传图片,包含有后门文件
访问这个url
这个空格的意思进行标记,便于接下来修改
漏洞原理:
代码分析
# 容器内php配置文件
root@b4104beecaba:/var/www/html# cat /etc/apache2/conf-available/docker-php.conf
<FilesMatch \.php$>
SetHandler application/x-httpd-php
# 分析:
# 设置了正则表达式,$可以匹配任意字符,只要文件名里有.php 就会被php解析
</FilesMatch>
DirectoryIndex disabled
DirectoryIndex index.php index.html
<Directory /var/www/>
Options -Indexes
AllowOverride All
</Directory>
root@b4104beecaba:/var/www/html# cat index.php
<?php
if(isset($_FILES['file'])) {
$name = basename($_POST['name']);
$ext = pathinfo($name,PATHINFO_EXTENSION);
if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {
exit('bad file');
}
move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);
} else {
?>
# 这里会对数据包里的name参数进行过滤,php+任意字符就能绕过过滤
# 配合php设置就可以成功实现php文件解析
在php后面加上换行符 0x0a
上传文件
访问文件
漏洞原理:Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。如果给php文件解析加上AddHandler application/x-httpd-php .php 那么只要文件名字里面包含.php即可按照php解析。
上传文件:
访问文件: