文件上传学习和绕过

在经过长时间的网络安全的学习中,我得到了一个真理:如果作为一个开发者,就是不要相信使用者,对使用者保持零信任.在关键的交互位置上要做好验证.

比方说 SQL 注入, XSS 注入, 文件上传等等,在这里就讲下文件上传吧

这个漏洞是攻击者上传含有木马、病毒、恶意脚本的文件.但前端或服务端没有进行文件验证.从而导致攻击者得到服务器的高权限执行能力.

常见位置

  1. 查找上传点,图片,附件,头像等等
  2. 目录、文件扫描发现 类似upload.php等文件
  3. 目录、文件扫描 编辑器目录如ewebEditor、fckeditor、kingeditor
  4. 附件上传(论坛发帖、邮箱)
  5. 文件管理器(Everything)

满足条件

  1. 文件能够绕过前端和后端的过滤和文件处理.
  2. 文件内容不会被二次编码,能够被正确的存储(图片马)
  3. 存储位置是在Web容器控制范围
  4. 权限配置不当造成攻击者有权限访问存储目录

常见检测方式及绕过方式

1. 前端 JavaScript 检测

有的开发者为了方便,在前端对文件后缀类型进行判断。

解决方法:

  1. 抓包法:先发正常的文件,然后通过抓包软件(BS)拦截文件包,修改文件编码内容。

  2. 禁用法:禁用相关 JS 脚本,或者删除相关 JS 代码,然后提交相关文件

2. 后端 MIME 类型检测

在文件上传的时候,会有 Content-Type 带着文件类型,后端对 MIME 进行检测。

常见的 MIME 表格

MIME内容
text/plain纯文本
text/htmlHTML文档
text/javascriptjs代码
application/xhtml+xmlXHTML文档
image/gifGIF图像
image/jpegJPEG图像
image/pngPNG图像
video/mpegMPEG动画
application/octet-stream二进制数据
application/pdfPDF文档
application/(编程语言)该种语言的代码
application/mswordMicrosoft Word文件
message/rfc822RFC 822形式
multipart/alternativeHTML邮件的HTML形式和纯文本形式,相同内容使用u\不同形式表示
application/x-www-form-urlencodedPOST方法提交的表单
multipart/form-dataPOST提交时伴随文件上传的表单

解决方法:

  1. 抓包法:发送木马文件,发送后抓包改 Content-type 后面的文件类型.

3. 文件头检测

不同的文件在16进制里会记录文件类型.这就会使后端对文件进行文件头检测.

常见的文件头:

文件类型16进制
html68746D6C3E
zip504B0304
rar52617221
wav57415645

4. 文件后缀黑名单检测

有的后端会检测文件的后缀判断文件后缀,那么就可以修改文件后缀

前提是 中间件能够解析修改的后缀

解决方法:

1.修改后缀法:常用后缀有php2 php3 phtml .等

5. WAF 规则绕过其他方法

  1. 大小写绕过

在 Windows 下,是对大小写不敏感, Test 和 TEST 是一样的东西.

而 Linux 是大小写是敏感的,Test 和 TEST 是不一样的东西.

所以可以尝试大小写绕过

  1. 内容双写

有的防火墙在规则指定的时候,会尝试删除某些内容,比方说标题内有 php 内容,则会尝试删除 php .

所以可以尝试双写,比方说 php 后缀可以改成 pphphp ,那么就会尝试删除中间php.从而绕过.

  1. 后面内容加上 ::$data

在 Windows 里面,上传的文件 test.php::$DATA ,会生成 test.php ,其中上传不会发生改变,并且会解析.

有的 WAF 检测规矩中并没有指定过滤 ::$DATA ,就可以使用这个方法进行绕过.

  1. 路径拼接绕过

前提是服务器为 Windows 系统

文件名称为 test.php. . ,注意两个点之间有空格.在上传的过程中 deldot 会删除最后一个点, 同trim 会删除中间的空格. Windows 会删除第一点,最后变成 test.php ,从而导致成功上传

  1. 0x00 截断后缀白名单

前提: PHP版本小于 5.3.4

0x00 是字符串的结束字符,可以手动添加字符截断.文件系统就会认为是结束的.从而绕过

  1. 提交 .htaccess 文件.

如果防火墙没有禁止 htaccess 文件上传,则可以尝试上传 .htaccess 文件上传

htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess 文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

.htaccess 内容

<FilesMatch "4.jpg">
sethandler application/x-httpd-php
</FilesMatch>

该文件会将目录下的 4.jpg 解析成 php文件

8. 图片马

向图片中植入 php 代码,但是执行较困难,必须要中间件将该文件认为是 php 文件.

除非有有相关的中间件解析漏洞或者有特定的运行 php 的网页,否则要用上面的 .htaccess 修改.

注意:二次渲染

有的防火墙会对图片二次渲染,这时候我们在里面写的代码就会失效,我们可以下载已经二次渲染的图片,然后和源文件进行对比,
往没有修改的地方插入相关代码.

9. 条件竞争

服务端并发处理不当,文件删除操作不及时.可以一直上传文件,直到 webshell 能够访问为止.

解决方法

  1. 控制权限,设定不可执行目录

只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要.

  1. 判断文件类型

在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数(php中调整文件大小),在处理图片的同时破坏图片中可能包含的HTML代码.

  1. 修改文件名字和文件路径

文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

  1. 使用白名单校验.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值