概述
文件上传危险系数极高,后台未对用户上传的文件进行验证或过滤不严谨,导致用户上传了可执行脚本文件,通过对脚本构造恶意的攻击代码,从而获取webshell,进一步对该网站服务器渗透、提权,最终导致服务器沦陷
一个简单的文件上传代码
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="uploadedFile">
<input type="submit" value="上传">
</form>
在上述例子中,如果服务器端未正确验证上传的文件类型和内容,攻击者可以上传包含恶意代码的文件,如包含 PHP 代码的文件,从而导致远程代码执行。
验证方式及其绕过方法
前端
javascript验证文件后缀,可通过审计源代码看到
绕过方法:抓包修改提交文件后缀、禁用网页javascript
后端
以下验证及绕过全部来自于靶场——upload-labs
黑名单
只禁止上传的脚本格式:.asp/.php/.jsp/.aspx/.cgi/.war
等等
绕过方法:
特殊解析后缀
上传其他格式的能够解析的后缀,例:.php3
.php5
,前提是得在apache配置文件添加,使服务器能够解析
大小写转换
网站代码没有做大小写转换,.PHp
就能绕过
去末尾空格
代码没写去空格,抓包在.php
结尾加个空格就能上传,因为数据包格式审查严格,空格也会上传
高版本php不可用
去末尾.
代码没写去.
,抓包在.php.
结尾加个.即可,windows会自动删除,只用来绕过代码黑名单
::$DATA
代码没写去::$DATA
抓包在.php
结尾加::$DATA
即可。
条件:
代码必须在windows中,windows特性,会把::$DATA
后的数据当成文件流处理,不会检测后缀
过滤关键字为空
代码将检测到包含php等存在于黑名单中的后缀名替换为空,例a.php替换为a.
如果是一次循环的话,双写即可绕过,例a.pphphp
,如果是循环过滤就不行了
白名单
只允许上传的脚本格式:.jpg/.png/.zip/.rar/.gif …
绕过方法:
文件类型验证:MIME类型
作用:描述内容类型标准,web通常用这个来确定如何处理URL,配置不正确会导致无法解析文件内容
出现在数据包的Content-Type
位置
常见的 MIME 类型
- 超文本标记语言文本 .html:text/html
- 普通文本 .txt: text/plain
- RTF 文本 .rtf: application/rtf
- GIF 图形 .gif: image/gif
- JPEG 图形 .jpeg、.jpg: image/jpeg
- au 声音文件 .au: audio/basic
- MIDI 音乐文件 mid、.midi: audio/midi、audio/x-midi
- RealAudio 音乐文件 .ra、.ram: audio/x-pn-realaudio
- MPEG 文件 .mpg、.mpeg: video/mpeg
- AVI 文件 .avi: video/x-msvideo
- GZIP 文件 .gz: application/x-gzip
- TAR 文件 .tar: application/x-tar
文件头验证
不同的后缀文件用记事本打开后,显示的内容不同
抓包后修改对应格式的请求体信息,让服务器认为这是一张图
%00截断
适用于5.3php以下版本,代码中有取GET请求做参数,可在GET参数后加1.php%00
截断后面的代码
图片马
将图片以16进制打开,添加代码,添加完毕图片要能正常打开,制作完毕
上传后需要配合文件包含漏洞执行,上传的图片不能太大
其他
条件竞争
代码会先上传再进行二次渲染、判断格式,所以一直上传文件,一直刷新页面,把文件卡住,不让进行接下来的操作
以文件夹方式命名
当网站强制修改上传名字为:upload-19.jpg
绕过方法
upload-19.php%00.jpg %00截断
upload-19.php/. 以文件夹方式命名
中间件解析漏洞
nginx
当该网站能上传图片,先准备一个.png结尾的文件,再选择记事本打开,添加webshell,上传成功后访问图片路径,路径后面随便加个文件名即可运行代码
例:127.0.0.1/var/www/1.png
/1.php
只需要在图片路径后跟/.php
即可测试当前网站存不存在这个漏洞
apache
.htaccess解析
必须是apache搭建的网站才能用
创建一个名为`.htaccess`的配置文件,上传后当前目录下的所有文件都将优先匹配这个文件
里面写入
<FilesMatch "abc"> 匹配文件名为abc
Sethandler application/x-httpd-php 切换MIME类型,将文件解析为php文件
</Filesmatch>
再创建abc.jpg,上传后访问abc即可
web编辑器类漏洞
ckeditor
fckeditor
kindeditor
xxxxeditor
修复
-
后端验证
-
后缀检测
-
MIME检测
-
内容检测
文件头、完整性