upload-labs总结
通过使用upload-labs环境,总结一下常见的文件上传绕过思路。
常见的文件上传绕过思路
Pass-01-js检查
因为使用前端js校验,因此可以直接禁用js或者用burp抓包修改文件类型绕过
1 |
|
Pass-02-只验证Content-type
只判断content-type类型,因此上传dama.php,抓包修改content-type为图片类型:image/jpeg、image/png、image/gif
1 |
|
Pass-03-黑名单绕过
用黑名单限制不允许上传.asp,.aspx,.php,.jsp后缀文件,通过fuzz发现可以上传**.phtml .phps .php5 .pht .php3**等。
前提是apache的httpd.conf中有如下配置:
AddType application/x-httpd-php .php .phtml .phps .php5 .pht .php3
1 |
|
Pass-04-.htaccess绕过
黑名单限制了大部分后缀文件,除了**.htaccess**
前提条件:
1.mod_rewrite模块开启
2.AllowOverride All
因此先上传一个.htaccess文件,文件内容如下:
1 |
|
其中Windows下可先将创建包含上述文件内容的txt文件,然后通过rename 1.txt .htaccess方式创建.htaccess文件,这样所有png文件都会当成php来解析
1 |
|
Pass-05-大小写绕过
对比Pass-04过滤了.htaccess,但代码中将后缀转换为小写去掉了,因此可以使用大小写绕过
1 |
|
Pass-06-空格绕过
对比前两题,这题没有对后缀名进行去空,因此可以在后缀名加空格绕过
1 |
|
Pass-07-点绕过
没有对后缀名末尾的点进行处理,利用Windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加**.**绕过
1 |
|
Pass-08-::$DATA绕过
没有对后缀名中的**::$DATA**进行过滤,在php+windows情况下:如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检查后缀名,且保持”::$DATA”之前的文件名。利用Windows特性,可在后缀名中加入”::$DATA”绕过
1 |
|
Pass-09-点+空格+点绕过
1 |
|
代码先是去除文件名前后的空格,再去除文件名最后所有的. ,再通过strrchr函数来寻找**.**来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用原始的文件名,导致可以利用x.php. .(点+空格+点)来绕过
Pass-10-双写绕过
1 |
|
黑名单过滤,将黑名单里的后缀名替换为空且只替换一次,因此可以使用双写绕过,上传info.pphpphp 就可绕过
Pass-11-00截断
1 |
|
白名单判断,但$img_path是直接拼接,因此可以利用%00截断绕过。
1 |
|
截断条件:php版本效于5.3.4,php的magic_quotes_gpc为off状态
Pass-12-00截断
1 |
|
save_path参数通过post方式传递,还是利用%00截断,因为POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改
Pass-13-图片马绕过
1 |
|
通过读文件前两个字节判断文件类型,因此直接上传图片马即可:
1 |
|
直接访问图片不能把图片当作php解析,因此还需要利用文件包含漏洞
Pass-14-getimagesize()-图片马绕过
方法与Pass-13相同
Pass-15-exif_imagetype()-图片马绕过
方法与Pass-13相同
Pass-16-二次渲染绕过
暂未复现成功
1 |
|
Pass-17-条件竞争
先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此我们可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可
1 |
|
Pass-18-条件竞争
图片马条件竞争
1 |
|
Pass19-00截断
1 |
|
发现move_uploaded_file()函数中的img_path是由post参数save_name控制的
1、可以在save_name利用%00截断绕过(注意php版本低于5.3)
2、move_upload_file()有一个特性,会忽略掉文件末尾的/.,所以将文件后缀改为.php/.绕过
Pass20-数组绕过
1 |
|
利用数组
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!