一、文件后缀名验证
(一)验证方式分类
- 基于白名单验证:只允许上传白名单中指定后缀名的文件。
- 基于黑名单验证:只允许上传黑名单中未包含后缀名的文件。
(二)实验准备
- 修改 Apache 的 httpd - conf 文件。
- 运行 phpStudy,并确保 Apache 和 MySQL 处于启动状态。
(三)基于黑名单验证代码分析
以下是一段常见的黑名单验证代码示例:
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array("asp", "aspx", "php", "jsp");$file_name = trim($_FILES['upload_file']["name"]);$file_name = deldot($file_name); //删除文件名末尾的点$file_ext = strrchr($file_name, '.');$file_ext = strtolower($file_ext); //转换为小写$file_ext = str_ireplace("::SDATA", "", $file_ext); //去除字符串::SDATA$file_ext = trim($file_ext); //收尾去空if (!in_array($file_ext, $deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH. '/'. date("YHis"). rand(1000, 9999). $file_ext;} else {if (move_uploaded_file($temp_file, $img_path)) {$msg = '上传出错!';$is_upload = true;}}} else {$msg = UPLOAD_PATH. '文件夹不存在,请手工创建!';}
}
从这段代码可以看出,它对黑名单中的后缀名进行了筛选。
二、绕过黑名单验证的方法
(一)利用 Burpsuite 工具
- 原理
- 截断 HTTP 请求,利用 Intruder 模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名。
- 操作示例
- 以上传一个包含恶意代码
<?php @eval($_POST["cmd"]);?>
的文件为例,假设文件名为ebshell.phtm
(这里的.phtm
可能不在黑名单中)。 - 通过 Burpsuite 截断请求后,在 Intruder 模块中尝试不同的后缀名组合,找到可以绕过验证的后缀名并上传文件。
- 以上传一个包含恶意代码
(二).htaccess 文件
- .htaccess 文件介绍
- 它是 Apache 服务器中的一个配置文件,负责相关目录下的网页配置。
- 可以实现网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许 / 阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
- 利用.htaccess 绕过黑名单验证
- 审计黑名单过滤代码时发现,有些情况下黑名单中没有对.htaccess 进行过滤。
- 可以直接上传.htaccess 文件,文件内容设置为
SetHandler application/x - httpd - php
,这样当前目录所有文件都将使用 PHP 解析,无论上传什么文件,只要内容符合 PHP 语言代码规范,就会被当作 PHP 执行。 - 例如制作一个图片 phpinfo 探针,将以下代码保存为 1.jpg 并上传:
<?php
phpinfo();
?>
在.htaccess 文件作用下,1.jpg 会被解析为 PHP 文件并执行。
(三)大小写绕过
- 原理
- 在 Windows 系统下,对于文件名中的大小写不敏感。例如:test.php 和 TeSt.PHP 是一样的。而在 Linux 系统下,对于文件名中的大小写敏感。
- 基于黑名单验证代码分析及利用
- 分析黑名单验证代码时发现,有些代码可能缺少对上传文件名获取的小写转换。
- 例如,如果黑名单中增加了.htaccess 的验证,但没有进行小写转换,就可以直接修改文件后缀名如 PhP(大写)进行上传,可能会绕过验证。
(四)直接修改后缀名上传
- 方法介绍
- 文件后缀名不一定必须在 Burpsutie 截断的 HTTP 请求中修改,可以直接修改文件后缀名进行上传。
- 示例
- 如将文件后缀名修改为 PhP 后上传到
http://127.0.0.1/ileupload/upload//201812031006544907.PhP
。
- 如将文件后缀名修改为 PhP 后上传到
学习感想
学习 Web 安全中的任意文件操作知识,让我深刻认识到网站安全的重要性和复杂性。在文件上传这个看似简单的功能背后,隐藏着许多潜在的安全风险。
通过了解不同的验证方式以及绕过黑名单验证的各种方法,我意识到黑客可能会利用这些漏洞进行攻击。这也提醒我在开发网站时,要更加严谨地对待文件上传功能的设计和验证。
同时,学习这些知识也让我明白,安全是一个动态的过程,需要不断地学习和更新知识,以应对不断变化的网络安全威胁。只有深入了解这些攻击手段,才能更好地采取措施进行防范,确保网站的安全稳定运行。
希望这些笔记能够帮助其他小白更好地理解和掌握 Web 安全中的任意文件操作知识,共同提高网站的安全防护能力。