文件上传漏洞
1 | 文件上传是我们在web渗透测试最终的一个环节。通过上传点上传我们的shell。从而获取系统目标的权限,作为开发者,文件上传是必不可少的。如要让用户修改头像,就需要上传点。而往往这些上传点,却是渗透者最喜爱的。本文将为你介绍常见的文件上传漏洞及防御办法。 |
上传漏洞定义
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
常见的文件上传位置
- web页面修改头像
- 目录、文件扫描发现 类似upload.php等文件
- 附件上传(论坛发帖、邮箱)
- 文件管理器(Everything)
常见检测方式及绕过方式
1. 前端 JavaScript 检测
开发者为了方便,在前端对文件后缀类型进行判断。即利用js禁用php asp等文件的上传。
绕过方法:
抓包法:先发正常的文件,然后通过抓包软件(BS)拦截文件包,修改文件编码内容。
禁用法:禁用相关 JS 脚本,或者删除相关 JS 代码,然后提交相关文件
2.后端 MIME 类型检测
在文件上传的时候,会有 Content-Type 带着文件类型,后端对 MIME 进行检测。
1 | 常见的 MIME 表格 |
MIME | 内容 |
---|---|
text/plain | 纯文本 |
text/html HTML | 文档 |
text/javascript | js代码 |
application/xhtml+xml | XHTML文档 |
image/gif | GIF图像 |
image/jpeg | JPEG图像 |
image/png | PNG图像 |
video/mpeg | MPEG动画 |
application/x-www-form-urlencoded | POST方法提交的表单 |
绕过方法:
抓包法:发送木马文件,发送后抓包改 Content-type 后面的文件类型.
3. 文件头检测
不同的文件在16进制里会记录文件类型.这就会使后端对文件进行文件头检测.
常见的文件头:
文件类型 | 16进制 |
---|---|
html | 68746D6C3E |
zip | 504B0304 |
rar | 52617221 |
4. 文件后缀黑名单检测
有的后端会检测文件的后缀判断文件后缀,那么就可以修改文件后缀
绕过方法:
修改后缀法:常用后缀有php2 php3 phtml 等
5. WAF 规则绕过其他方法
大小写绕过在 Windows 下,是对大小写不敏感, Test 和 TEST 是一样的东西. 而 Linux 是大小写是敏感的,Test 和 TEST 是不一样的东西. 所以可以尝试大小写绕过
内容双写有的防火墙在规则指定的时候,会尝试删除某些内容,比方说标题内有 php 内容,则会尝试删除php .
所以可以尝试双写,比方说 php 后缀可以改成 pphphp ,那么就会尝试删除中间php.从而绕过.
后面内容加上::$data
在 Windows 里面,上传的文件 test.php::$DATA ,会生成 test.php ,其中上传不会发生改变,并且会解析.
有的 WAF 检测规矩中并没有指定过滤::$DATA ,就可以使用这个方法进行绕过.
路径拼接绕过前提是服务器为 Windows 系统 文件名称为 test.php. . ,注意两个点之间有空格.在上传的过程中 deldot 会删除最后一个点, 同trim会删除中间的空格. Windows 会删除第一点,最后变成 test.php ,从而导致成功上传
6. 0x00 截断后缀白名单
前提: PHP版本小于 5.3.4
0x00 是字符串的结束字符,可以手动添加字符截断.文件系统就会认为是结束的.从而绕过
提交 .htaccess文件. 如果防火墙没有禁止 htaccess 文件上传,则可以尝试上传.htaccess文件上传
htaccess文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
.htaccess 内容
1 | <FilesMatch "文件"> |
该文件会将目录下的 文件 解析成 php文件
7. 图片马
向图片中植入 php 代码,但是执行较困难,必须要中间件将该文件认为是 php 文件.
除非有有相关的中间件解析漏洞或者有特定的运行php 的网页,否则要用上面的 .htaccess 修改。
首先制作一个图片码,可以直接用Notepad直接打开图片后面加一个php代码,但是需要16进制,要不然图片可能出错。
也可以cmd进行生成,命令语句:copy 14.jpg /b + 14.php /a webshell.jpg 如图所示,我们在上传这个生成后的图片。