文件上传漏洞应该是渗透测试中用的比较多的漏洞了,毕竟可以很方便的getshell,可是网站也会有很多限制,这里就总结一下文件上传的绕过姿势。

绕过姿势

客户端

客户端使用JavaScript校验上传文件的后缀名,在文件未上传到服务器时,就对文件进行验证,任何客户端的验证都是不安全的。

绕过也是比较简单

1
2
3
4
1. 可以用firebug将form表单中的js校验事件删除
2. 使用burp:
1)先将木马文件的扩展名改为一张正常图片的扩展名,如gif
2)上传时使用burp截包,将文件扩展名改为asp/php/jsp即可

服务端

MIME验证

通常服务器端会做类似如下验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if($_FILES['file']['type']=="image/jpeg"){
$imageTempName = $_FILES['file']['tmp_name'];
$imageName = $_FILES['file']['name'];
$last = substr($imageName,strrpos($imageName,"."));
if(!is_dir("uploadFile")){
mkdir("uploadFile");
}
$imageName = md5($imageName).$last;
move_upload_file($imageTempName,"./uploadFile/".$imageName);
echo("文件上传成功");
}else{
echo("文件上传类型错误");
exit();
}
?>

此时,只需抓包修改conten-type为image/jpeg即可

文件内容验证
文件幻数检测

在文件头部加上一些幻数,后面写木马即可,比如jpg–>JFIF gif–>GIF89a PNG–>PNG

文件相关信息检测

通常使用getimagesize()函数,只需在幻数基础上加一些杂乱信息,比如

1
2
3
4
GIF89a
(binary data)
木马
(binary data)
文件扩展名
1
2
3
1. 黑名单漏掉的规则:.asa .cer
2. 大小写:pHp AsP
3. 混搭:.php1 .php2
截断绕过
1
0x00截断:构造如test.php(0x00).jpg的文件

服务器解析漏洞绕过
IIS

低版本(<7.0)时

1
2
1. 当文件夹格式为*.asp、*.asa时,其目录下任意文件都会被解析为asp
2. 当文件为*.asp;1.jpg时,会被解析为asp(默认不解析;号后面的内容)

IIS(7.0/7.5)

同Nginx的CGI解析漏洞

Apache

Apache 解析文件的规则是从右到左开始判断解析,如果扩展名不认识时,就再往左判断。比如 test.php.php1,“php1” 这种扩展名是Apache不可识别解析,Apache就会把test.php.php1解析成php。

故可以构造木马文件名类似为:xxx.php.aaa

Nginx
1
对低版本的Nginx(0.8.03)可以在任意文件名后添加%00.php进行解析攻击

如:上传名为xx.jpg%00.php就会解析为php

1
2
当php的配置文件中的选项cgi.fix_pathinfo = 1开启时,当访问www.xxx.com/x.txt/x.php
时,若x.php不存在,则PHP会递归向前解析,将x.txt当作php脚本来解析

如:可以在x.txt里直接写入木马

其它绕过
操作系统文件命令规则
  1. Windows

    上传不符合windows文件命名规则的文件名,如test.asp. test.asp(空格) test.php:1.jpg test.php::$DATA shell.php::$DATA……. ,会被系统自动去掉不符合规则符号后面的内容。

  1. Linux

    后缀名大小写,可以试试上传pHp后缀的文件。

.htaccess文件攻击

通过.htaccess文件调用php解析器去解析.jpg(或者其他)文件,.haccess文件代码如下:

1
2
3
<FilesMatch \.jpg$>
SetHandler application/x-httpd-php
</FilesMatch>

然后上传扩展为.jpg的任意文件马都会被解析为php

注:.htaccess是apache服务器中的一个配置文件,不是上传的文件的黑名单之内 ,所以.htaccess文件是可以上传成功。

.user.ini文件攻击

只要中间键是以fastcgi运行的php都可以用这个方法,.user.ini能被动态加载,它也有两个配置项:auto_append_file和auto_prepend_file,直接在.user.ini中添加

1
auto_prepend_file=x.jpg

就可以让正常的php文件执行前自动包含x.jpg(图片马),类似于require()

注:前提是含有.user.ini的文件夹下需要有正常的php文件


参考

.user.ini文件构成的PHP后门

文件上传漏洞(绕过姿势)