简介

Upload-Lab 是一个广受欢迎的文件上传漏洞学习平台,旨在帮助安全研究人员和开发者理解和防范文件上传攻击。第12关涉及一种经典的攻击手法——Null Byte Injection(%00截断)。这种攻击技术利用了许多编程语言和文件系统在处理字符串时的特性,能够绕过服务器端的安全检查,从而上传恶意文件。

漏洞分析

在许多编程语言中,%00(Null Byte)被视为字符串的终止符。例如,在C语言中,字符串以Null Byte结尾,这意味着字符串处理函数会在遇到%00时停止读取字符。许多Web应用在处理文件上传时,使用类似的方式来判断文件扩展名或其他属性。

通过在文件名中注入%00,可以欺骗服务器的文件类型检测机制,使其认为文件具有安全的扩展名,而实际上文件的真实扩展名可以是恶意的。

php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00

知识补充:

  • strrpos(string,find[,start]): 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)。
  • substr(string,start[,length]):函数返回字符串的一部分。
  • magic_quotes_gpc: 着重偏向数据库方面,是为了防止sql注入,但magic_quotes_gpc开启还会对$_REQUEST, $_GET,$_POST,$_COOKIE 输入的内容进行过滤

这一关使用白名单进行验证,最终文件会以拼接的方式存放。在 PHP 版本小于 5.3.4 且magic_quotes_gpc关闭的情况下,可以使用%00进行截断。

  1. 把PHP的版本调整为5.2.17,如下图所示

修改PHP版本为5.2.17

  1. 通过php.ini文件关闭magic_quotes_gpc,如下图所示:

关闭magic_quotes_gpc

攻击步骤

  1. 创建恶意文件
    我们首先需要创建一个包含恶意代码的文件。例如,一个简单的PHP``WebShell
<?php phpinfo(); ?>
  1. 上传文件

上传shell.php用BP抓包修改参数,把upload/后面加上shell.php%00,并把filename=”shell.php”改为shell.png如下图所示:

  1. 验证上传成功

成功上传后,服务器可能会将文件保存为 shell.php,如下图所示:
上传成功后返回图片地址
访问上传文件的路径,例如 http://localhost/upload/shell.php,如果成功执行了PHP代码,说明攻击成功。

结语

第12关的%00截断攻击展示了文件上传漏洞的一个经典案例。通过学习和理解这种攻击技术,安全研究人员和开发者可以更好地防范类似的漏洞,提升Web应用的安全性。在实际开发中,始终保持警惕,并采用多层次的安全措施,确保系统的安全与稳定。