1.上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力,这种攻击方式是最直接和有效的,文件上传本身是没问题的,有问题的是文件上传后,服务器怎么处理,解析文件。通过服务器的处理逻辑做的不够安全,则会导致上传漏洞。
2.漏洞条件
- 文件可上传
- 知道文件上传路径
- 上传文件可以被访问上传
- 文件可以被执行
DVWA分析
上传漏洞利用框架
1.收集可测试点
常见的可测试点包括以下几个方面:
1.应用程序上传功能(上传头像、附件上传等)
2.用户可控的输入点或者参数(页面POST表单部分、URL)
可以使用漏洞扫描工具进行扫描或者手动测试
2.判断上传漏洞类型
3.选取合适的绕过方法
上传漏洞种类与绕过方式
客户端校验-使用JS来判断后缀名
通过javascript来校验上传文件的后缀是否合法,可以采用白名单和黑名单的方式判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。
绕过方式:
- 禁用JS
- Brupsuite抓包修改
服务器端校验-对数据包的MIME进行检查
MIME:web服务器使用MIME来说明发送数据的种类,web客户端使用MIME来说明希望接收到的数据种类。例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是JPG文件。
绕过方式:
下方代码即可将目录下evil.jpg解析成evil.php
- 大小写绕过
- 点绕过
- 使用Windows文件流特性烧过evil.php:SDATA
- 双写烧过
- %00截断(PHP版本小于5.3.4,PHP的magic quotes apc为OFF状态)
- 截断绕过(使用Brupsuite的Hex,将对应空格处的20改为00)
-
服务器端校验-后缀名白名单校验
绕过方式: %00截断(PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态)
- 截断绕过(使用Brupsuite的Hex,将对应空格处的20改为00)
服务器端校验-突破文件头检查
相关函数:getimagesize()、exif_imagetype()
绕过方式:
GIF图片格式:GIF89a<?php phpinfo();?>.gif后缀上传即可
JPG图片格式:
准备一个一句话,一个jpg图片
使用:copy 1.jpg/b + 2.php/a evil.jpg生成一个带有一句话的jpg
PNG图片格式:和JPG一样的操作服务器端校验-二次宣染
就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。
绕过方式:
GIF图片格式:寻找到一个演染后没有发生变化的部分,将恶意代码插入
JPG图片格式:这里可以直接用国外的脚本
PNG图片格式:直接使用国外的脚本服务器端校验-条件竞争
后台逻辑:将上传的文件上传到Web目录,然后检查文件的安全性,如果发现文件不安全就马上通过unlink()将其删除。
绕过方法:在上传完成和安全检查完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意shell。这时候shell已经生成,文件被删除就无所谓了。其他的上传漏洞
ZZZPHP 1.6.1
设置新的恶意文件
输入文本位置
显示上传的文本位置
显示成功
源码分析:
查看调用点
上传漏洞修复建议
文件校验的几点建议:
文件扩展名服务端白名单校验。
文件内容服务端校验。
上传文件重命名。
隐藏上传文件路径。
修复服务器容器各种解析漏洞