文件上传漏洞小结

首先进行操作系统判断

改url大小写看能否正常访问        windows(正常访问)无视大小写

linux(不能访问)看大小写

一.前端js绕过

Bp看有没有包

二. 后端

绕过MIME-Type验证

查http包的Content-Type字段中的值来判断上传文件是否合法的

小技巧,可以先成功上传一个案例,观察服务器允许的mime的类型,然后再抓包修改测试

利用Burpsuite工具截断HTTP请求,在Repeater重放修改MIME-Type类型绕过验证。

首先上传一个文件1.asjhdih随便后缀 能上传成功的是黑名单 不能上传成功的是白名单

黑名单绕过:黑名单不全1.特殊后缀(php3,php5,phtml)

                      2.上传htaccess让后来的可以上传的任何文件解析成php文件运行 (比如上传用php代码写的png图片)

SetHandler application/x-httpd-php

                     

3.       .user.ini

auto_prepend_file=1.jpg

其图片马(1.jpg)为 在我访问php文件时,自动包含.user.ini ,而.user.ini这个里面又有1.jpg,1.jpg就是图片马,上传成功之后,用webshell管理工具添加该图片的路径,但该图片名改为当前目录下的php文件,例如readme.php,也就是执行这个1.jpg里面的代码,输入密码连接成功。

4.空格绕过,点绕过(1.php. .),大小写绕过

5发现没有str_ireplace(‘::$DATA’)所以没有去除字符串,所以在文件名后加上::$data达到绕过的目的,需要注意的是在访问的时候必须把::$data去掉进行访问,因为windows系统会自动去掉末尾的::$data,你如果访问时候加上说明这是去不掉的。

6.双写绕过(1.pphphp)由于 str_ireplace() 函数将所有匹配的字符串替换成空字符串,并且不关心替换的字符串在原始字符串中出现的位置或次数,这会导致一个潜在的漏洞。他会把中间的PHP替换为空。

这里他的替换是直接把整个后缀提取出来,然后检查你的后缀有没有连续的PHP,如果有,他就给你替换为空。不能有php但是可以有1.pphphp然后在上传之后给删除中间的php剩下1.php

白名单绕过:

  1. 先通过验证,再把后缀改为php执行代码

上传正常jpg,在保存时利用某种方式后缀名变为php

(1)路径上传方式为get :比如filename=1.gif先通过验证

但是save_path=../upload/998.php%00  此时%00直接截断,所以保存的就是../upload/998.php此时可以当作php文件执行代码(回显包里有报错也说明可以服务端接收)

  1. 路径上传方式为post :在post中%00会自动解析,所以需要再进行一次编码

或者

也可以直接进入hex在路路径后面加上00

  1. 上传后缀名图片的文件,但是可以通过其他方式去执行代码

上传正常jpg,利用服务器里有的函数进行执行代码(任意文件包含,这个不好找

图片webshell:在PHP中,使用include、 require、 include_once、 require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。其中服务器本来就包含include.php这种类型的文件

其中可能Content-Type验证。修改为image/gif 或 image/jpg  符合当前文件类型的MIME

图片马制作:windows命令   cd desktop

copy  1.png  /b  +  2.php  /a   123.jpg

将1.png以二进制打开 2.php以ascil码打开

合并成一个文件123.jpg

(以什么形式打开都不影响)

图片马本身不会执行,只有通过解析或者文件包含漏洞才行

上传1.jpg,然后用include.php或者其他文件进行解析(这个文件靠后端代码审计得出,但是后端代码是看不见的,白盒测试可以审计后端代码)

涉及知识:二次渲染(将图片剪碎再重新拼接,但重要部分不会变)(网站压缩的缩略图就是二次渲染的一种体现)

对比上传前后的图片,看哪里没被改动 哪个地方就写木马 然后保存再次上传

3.竞争条件(利用时间差)

原理

        文件上传后服务器对文件进行非法检测,若合法保留文件,否则删除文件;

绕过

        上传非法文件后,在文件被删除前访问该文件执行恶意代码,可在服务器生成一个webshell文件,通过新的webshell文件攻击服务器;

就是让携带的代码在极短时间内在当前目录下再写入一个webshell,然后携带的代码被删除但是webshell留下了

用于上传的php文件'); ?>

它的作用是在服务器上创建一个名为 “shell.php” 的文件,并将 “” 的内容写入该文件。

条件竞争原理:当我们成功上传了php文件,服务端会在短时间内将其删除,我们需要抢在它删除之前访问文件并生成一句话木马文件,所以访问包的线程需要大于上传包的线程。

首先上传包1.php用bp抓包

然后直接尝试访问shell.php这个文件用bp抓包

攻击模块的positions不要设置    默认spiner

Payloads设置为null payloads

Resource pool 线程设置数      或者多开几个攻击窗口效果是一样的(没必要

如果一共发1000个包  线程设置200  那么发5次就能发完

一次发200个

最后攻击出现200响应码成功

  1. 任意文件包含(很难挖出 要白盒拿到网站后台或者是别的方式)文件包含就是将一个文件包含到自己的文件中执行。它可分为本地包含和远程包含,本地包 含即包含本地磁盘上的文件,文件名称是相对路径或绝对路径,远程包含即包含互联网上的 文件,文件名称是 URL。

include():找不到被包含文件,报错,但会继续运行脚本;

include_once():与include()类似,区别在于,当重复调用同一文件时,程序只调用一 次;

require():找不到被包含文件,报错,并且停止运行脚本;

require_once() :与require类似,区别在于,当重复调用同一文件时,程序只调用一次    ;

当使用这四个函数包含一个新的文件时,该文件将作为PHP代码执行,  PHP内核并                 不会在意该包含的文件是什么类型。(无论是txt、图片文件,远程URL,全都作为PHP代码执行)

条件:1. included等函数通过动态变量的方式引入需要包含的文件

2. 用户能够控制该动态变量

3. 被包含的文件可被访问

 防护措施

1. 包含文件的参数过滤

① 文件名过滤:白名单或者黑名单过滤

②不使用动态变量进行包含操作,设置字典等静态处理

③文件名后缀固定

2、路径限制

①目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围                    ②目录回退符过滤,避免回退符生效导致路径变化

3、中间件的安全配置

①PHP版本小于5.4在php.ini中设置magic_quotes_gpc=on(5.4 以后被放弃用)

magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’"\加上反斜线   

②限制访问区域:php.ini中设置open_basedir来限制用户访问文件的活动范围等;

apache 也有相关配置

③设置访问权限:限制当前中间件所在用户的访问权限,例如;  web 服务器独立用户,并且 只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;

4.搭建RASP阻止代码注执行

代码要是不被执行会回显出里面的内容

服务器解析漏洞不详细讲

文件上传漏洞小结_第1张图片 

 

总结
从攻击者的角度来给上传分类:
1 轻量级检测绕过
a. 绕过前端 JavaScript 检测:使用 Burp 抓包改包。
b. 绕过服务器端 MIME 类型检测:使用 Burp 抓包改包。
3 文件内容检测方式
对文件进行恶意代码注入,再配合解析漏洞(或文件
包含漏洞)。
2 路径 / 文件扩展名检测绕过
a. 黑名单检测方式
文件名大小写绕过;
名单列表绕过;
特殊文件名绕过;
0x00 截断绕过;
.htaccess 文件攻击;
本地文件包含漏洞;
Apache 解析漏洞;
IIS 解析漏洞;
Nginx 解析漏洞;
b. 白名单检测方式
0x00 截断绕过;
本地文件包含漏洞;
Apache 解析漏洞;
IIS 解析漏洞;
Nginx 解析漏洞

你可能感兴趣的:(#文件上传,网络安全,web安全,安全)