0x0 绕过前端检测
如何进行前端 JS 检测
- 在客户端使用 JS 脚本判断上传的文件名是否在白名单之内,如果不符合则拒绝上传
- 示例代码:
function validateFile(fileInput) {
const file = fileInput.files[0];
// 检查文件的类型
if (file.type !== 'image/jpeg' && file.type !== 'image/png') {
alert('请选择图片文件');
return false;
}
// 检查文件的大小
if (file.size > 1024 * 1024) {
alert('文件大小不能超过1MB');
return false;
}
// 其他检测
// ...
return true; // 文件符合要求
}
// 监听文件选择变化
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function() {
if (!validateFile(fileInput)) {
fileInput.value = ''; // 清空文件输入框
}
});
- JS 代码通常采用白名单策略,检测文件后缀名。配合表单事件使用。前端 JS 脚本检测的安全防御是十分薄弱的。可以非常轻松的绕过。
- 绕过方法
- 方法一:因为 JS 脚本的运行环境是浏览器,我们可以修改 JS 代码,甚至删除表单事件,禁用 JS。
- 方法二:使恶意文件后缀名符合白名单策略,用 Burp 挂代理抓包,然后修改文件后缀名即可。
0x1 绕过后端检测
00 MIME-TYPE 检测
MIME 概述
MIME(Multipurpose Internet Mail Extensions)是一种在互联网上定义消息内容类型的标准。它最初是为电子邮件系统设计的,用于标识不同类型的邮件和附件内容。随着互联网的发展,MIME也被广泛应用于HTTP协议中传输数据的内容类型标识。
MIME 类型由类型(type)和子类型(subtype)两部分组成,中间用斜杠分隔。例如,text/plain、image/jpeg、application/json 等都是常见的 MIME 类型。
MIME 主要有以下作用和特点:
标识文件类型:MIME 类型可以告诉系统接收到的文件的具体类型,从而决定如何处理文件内容。
- 指定数据编码方式:MIME 类型还可以指定数据的编码方式,比如文本数据可以使用 UTF-8、ISO-8859-1 等形式进行编码。
- 支持多媒体内容:MIME 不仅支持文本类型的内容,还支持多媒体内容,如图片、音频、视频等。
- 在HTTP通信中使用广泛:在HTTP通信中,通过 Content-Type 头部字段指定数据的 MIME 类型,客户端和服务器可以根据该类型进行数据的解析和处理。
总的来说,MIME 在互联网通信中起到了重要的作用,能够帮助系统识别不同类型的数据内容,确保数据的正确解析和处理。
以下是常见的 MIME 类型及其对应的文件拓展名的表格:
MIME 类型 | 文件拓展名 |
text/plain | .txt |
text/html | .html, .htm |
text/css | .css |
text/javascript | .js |
application/json | .json |
image/jpeg | .jpg, .jpeg |
image/png | .png |
image/gif | .gif |
application/pdf | |
application/msword | .doc |
application/vnd.ms-excel | .xls |
application/vnd.ms-powerpoint | .ppt |
application/zip | .zip |
audio/mpeg | .mp3 |
video/mp4 | .mp4 |
- MIME-TYPE 检测 也称 content-type 检测,在服务器端如果上传文件的 MIME-TYPE 与白名单一致,则允许上传
- 示例代码:
function isAllowedMimeType($file) {
$allowedMimeTypes = [
'image/jpeg',
'image/png',
'image/gif',
// 添加其他允许的 MIME 类型
];
$uploadedMimeType = mime_content_type($file['tmp_name']);
if (in_array($uploadedMimeType, $allowedMimeTypes)) {
return true;
} else {
return false;
}
}
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
if (isAllowedMimeType($_FILES['file'])) {
// 文件类型合法,执行上传操作
$uploadPath = 'uploads/' . $_FILES['file']['name'];
move_uploaded_file($_FILES['file']['tmp_name'], $uploadPath);
echo '文件上传成功!';
} else {
echo '不支持的文件类型!';
}
} else {
echo '上传失败!';
}
MIME-TYPE 检测 绕过方法
- 由于服务器在检测 Content-Type 类型的时候,取得的变量来自于用户,所以可以用 Burp 抓包,修改字段使其合法,即可绕过限制上传任意文件。
- 示例:
- 上传一个 php 文件,该文件的 content-type 类型不在白名单中
- 通过 Burp 抓包修改这个字段,改为常见的图片类型,如 image/jpeg,从而绕过校验
01 文件内容检测
什么是文件头?
- 文件头是一个数据块,通常位于文件的开头,其中包含有关文件内容和格式的信息。文件头通常包含文件的魔数(Magic Number)和其他元数据,以帮助计算机系统识别并正确解释文件内容。文件头还可以包含文件的版本号、编码方式、文件大小等信息,以确保文件能够被正确解析和处理。文件头在不同类型的文件中具有不同的格式和结构。
- 常见的图片格式文件头
图片格式 | 文件头 |
JPEG | FF D8 |
PNG | 89 50 4E 47 0D 0A 1A 0A |
GIF | 47 49 46 38 39 61 (“GIF89a“) 或 47 49 46 38 37 61 (“GIF87a”) |
BMP | 42 4D (“BM”) |
TIFF | 49 49 2A 00 或 4D 4D 00 2A |
文件头检测
文件头检测是通过读取文件开头的几个字节来确定文件类型的一种技术。每种文件格式都有特定的文件头信息,因此可以通过读取文件头部分的字节来确定文件类型,并进一步对文件进行正确解析和处理。
文件头检测的一般步骤如下:
- 读取文件的前几个字节(通常是几个字节)。
- 根据读取到的字节与各种文件格式的文件头信息进行比对。
- 如果匹配成功,则确定文件类型,可以根据文件格式的规范进一步处理文件。
- 如果匹配失败,则无法确定文件类型,可能是未知格式或者文件损坏。
文件头检测是许多文件识别和处理程序中常用的技术,可以确保正确处理各种类型的文件,避免因文件类型不匹配而导致的错误。
文件内容检测的绕过方法 :通过伪造合法的文件头可以绕过这种检测。通常检测函数根据文件的前 10 个字节,就可以判断出文件的类型,而图片的文件头一般都是固定的
在恶意脚本前加上文件头即可,如 GIF89a
制作图片马,可以通过命令行生成 , 当然这要配合解析漏洞或文件包含漏洞使用
windows:
linux:
使用 010 editor 等编辑工具打开一张图片,在图片中加上 webshell 脚本
在恶意脚本前加上文件头即可,如 GIF89a
制作图片马,可以通过命令行生成 , 当然这要配合解析漏洞或文件包含漏洞使用
windows:
copy 1.jpg/b + 1.php/a 2.jpg
linux:
cp 1.jpg/b + 1.php/a 2.jpg
使用 010 editor 等编辑工具打开一张图片,在图片中加上 webshell 脚本
02 黑名单检测
基于黑名单验证:当上传的文件后缀名是在黑名单中没有的后缀名,文件才能上传成功
- 代码中 $blacklist 数据就是一个黑名单,数组元素就是不允许上传的类型
- 函数通过获取上传文件的文件后缀名来判断文件是否在黑名单中。如果文件后缀名在黑名单数组中,则返回true表示文件不允许上传;否则返回false表示文件可以上传。最后通过调用函数传入上传文件名来检测文件类型是否在黑名单中,根据返回结果输出相应的提示信息。
function checkBlacklist($fileName) {
// 定义黑名单文件类型数组
$blacklist = array("exe", "bat", "sh", "php", "aspx");
// 获取上传文件的后缀名
$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);
// 检查上传文件的后缀名是否在黑名单中
if (in_array($fileExt, $blacklist)) {
// 文件在黑名单中
return true;
} else {
// 文件不在黑名单中
return false;
}
}
// 调用函数检测上传文件是否在黑名单中
$uploadedFileName = "example.php";
if (checkBlacklist($uploadedFileName)) {
echo "文件在黑名单中,不允许上传。";
} else {
echo "文件不在黑名单中,可以上传。";
}
00 绕过黑名单检测
- 大小写、双写绕过
- 用像 AsP,pHp,phphpp 之类的文件名,如果黑名单上不存在的话就可以绕过黑名单检测
- 过滤严格的话一般会用类似 strtolower() 函数把后缀名全变为小写,此时就不能绕过黑名单了
- 特殊文件名绕过
- Windows 系统下 :
- 上传不符合 windows 文件命名规则的文件名,会被 windows 系统自动去掉不符合规则符号后面的内容
- Windows 系统下 :
test.asp.
test.asp(空格)
test.php:1.jpg
shell.php::$DATA……..
test.asp(空格)
test.php:1.jpg
shell.php::$DATA……..
- 黑名单不全
- 尝试更多不常用的可以被正常解析的后缀
php3 \ php5 \ phtml \ asp.cer \ aspx \ asmx
- 尝试更多不常用的可以被正常解析的后缀
03 白名单检测
基于白名单验证:当上传的文件后缀名是在白名单中有的后缀名,文件才能上传成功
- 代码中 $whitelist 数据就是一个白名单,数组元素就是允许上传的类型
- 通过获取上传文件的文件后缀名并将其转换为小写,函数判断文件类型是否在白名单中。如果文件类型在白名单数组中,则返回true表示可以上传;否则返回false表示不允许上传。最后通过调用函数传入上传的文件名来检测文件类型是否在白名单中,并根据结果输出相应的提示信息。
function isFileInWhitelist($fileName) {
// 指定白名单文件类型
$whitelist = array("jpg", "jpeg", "png", "gif");
// 获取上传文件的后缀名
$fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
// 检查文件后缀是否在白名单中
if (in_array($fileExtension, $whitelist)) {
return true; // 文件在白名单中
} else {
return false; // 文件不在白名单中
}
}
// 调用函数进行文件上传白名单检测
$uploadedFileName = "example.jpg";
if (isFileInWhitelist($uploadedFileName)) {
echo "上传的文件类型在白名单中,可以上传。";
} else {
echo "上传的文件类型不在白名单中,不允许上传。";
}
00 绕过白名单检测
- 白名单策略相比黑名单策略更安全,但依然可以被绕过
00 解析漏洞
- 什么是文件解析
- 是指当服务器接收到一个 HTTP 请求的时候,web 容器(如 IIS、Apache)首先会根据文件的后缀名,决定如何处理这个请求
- 当服务器获取到所请求的页面的后缀(如 php)后,接下来就会在服务器端寻找可以处理这类后缀名的应用程序,如果找不到则直接把这个文件返还给客户端
- 漏洞的利用
- 由于中间件(如 IIS、 Apache)本身的缺陷,在对上传文件进行解析时会出现一些不可预料的错误从而导致被利用进行文件上传绕过
- 常见的解析漏洞
- Apache 解析漏洞
- IIS6.0 解析漏洞
- PHP CGI 解析漏洞
- Nginx 解析漏洞
00 Apache 解析漏洞
- 多后缀
- 存在的版本:Apache1.x 和 Apache2.x,2.4不存在此漏洞
- 解析规则:从右向左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断,若都不认识,则会暴露源码
- 举例:
- 可以上传一个 test.php.aaa.bbb 文件,绕过验证且服务器依然会将其解析为 php
- 访问/ test.php.aaa.bbb,由于 Apache 不认识 aaa 和 bbb,会从右向左一直谝历到后缀 .php 为止
- apache 能够识别的文件在 mime.types 文件可以查看
- 修复方案:后缀验证尽量使用白名单的方式,这样即使使用不存在的后缀名,也无法绕过
- 配置问题导致漏洞
- 漏洞产生原因:
- 如果在 Apache 的 conf 里有这样一行配置
AddHandler php5- script .php
这时只要文件名里包含.php,即使文件名是 test2.php.jpg 也会以 php 来执行 - 如果在 Apache 的 conf 里有这样一行配置
AddType application/x-httpd-php .jpg
即使扩展名是 jpg,一样能以 php 方式执行
- 如果在 Apache 的 conf 里有这样一行配置
- 修复方案 :
- 在 apache 配置文件中,禁止.php. 这样的文件执行,配置文件里面加入
- 用伪静态能解决这个问题,重写类似 php 这类文件,打开 apache 的 httpd.conf 找到
- 漏洞产生原因:
- htaccess 文件解析
- .htaccess 文件可以配置很多事情,如是否开启站点的图片缓存、自定乂错误页面、自定义默认文档、等等。但我们这里只关心 htaccess 文件的一个作用 ———— MIME 类型修改
- 如果 Apache 中 .htaccess 可被执行并可被上传,那么可以尝试在 .htaccess 中写入
<FilesMatch"sheLl.jpg"> SetHandler application/x-httpd-php </FilesMatch>
,该语句会让 Apache 把 shell.jpg 文件当作 php 文件来解析 - 另一种写法是:
AddType application/x-httpd-php .xxx
,如果写入,就成功地使该 .htaccess 文件所在**目录及其子目录**中的后缀为.xxx 的文件被 Apache 当做 php 文件
01 IIS6.0 解析漏洞
- 目录解析
- 形式:/x.asp/x.jpg
- 原理:在网站下创建文件夹名字为**.asp**、.asa的文件夹,其目录内的任何扩展名的文件都被当作 asp 文件来解析并执行。因此只要攻击者只需通过该漏洞上传图片马,不用修改后缀名
- 文件解析
- 形式:/x.asp;.jpg (利用特殊符号”;”)
- 原理:在 IIS6.0 下,服务器默认不解析; 号后面的内容,所以 xx.asp;.jpg 被解析为 asp 脚本
- 解析文件类型
- 形式:/ test.asa、/test.cer、/test.cdx
- 原理:IIS6.0 默认的可执行文件除了 asp,还包含这三种 asa、cer、cdx,会将这三种扩展名文件解析为 asp 文件
- 修复:
- 目前尚无微软官方补丁,可以通过自己编写正则,阻止上传 xx.asp;.jpg 类型的文件名
- 做好权限设置,限制用户创建文件夹
02 路径修复漏洞
- 别名:PHP CGI 解析漏洞 或 畸形解析漏洞
- 适用于:IIS7.0 / IIS7.5 / Nginx1.x
- 利用条件:
- Fast-CGI 运行模式
- php. ini 里 cgi.fix_pathinfo=1 (默认为 1)
- 取消勾选 php-cgi.exe 程序的 “lnvoke handler only if request is mapped to”
- 形式:如果在一个文件路径 /xx.jpg 后面加上/xx.php 会将 /xx.jpg/xx.php 解析为 php 文件。
- cgi.fix_pathinfo,该值为 1,表示开启
- 开启这一选项 PHP 可以对文件路径进行“修理”。举个例子,当 php 遇到文件路径 “/1.jpg/2.txt/3.php” 时,若 “/1.jpg/2.txt/3.php” 不存在,则会去掉最后的 “/3.php”,然后判断 “/1.jpg/2.txt” 是否存在,若存在,则把 “/1.jpg/2.txt” 当做文件 “/1.jpg/2.txt/3.php”,若 “/1.jpg/2.txt”仍不存在,则继续去掉 “/2.txt”,以此类推
- 修复方法:
- 配置 php.ini 里 cgi.fⅸ_patinfo=0,并重启服务器
- 在模块映射中勾选请求限制
01 配合文件包含绕过
- 利用文件包含漏洞,包含一个正常白名单文件,例如包含图片马
02 00截断
- 原理:0x00 是字符串的结束标识符,可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测,00 就是 Null(空)字符,∪RL 中表现为 %00
- 利用条件
- php 版本小于 5.3.4
- php 的 magic_quotes_gpc 为 OFF 状态
- 方法:
- 知道上传路径:用 burp 抓包在上传路径后面加上 1.php%00,然后将 %00 进行 url 编码
- 不知道上传路径:文件名改为 1.php+.jpg,这个 + 其实就是个标识作用,burp 抓包后,用 hex 打开将 + 的数值改为 00
03 编辑器漏洞
- 什么是编辑器?
- 编辑器就是网站后台编辑网页的在线编辑器,自动集成了文件上传、图片视频上传、远程下载等功能,减少了程序开发的时间
- 编辑器比网站自带的上传按钮安全性髙,但这些编辑器某些版本存在文件上传漏洞,因此也存在通用型漏洞带来的危害
- 常见的文本编辑器
- FCKeditor
- Ewebeditor
- Ueditor
- KindEditor
- XHeditor
- …..
这里以 FCKeditor 为例:
- FCKeditor 是一款开放源码的 HTML 文本编辑器,可以为用户提供微软 office 软件一样的在线文档编辑服务。
- FCKeditor 不需要安装任何形式的客户端,且兼容绝大多数主流浏览器,支持 PHP、jsp、asp、 python 等编程环境
- FCKeditor 各个版本的漏洞
- Version.2.2版本:Apache+linux环境下在上传文件后面加个突破
- Version<=2.4.2 for php :上传的地方并未对Media类型进行上传文件类型的控制,导致用户上传任意文件
- Version<=v2.4.3:FCKeditor被动限制策略所导致的过滤不严问题
- 较高版本:FCKeditor文件上传“.”变”_”下划线
- FCKeditor 编辑器文件上传漏洞
- 以较高版本为例,文件上传 “.” 变 “_” 下划线:
- 查看编辑器版本,使用以下两种方法判断 FCKeditor 版本:
- /fckeditor/editor/dialog/fck_about.html
- /fckeditor/_whatsnew.html
- FCKeditor 中 test 文件的上传地址
- test 文件常见上传地址:
fckeditor/editor/filemanager/connectors/test.html
fckeditor/editor/filemanager/connectors/upload/test.html
fckeditor/editor/filemanager/browser/default/connectors/test.html
fckeditor/editor/filemanager/upload/test.html
- 在上传页面创建一个文件夹 test.asp,结果却变成了 test_asp
- 由于直接创建失败,进行文件夹图谱,方法就是:递归创建,二次创建。这样一级目录名就不会变为”_”下划线
- 在一级目录 test.asp 中上传一个木马。然后就可以 getshell 了
04 PUT 请求上传
- 某些情况下,可以尝试 PUT 请求上传文件,实际场景中遇到的概率比较低
© 版权声明
THE END
暂无评论内容