文件上传

漏洞原理

服务端对文件上传的类型未做限制或者不严谨导致攻击者可以上传其他类型的文件。

通常是尝试上传服务端可解析的脚本文件,也就是 webShell,来拿到网站权限。

不过也可以根据情况来有一些其他的利用:

  • 上传处可目录穿越,覆盖或创建特殊文件
  • 上传 svg、html 等造成 XSS 跨站
  • 上传一个超大的文件,造成拒绝服务漏洞
  • ….

该漏洞需要考虑的是如何去绕过上传限制,从而上传 webshell,所以是从文件上传过滤来入手。

上传过滤

  • 后缀名过滤
    • 前端
    • 白名单
    • 黑名单
  • 文件内容过滤
    • MIME
    • 文件头
    • 关键字

绕过方法

后缀名过滤

前端过滤

  • 禁用 、修改 JS
  • 合法后缀上传,抓包修改文件名

黑名单

黑名单就是应用程序定义一个不允许上传的后缀名列表,然后获取上传文件的后缀,与之进行匹配,在黑名单中就禁止上传。

  • 特殊可解析后缀
  • 点绕过
  • 大小写绕过
  • 双写绕过
  • 空格绕过
  • 文件名可控绕过
  • ::$DATA
  • .user.ini
  • .htaccess
::$DATA

在 windows 环境中会把 ::$DATA 之后的数据当文件流处理,而不是属于文件名。

1
shell.php::$DATA.png
.htaccess

前提条件:Apache 开启了 rewrite 模块

原理:在访问文件时,重写指定文件的扩展名

比如该 .htaccess 作用为在访问 evil.gif 时,让 apache 将其解析为 PHP 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<IfModule mime_module>
AddHandler php5-script .gif
SetHandler application/x-httpd-php
</IfModule>

<FilesMatch "evil.gif">
SetHandler application/x-httpd-php
AddHandler php5-script .gif
</FilesMatch>

<IfModule mime_module>
AddType application/x-httpd-php .gif
</IfModule>
.user.ini

user.ini 文件构成的 PHP 后门

其原理是可以通过 .user.ini 指定一个文件,让与 .user.ini 同目录下的 PHP 文件都自动包含该文件。

利用的话,上传 .user.ini 然后访问同目录下的一个 PHP 文件即可。

1
auto_prepend_file=1.gif

白名单

  • 00 截断
  • 解析漏洞
00 截断

原理:00 其实最后都被解析为 chr(0),其代表一个空字符,当一个字符串中存在空字符时,在被解析的时候空字符后面的字符会被丢弃,导致绕过后面的合法后缀被丢弃。

利用:在要截断的地方加一个空格,如 shell.php .png,然后查看 Hex 编码,修改空格对应的 2000

解析漏洞

image-20230905115733008

内容过滤

  • 伪造 MIME
  • 伪造文件头
  • 绕过滤
伪造 MIME

这个 MIME 就是请求头的 Content-Type 字段,这里直接伪造即可:

  • image/jpeg
  • image/png
  • image/apng
  • image/avif
  • image/gif
  • image/svg+xml
  • image/webp
伪造文件头

文件头是 POST 数据的开头那里,gif 文件头都是可打印字符 GIF89a,其他的可以直接获取一个图片。

绕过滤

这里的过滤其实就是后端有一个正则匹配,比如匹配 php、eval 字段,这个绕过其实就上传免杀马就行。

漏洞挖掘

黑盒测试:

  • 找到文件上传处,手动测试绕过
  • 看是否有 Nday,如第三方编辑器漏洞

白盒测试:

  • 通过文件上传功能点,找代码看是否存在过滤

文件上传
https://liancccc.github.io/2024/03/15/技术/TOP10/文件上传/
作者
守心
发布于
2024年3月15日
许可协议