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

代码审计(1):CVE-2022-4957分析及复现

0x00漏洞描述:

ѕрееdtеѕt iѕ а vеrу liɡhtԝеiɡht nеtԝоrk ѕрееd tеѕtinɡ tооl imрlеmеntеd in Jаvаѕсriрt. Thеrе iѕ а Crоѕѕ-ѕitе Sсriрtinɡ vulnеrаbilitу in librеѕроndеd ѕрееdtеѕt 5.2.4 аnd еаrliеr vеrѕiоnѕ. Thе vulnеrаbilitу iѕ саuѕеd bу thе раrаmеtеr id оf thе filе rеѕultѕ/ѕtаtѕ.рhр thаt ԝill саuѕе Crоѕѕ-ѕitе Sсriрtinɡ.

0x01 分析:

先到Github把ѕрееdtеѕt的5.2.4版本的源代码下下来,然后直接看rеѕultѕ/ѕtаtѕ.рhр文件:

<?php
session_start();
error_reporting(0);require 'telemetry_settings.php';
require_once 'telemetry_db.php';header('Content-Type: text/html; charset=utf-8');
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0, s-maxage=0');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
?>
<!DOCTYPE html>
<html><head><title>LibreSpeed - Stats</title><style type="text/css">html,body{margin:0;padding:0;border:none;width:100%; min-height:100%;}html{background-color: hsl(198,72%,35%);font-family: "Segoe UI","Roboto",sans-serif;}body{background-color:#FFFFFF;box-sizing:border-box;width:100%;max-width:70em;margin:4em auto;box-shadow:0 1em 6em #00000080;padding:1em 1em 4em 1em;border-radius:0.4em;}h1,h2,h3,h4,h5,h6{font-weight:300;margin-bottom: 0.1em;}h1{text-align:center;}table{margin:2em 0;width:100%;}table, tr, th, td {border: 1px solid #AAAAAA;}th {width: 6em;}td {word-break: break-all;}div {margin: 1em 0;}</style></head><body><h1>LibreSpeed - Stats</h1><?phpif (!isset($stats_password) || $stats_password === 'PASSWORD') {?>Please set $stats_password in telemetry_settings.php to enable access.<?php} elseif ($_SESSION['logged'] === true) {if ($_GET['op'] === 'logout') {$_SESSION['logged'] = false;?><script type="text/javascript">window.location=location.protocol+"//"+location.host+location.pathname;</script><?php} else {?><form action="stats.php" method="GET"><input type="hidden" name="op" value="logout" /><input type="submit" value="Logout" /></form><form action="stats.php" method="GET"><h3>Search test results</h3><input type="hidden" name="op" value="id" /><input type="text" name="id" id="id" placeholder="Test ID" value=""/><input type="submit" value="Find" /><input type="submit" onclick="document.getElementById('id').value=''" value="Show last 100 tests" /></form><?phpif ($_GET['op'] === 'id' && !empty($_GET['id'])) {$speedtest = getSpeedtestUserById($_GET['id']);$speedtests = [];if (false === $speedtest) {echo '<div>There was an error trying to fetch the speedtest result for ID "'.$_GET['id'].'".</div>';} elseif (null === $speedtest) {echo '<div>Could not find a speedtest result for ID "'.$_GET['id'].'".</div>';} else {$speedtests = [$speedtest];}} else {$speedtests = getLatestSpeedtestUsers();if (false === $speedtests) {echo '<div>There was an error trying to fetch latest speedtest results.</div>';} elseif (empty($speedtests)) {echo '<div>Could not find any speedtest results in database.</div>';}}foreach ($speedtests as $speedtest) {?><table><tr><th>Test ID</th><td><?= htmlspecialchars($speedtest['id_formatted'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Date and time</th><td><?= htmlspecialchars($speedtest['timestamp'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>IP and ISP Info</th><td><?= htmlspecialchars($speedtest['ip'], ENT_HTML5, 'UTF-8') ?><br/><?= htmlspecialchars($speedtest['ispinfo'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>User agent and locale</th><td><?= htmlspecialchars($speedtest['ua'], ENT_HTML5, 'UTF-8') ?><br/><?= htmlspecialchars($speedtest['lang'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Download speed</th><td><?= htmlspecialchars($speedtest['dl'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Upload speed</th><td><?= htmlspecialchars($speedtest['ul'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Ping</th><td><?= htmlspecialchars($speedtest['ping'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Jitter</th><td><?= htmlspecialchars($speedtest['jitter'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Log</th><td><?= htmlspecialchars($speedtest['log'], ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Extra info</th><td><?= htmlspecialchars($speedtest['extra'], ENT_HTML5, 'UTF-8') ?></td></tr></table><?php}}} elseif ($_GET['op'] === 'login' && $_POST['password'] === $stats_password) {$_SESSION['logged'] = true;?><script type="text/javascript">window.location=location.protocol+"//"+location.host+location.pathname;</script><?php} else {?><form action="stats.php?op=login" method="POST"><h3>Login</h3><input type="password" name="password" placeholder="Password" value=""/><input type="submit" value="Login" /></form><?php}?></body>
</html>

直接看第89行的漏洞点:

 <?phpif ($_GET['op'] === 'id' && !empty($_GET['id'])) {$speedtest = getSpeedtestUserById($_GET['id']);$speedtests = [];if (false === $speedtest) {echo '<div>There was an error trying to fetch the speedtest result for ID "'.$_GET['id'].'".</div>';} elseif (null === $speedtest) {echo '<div>Could not find a speedtest result for ID "'.$_GET['id'].'".</div>';} else {$speedtests = [$speedtest];}} else {$speedtests = getLatestSpeedtestUsers();if (false === $speedtests) {echo '<div>There was an error trying to fetch latest speedtest results.</div>';} elseif (empty($speedtests)) {echo '<div>Could not find any speedtest results in database.</div>';}}foreach ($speedtests as $speedtest) {?>

当接收参数op=id,参数id=空或者flase时,直接将$_GET[‘id’]拼接到HTML代码中,导致了一个反射型的XSS。

0x02 复现

直接docker pull下来官方镜像,把里面的内容换成5.2.4版本的代码,然后点击登录:
在这里插入图片描述
这里由于stats.php的代码里有一句:

<?phpif (!isset($stats_password) || $stats_password === 'PASSWORD') {?>Please set $stats_password in telemetry_settings.php to enable access.<?php} elseif ($_SESSION['logged'] === true) {if ($_GET['op'] === 'logout') {$_SESSION['logged'] = false;?><script type="text/javascript">window.location=location.protocol+"//"+location.host+location.pathname;</script><?php

因此,还要到telemetry_settings.php里去把$stats_password改掉。
登录进去之后输入payload:
在这里插入图片描述
利用成功:
在这里插入图片描述

0x03利用条件

1.知道stats.php的登录密码
2.目标给results文件夹配置了php执行的权限(实际上很多目标都没有给results文件夹php文件的解析权限)
3.反射型XSS,必须要与目标有交互
4.版本有极大限制,仅限于5.2.3和5.2.4版本,如5.2.2版本就不存在这个问题:

<?php$q=null;if($_GET["op"]=="id"&&!empty($_GET["id"])){$id=$_GET["id"];if($enable_id_obfuscation) $id=deobfuscateId($id);if($db_type=="mysql"){$q=$conn->prepare("select id,timestamp,ip,ispinfo,ua,lang,dl,ul,ping,jitter,log,extra from speedtest_users where id=?");$q->bind_param("i",$id);$q->execute();$q->store_result();$q->bind_result($id,$timestamp,$ip,$ispinfo,$ua,$lang,$dl,$ul,$ping,$jitter,$log,$extra);} else if($db_type=="sqlite"||$db_type=="postgresql"){$q=$conn->prepare("select id,timestamp,ip,ispinfo,ua,lang,dl,ul,ping,jitter,log,extra from speedtest_users where id=?");$q->execute(array($id));} else die();}else{if($db_type=="mysql"){$q=$conn->prepare("select id,timestamp,ip,ispinfo,ua,lang,dl,ul,ping,jitter,log,extra from speedtest_users order by timestamp desc limit 0,100");$q->execute();$q->store_result();$q->bind_result($id,$timestamp,$ip,$ispinfo,$ua,$lang,$dl,$ul,$ping,$jitter,$log,$extra);} else if($db_type=="sqlite"||$db_type=="postgresql"){$q=$conn->prepare("select id,timestamp,ip,ispinfo,ua,lang,dl,ul,ping,jitter,log,extra from speedtest_users order by timestamp desc limit 100");$q->execute();}else die();}while(true){$id=null; $timestamp=null; $ip=null; $ispinfo=null; $ua=null; $lang=null; $dl=null; $ul=null; $ping=null; $jitter=null; $log=null; $extra=null;if($db_type=="mysql"){if(!$q->fetch()) break;} else if($db_type=="sqlite"||$db_type=="postgresql"){if(!($row=$q->fetch())) break;$id=$row["id"];$timestamp=$row["timestamp"];$ip=$row["ip"];$ispinfo=$row["ispinfo"];$ua=$row["ua"];$lang=$row["lang"];$dl=$row["dl"];$ul=$row["ul"];$ping=$row["ping"];$jitter=$row["jitter"];$log=$row["log"];$extra=$row["extra"];}else die();?><table><tr><th>Test ID</th><td><?=htmlspecialchars(($enable_id_obfuscation?(obfuscateId($id)." (deobfuscated: ".$id.")"):$id), ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Date and time</th><td><?=htmlspecialchars($timestamp, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>IP and ISP Info</th><td><?=$ip ?><br/><?=htmlspecialchars($ispinfo, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>User agent and locale</th><td><?=$ua ?><br/><?=htmlspecialchars($lang, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Download speed</th><td><?=htmlspecialchars($dl, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Upload speed</th><td><?=htmlspecialchars($ul, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Ping</th><td><?=htmlspecialchars($ping, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Jitter</th><td><?=htmlspecialchars($jitter, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Log</th><td><?=htmlspecialchars($log, ENT_HTML5, 'UTF-8') ?></td></tr><tr><th>Extra info</th><td><?=htmlspecialchars($extra, ENT_HTML5, 'UTF-8') ?></td></tr></table><?php}?>

综合评价:利用条件极其苛刻,鸡肋漏洞。这种洞居然也是CVE,我真是服了。

相关文章:

代码审计(1):CVE-2022-4957分析及复现

0x00漏洞描述&#xff1a; ѕрееdtеѕt iѕ а vеrу liɡhtԝеiɡ&#xff48;t nеtԝоrk ѕрееd tеѕtinɡ tооl imрlеmеntеd in Jаvаѕсriрt. Thеrе iѕ а Crоѕѕ-ѕitе Sсriрtinɡ vulnеrаbilitу in librеѕроndеd ѕрееdtеѕt…...

问题:设备管理指标为完好率不低于( ),待修率不高于5%,事故率不高于1%。 #知识分享#经验分享#经验分享

问题&#xff1a;设备管理指标为完好率不低于( )&#xff0c;待修率不高于5%&#xff0c;事故率不高于1%。 A、100% B、95% C、90% D、80% 参考答案如图所示...

【Linux】(六)—— vim编辑器

vim文件编辑器 Vim&#xff08;Vi Improved&#xff09;是一个高度可配置的文本编辑器&#xff0c;最初基于UNIX下的Vi编辑器发展而来&#xff0c;广泛用于程序开发和系统管理中。vim编辑器可以只通过终端命令即可编写修改文件&#xff0c;不需要和gedit一样需要打开类似于记事…...

06016传感器原理与应用202207

06016传感器原理与应用202207 选择题&#xff08;2*11&#xff09; 1.基本的电子测量系统由四部分组成&#xff0c;即电源、信号调节、显示系统和B&#xff08;P7&#xff09; A.分档器 B.传感器 C.处理器 D.采集器 2.热电阻温度计的测量电路采用精度较高的是B&am…...

java web:springboot mysql开发的一套家政预约上门服务系统源码:家政上门服务系统的运行流程

java web&#xff1a;springboot mysql开发的一套家政预约上门服务系统源码&#xff1a;家政上门服务系统的运行流程 家政上门服务系统的优势 服务质量更稳定&#xff1a;由专业的家政人员提供服务&#xff0c;经过严格的培训和筛选。 价格更透明&#xff1a;采用套餐式收费&…...

二叉树的后序遍历-力扣

二叉树的后序遍历&#xff0c;指首先遍历二叉树的左节点&#xff0c;然后遍历二叉树的右节点&#xff0c;最后遍历中间节点。按照顺序进行递归遍历即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *rig…...

C++基础编程100题-008 OpenJudge-1.3-06 甲流疫情死亡率

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/06/ 描述 甲流并不可怕&#xff0c;在中国&#xff0c;它的死亡率并不是很高。请根据截止2009年12月22日各省报告的甲流确诊数和死亡数&#xff0c;计算甲流在各省的死亡率。 输入 输入仅一行&#xff…...

计算机网络 ——网络层(IPv4地址)

计算机网络 ——网络层&#xff08;IPv4地址&#xff09; 什么是IPv4地址IP地址的分类特殊的IP地址 查看自己的IPv4地址 我们今天来看IPv4地址&#xff1a; 什么是IPv4地址 IPv4&#xff08;Internet Protocol version 4&#xff09;是第四版互联网协议&#xff0c;是第一个被…...

重写mybatisPlus自定义ID生成策略

1.项目中需要引入mybatisplus核心组件 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mp.version}</version></dependency> 2.新建一个类实现IdentifierGenera…...

华为坤灵路由器配置SSH

配置SSH服务器的管理网口IP地址。 <HUAWEI> system-view [HUAWEI] sysname SSH Server [SSH Server] interface meth 0/0/0 [SSH Server-MEth0/0/0] ip address 10.248.103.194 255.255.255.0 [SSH Server-MEth0/0/0] quit 在SSH服务器端生成本地密钥对。 [SSH Server…...

盘点一个Python网络爬虫的实战问题

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 西宫南内多秋草&#xff0c;落叶满阶红不扫。 大家好&#xff0c;我是Python进阶者。 一、前言 前几天在Python最强王者交流群【&#x1f1ff; &#x…...

100道面试必会算法-32-二叉树右视图用栈实现队列

100道面试必会算法-32-二叉树右视图&用栈实现队列 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,n…...

⽀付逻辑漏洞思路⼩集合

⼀.直接的价格修改 ⼆.修改⽀付状态 三.修改购买数量 四&#xff1a;⽀付附属值修改 ➀&#xff1a;修改优惠劵⾦额 ➁&#xff1a;修改优惠劵⾦额及业务逻辑问题 ➂&#xff1a;修改积分⾦额 ➃&#xff1a;满减修改 五&#xff1a;订单替代⽀付 六&#xff1a;⽀付接…...

嵌入式学习——Linux高级编程复习(线程)——day40

1. 线程 1.1 定义 线程是一个轻量级的进程 是一个任务被创建、调度、消亡的过程 1.2 线程和进程的区别与联系 1. 线程是CPU任务调度的最小单元 2. 进程是操作系统资源分配的最小单元 3. 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位…...

kvm管理工具-virsh

virsh 查看全部虚拟机列表停止虚拟机列表启动虚拟机强制关闭虚拟机连接虚拟机控制台查看虚拟机的详细信息查看虚拟机接口信息查看虚拟机xml文件配置删除虚拟机 KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种基于 Linux 内核的虚拟化技术&#xff0c;允许在一…...

VisionPro的应用和入门教程

第1章 关于VisionPro 1.1 康耐视的核心技术 1. 先进的视觉系统 康耐视的视觉系统结合了高性能的图像传感器、复杂的算法和强大的计算能力&#xff0c;能够实时捕捉、分析和处理高分辨率图像。其视觉系统包括固定式和手持式两种&#xff0c;适用于各种工业环境。无论是精密电…...

整数规划问题算法例子

整数规划问题算法概述 整数规划(Integer Programming, IP)问题是优化问题的一种,其中决策变量必须取整数值。整数规划问题在许多实际应用中广泛存在,如资源分配、排班、路径优化等。 0-1背包问题旅行商问题利用线性规划库求解整数规划问题的方法 以下是两个常见的整数规划…...

C#启动一个cmd.exe多次随时输入命令并获取输出

想要实现的效果&#xff0c;程序通过Process类一次启动cmd&#xff0c;后台线程每隔一定时间&#xff0c;向其输入命令&#xff0c;获得并处理输出。 一、基本操作 首先&#xff0c;通常操作的例子一抓一大把&#xff1a; 1、通过Process启动cmd执行一条/多条&#xff08;&am…...

持续总结中!2024年面试必问 20 道分布式、微服务面试题(五)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道分布式、微服务面试题&#xff08;四&#xff09;-CSDN博客 九、请解释API网关在微服务架构中的作用。 API网关是微服务架构中的一个重要组件&#xff0c;它充当所有客户端请求的单一入口点&#xff0c;然后…...

Android输入法IME(三)之 管理端(IMMS)启动流程

2.2. IME管理端&#xff08;IMMS&#xff09;初始化流程 IMMS运行在system server进程中&#xff0c;属于系统服务的一部分&#xff0c;用于控制输入法的显示/隐藏、切换、绑定等操作。 涉及代码文件路径&#xff1a; IMMS运行在system server进程中&#xff0c;属于系统服务的…...

elasticsearch安装与使用(4)-搜索入门

1、创建索引 PUT /hotel {"mappings": {"properties":{"title":{"type": "text"},"city":{"type": "keyword"},"price":{"type":"double"}}} }2、写入文档 …...

【UML用户指南】-12-对高级结构建模-接口、类型和角色

目录 1、名称 2、操作 3、关系 4、理解接口 5、常用建模技术 5.1、对系统中的接缝建模 5.2、对静态类型和动态类型建模 5.2.1、对静态类型建模 5.2.2、对动态类型建模 使接口易于理解和易于访问 接口在关于一个抽象做什么的描述与关于这个抽象如何做的实现之间定义了…...

C++笔试强训day42

目录 1.最大差值 2.兑换零钱 3.小红的子串 1.最大差值 链接https://www.nowcoder.com/practice/a01abbdc52ba4d5f8777fb5dae91b204?tpId182&tqId34396&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficulty2&judgeSta…...

Docker 中运行的 MySQL 数据库与 Docker 外部的管理系统连接

步骤 1&#xff1a;运行 MySQL 容器 首先&#xff0c;确保你的 Docker 容器中运行了 MySQL 数据库。 docker run --name mysql-container -e MYSQL_ROOT_PASSWORDmy-secret-pw -d -p 3306:3306 mysql:latest--name mysql-container 为容器命名。-e MYSQL_ROOT_PASSWORDmy-sec…...

10 设备树

掌握设备树是 Linux 驱动开发人员必备的技能! 1、什么是设备树 新版本 Linux 中,ARM 相关的驱动全部采用了设备树。Linux-4.1.15 支持设备树。我们了解一下设备树的起源、重点学习一下设备树语法。 设备树:Device Tree,就是“设备”和“树”,描述设备树的文件叫做 DTS(…...

【架构分析】GPU执行GEMM矩阵运算实例演示

背景介绍 Cutlass是 NVIDIA 提供的一套用于高效实现矩阵乘法和卷积操作的 C 库。它以 CUDA 为基础&#xff0c;提供了高度优化的数学运算&#xff0c;尤其适用于GPU上的高性能并行计算。本文以GEMM矩阵运算作为实例&#xff0c;展示Cutlass在GPU上执行GEMM运算的过程 实例演示…...

从《千脑智能》看大模型

千脑智能与大模型 千脑智能介绍 世界模型千脑智能理论——对大脑的全新理解旧大脑&#xff1a;演化的历史烙印新大脑&#xff1a;智慧的创新引擎新旧大脑的互动与争斗启示与借鉴 大脑对信息的处理和建模六根六尘六识 新脑&#xff1a;智能的创新中枢旧脑&#xff1a;生存的本能…...

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…...

Python - json 美化格式、保存文件

文章目录 读取长篇幅的 jsonl 文件时&#xff0c;我们难以了解 json 的格式&#xff0c;复制出来贴到 sojson 之类的网站&#xff0c;当数据量大的时候感觉麻烦。 不如自己写个 json 格式美化&#xff0c;然后保存到文件。 text open(file_path).readline() # 读取 jsonl 文…...

博客目录~

1、Jenkins构建打包部署前端Vue项目至Nginx-CSDN博客 2、https://blog.csdn.net/askuld/article/details/139429298 3、基于DockerJenkins实现自动部署SpringBootMaven项目-CSDN博客 4、时序数据库ClickHouse的安装使用_clickhouse安装使用-CSDN博客 5、Valid&#xff0c…...

怎样把有用网站做图标放在桌面/软文推广营销平台

2019独角兽企业重金招聘Python工程师标准>>> 关于区块链是什么的话题&#xff0c;估计现在已经烂大街了。但是实际上&#xff0c; 那些我们认为已经非常普通的概念&#xff0c;却往往别有洞天。 1.从社会学角度上来讲&#xff1a; 区块链的概念来自凯文.凯利《失控》…...

长沙品牌设计公司/seo怎么收费

公共函数&#xff1a; 功能&#xff1a;检查是否要显示提示窗口 */ function IfShow(ShowMsg) { if (ShowMsg "" ) { return false; } else { return true; } } /* 功能&#xff1a;替换空格&#xff08;将多个…...

做衬衣的网站/百度手机软件应用中心

点击查看&#xff1a;基于Matlab蚁群算法三维路径规划 文件大小&#xff1a;1.85M 源码说明&#xff1a;带中文注释 开发环境&#xff1a;Matlab2016、2018 简要概述 基于Matlab蚁群算法三维路径规划&#xff0c;可以自动寻找最佳路径...

wordpress文档/百度如何免费打广告

updateAllColumnById mybatisplus中的updateById和updateAllColumnById—仅做记录 updateAllColumnById方法可以更新带有null的列&#xff0c;与selectOne 相比较使用 而updateById更新时如果带有null&#xff0c;则只更新带有参数值的entity&#xff0c;null的不更新&#…...

东莞做网站定制/网站排名顾问

import osimport timesource [D:\\MyDrivers\hotfix] #这里可以用自然字符串表示r&#xff0c;因为windows下的分隔符与python的有冲突&#xff0c;所以需要转义字符\# 2. 备份文件到目标路径target_dir F:\\DMDownLoad\\ #这里的末尾一定不要丢分隔符&#xff0c;否者创建…...

网站seo收费/seo最新

原标题&#xff1a;Mac小知识--软件的三种安装/卸载方法&#xff0c;优缺点分析mac电脑怎么卸载软件&#xff1f;Mac系统如何卸载/删除软件&#xff1f;对于mac系统操作还不了解的用户不要着急&#xff0c;小编为大家带来Mac实用技巧之:三种安装/卸载软件的方法及其优缺点&…...