文件上传漏洞成立需要满足一定的条件。上传的文件能够被web容器解释执行,并且文件上传后所在的目录要是web容器所覆盖到的路径。用户需要能够从web访问这个文件;用户无法通过web访问文件,或者web容器不能解释脚本,也可能导致攻击不成功。
服务器端验证文件类型的方式一般有两种:
- 直接读取文件扩展名
- 解析文件头部信息
使用目录遍历
构造模糊目录遍历序列,将文件上传至父文件夹。
filename="..%2fexploit.php"
修改文件MIME类型
使用 Burp Suite 修改 Content-Type 字段的值。例如将POST请求体中文件MIME类型修改为 Content-Type: image/jpeg。
使用别名
- 将
.php改为.php5。 - 将
.html改为.shtml。
这样可以绕过不严谨的黑名单过滤。
覆写 .htaccess 文件
.htaccess 是一个用于配置 Apache Web 服务器的配置文件。它允许网站管理员在网站的根目录或特定目录中定义一些规则和设置,以控制网站的行为和访问权限。这些规则可以包括重定向、认证、访问控制、缓存设置等。
-
SetHandler指令用于为特定文件扩展名或文件类型指定处理程序(handler),强制所有被匹配的文件被指定的方法处理。SetHandler handler-name如果想将目录下的
hello.jpg全部视为 PHP 文件执行,则可以这么写:<FilesMatch "hello.jpg"> SetHandler application/x-httpd-php </FilesMatch> -
AddType指令用于将媒体类型(MIME 类型)与特定文件扩展名关联起来。媒体类型描述了文件的内容类型,使浏览器能够正确显示或处理文件。AddType media-type extensionmedia-type是要关联的媒体类型(MIME 类型),extension是文件的扩展名。如果想让服务器将
png和jpg按 PHP 解析,则可以这么写:AddType application/x-httpd-php png jpg -
php_flag对 PHP 的 engine 配置选项进行设定,当把 engine 的值设为off或0时可以禁用本目录和子目录中的 PHP 解析,这将会造成源码泄露。php_flag engine 0
使用混淆的文件扩展名
-
拼接多个扩展名绕过:
shell.php.php -
尾部添加字符:
shell.php. -
尾部添加空格:
shell.php -
使用URL编码对
.编码:shell%2Ephp -
空字符绕过:
shell.asp%00.jpg空字符(null byte)
空字符在一些编程语言和操作系统中被用作字符串的结束符,因此它可能导致一些处理函数错误地截断字符串,从而引发安全隐患。当攻击者将
%00插入文件名时,服务器可能会错误地将文件名截断,导致实际上传的文件类型和位置与预期不符,从而可能绕过某些安全检查。 -
分号绕过:
shell.asp;.jpg在某些应用程序中,分号可能被用作参数或参数值之间的分隔符,例如在 URL 参数中或某些脚本中。这样,攻击者可能会尝试在输入中插入分号,以分隔多个参数或值,从而扰乱应用程序的解析逻辑。
-
使用多字节 Unicode 字符。
-
双写绕过:
shell.p.phphp,在这个 Payload 中,.php很有可能被过滤,那么在.php被过滤之后,剩下的就是shell.php。