实战解析:如何用Pikachu靶场复现GBK编码下的SQL宽字节注入漏洞

SQL注入之宽字节注入、堆叠注入、二次注入 渗透的学习,必须要心无旁骛,通过靶场实战不断总结经验,vulnhub、hackthebox......这些靶场,如果有一个知识点没有掌握就会卡着动不了,之前整理sql注入的文章有点杂,主要原因是此部分内容较多。(一)宽字节注入如今有很多人在编码的时候,大多数人对程序的编码都使用unicode编码,网站都使用utf-8来一个统一国际规范。但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如gbk,作为自己默认的编码类型。 阅读详情

实战解析:如何用Pikachu靶场复现GBK编码下的SQL宽字节注入漏洞

如果你刚开始接触Web安全,可能已经对SQL注入的基本概念有所了解,比如用单引号闭合语句,或者用union select来获取数据。但当你信心满满地面对一个看似防护严密的系统时,却发现输入的单引号'被自动转义成了\',所有精心构造的Payload瞬间失效。这种挫败感,很多安全新手都经历过。今天,我们就来深入一个经典且巧妙的绕过场景——宽字节注入。它不像那些复杂的零日漏洞那样遥不可及,却实实在在地利用了开发中一个常见的“安全错觉”:以为转义了单引号就万事大吉。我们将以Pikachu这个优秀的靶场作为实验室,手把手带你从环境搭建、原理剖析,一路实战到漏洞修复,让你不仅“知其然”,更“知其所以然”。

宽字节注入的核心,在于字符集编码的差异与组合。它主要影响那些使用GBK、GB2312等双字节编码的PHP+MySQL应用。当开发者使用addslashes或mysql_real_escape_string等函数来转义用户输入中的单引号时,他们可能没想到,一个来自用户输入的特殊字符(如%df),会与转义产生的反斜杠(\,编码为%5c)在数据库的GBK解码视角下,“意外”地结合成一个完整的汉字,从而让反斜杠“消失”,使得被转义的单引号成功“逃逸”。这个过程就像魔术师的手法,在众目睽睽之下让关键道具消失。理解这个魔术背后的机关,是每一位渗透测试人员和安全开发者的必修课。

1. 环境搭建与漏洞场景深度剖析

在开始实战之前,我们必须先搭建一个可控的测试环境。Pikachu靶场本身已经集成了这个漏洞场景,但为了彻底理解其运作机制,我建议你在本地或虚拟机中部署一套标准的LAMP(Linux + Apache + MySQL + PHP)或WAMP环境,并手动配置出存在漏洞的条件。这不仅能让你对漏洞有更立体的认识,也能在后续的修复方案验证中游刃有余。

关键的漏洞触发条件通常包含以下几个要素,缺一不可:

  1. 数据库连接字符集设置为GBK系列:如GBK、GB2312、GB18030。这通常在PHP连接MySQL时通过mysqli_set_charset('gbk')或SET NAMES 'gbk'语句设置。
  2. 使用了“转义”函数:最常见的是addslashes(),它会将单引号(')、双引号(")、反斜杠(\)和NULL字符前加上反斜杠进行转义。mysql_real_escape_string()函数行为类似,但会考虑当前连接的字符集。
  3. 用户输入能够“直达”数据库查询:即转义后的数据未经其他过滤或编码处理,直接拼接进SQL语句。

为了模拟最真实的漏洞环境,你可以创建一个简单的测试页面。下面是一个高度还原漏洞场景的PHP代码示例:

<?php
// 模拟存在漏洞的查询页面
$host = 'localhost';
$user = 'root';
$pass = 'your_password';
$db = 'test_vuln';

$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
    die('连接失败: ' . mysqli_connect_error());
}

// 关键漏洞点1:设置客户端字符集为GBK
mysqli_set_charset($conn, 'gbk');

// 获取用户输入(例如来自GET参数‘id’)
$user_input = $_GET['name'];

// 关键漏洞点2:使用addslashes进行转义(认为这很安全)
$filtered_input = addslashes($user_input);

// 构造SQL查询语句
$sql = "SELECT * FROM users WHERE username = '$filtered_input'";
echo "<b>执行的SQL语句:</b> " . htmlspecialchars($sql) . "<br><br>";

$result = mysqli_query($conn, $sql);
if ($result) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo "用户ID: " . $row['id'] . " - 用户名: " . $row['username'] . "<br>";
    }
} else {
    echo "查询错误: " . mysqli_error($conn);
}
mysqli_close($conn);
?>

将这段代码保存为vuln_page.php并访问。现在,我们有了一个完美的“靶子”。它的数据库test_vuln中需要预先创建一张users表并插入一些测试数据:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    email VARCHAR(100)
);
INSERT INTO users (username, email) VALUES ('admin', 'admin@test.com'), ('test', 'test@test.com'), ('kobe', 'kobe@pikachu.com');

注意:此环境仅用于合法授权的安全学习和测试,严禁用于任何未经授权的系统。在实际测试中,务必使用像Pikachu这样的专用靶场或自己搭建的授权环境。

2. 宽字节注入原理:编码的“视觉错觉”

要理解宽字节注入,我们必须暂时跳出“字符”的抽象概念,深入到计算机存储和传输的二进制层面。对于ASCII字符(如英文字母、数字、单引号),它们通常用一个字节(8位)表示。例如,单引号'的ASCII码是0x27,反斜杠\的ASCII码是0x5c。

而像中文这样的字符,在GBK编码中,需要用两个字节来表示一个汉字。GBK编码规范规定,第一个字节(高位字节)的范围是0x81到0xFE,第二个字节(低位字节)的范围是0x40到0xFE(不包括0x7F)。当MySQL服务器被告知客户端使用GBK字符集时,它会尝试将接收到的字节流按两个字节一组进行解读,如果某两个字节的组合符合GBK的编码范围,它就会将其解释为一个汉字。

现在,让我们看看漏洞是如何发生的:

  1. 攻击输入:攻击者提交输入 kobe%df'(%df是URL编码,对应字节0xdf)。
  2. PHP转义:addslashes函数检测到单引号'(0x27),在其前面添加反斜杠\(0x5c)。于是,输入变成了 kobe%df\',在内存或传输中,字节序列是:... 0xdf 0x5c 0x27 ...。
  3. MySQL GBK解码:当这个字节流到达MySQL,并且连接字符集是GBK时,MySQL会尝试将0xdf和0x5c这两个连续字节组合起来解读。0xdf(大于0x81)落在GBK高位字节范围,0x5c落在低位字节范围,它们恰好构成了一个合法的GBK汉字——“運”(繁体)或“連”(取决于具体编码表)。于是,0x5c这个反斜杠字节,就不再被当作独立的转义符,而是和前面的0xdf一起“变成”了一个汉字。
  4. 单引号逃逸:反斜杠(0x5c)被“吃掉”后,原本被转义的单引号0x27就裸露了出来,成功闭合了SQL语句中的前一个单引号,后续的注入代码(如or 1=1#)便得以执行。

这个过程可以直观地通过下表来理解:

阶段输入内容 (URL编码)底层字节序列 (Hex)MySQL (GBK) 解读结果在SQL语句中的效果
原始攻击输入kobe%df' or 1=1#6B 6F 62 65 DF 27 20 6F 72 20 31 3D 31 23kobe + DF 27 + or 1=1#语法错误(单引号未配对)
经addslashes转义后kobe%df\' or 1=1#6B 6F 62 65 DF 5C 27 20 6F 72 20 31 3D 31 23kobe + 運 (DF5C) + ' or 1=1#SELECT ... WHERE username = 'kobe運' or 1=1#'

从表中可以清晰看到,DF 5C这个字节对在GBK语境下被“重组”了,导致防御机制失效。这里还有一个关键细节:并非所有字符都能“吃掉”反斜杠。只有高位字节(首字节)在0x81至0xFE范围内的字符,与0x5c组合才会被识别为汉字。常见的用于宽字节注入的字符包括%df、%bf等。

提示:iconv('UTF-8', 'GBK', $input)函数也可能引发类似问题。如果从UTF-8转换到GBK时,某个UTF-8字符的编码在GBK中不存在,iconv可能会尝试用?(0x3F)或�(0xBF)等替代字符,这些字符也可能与后续的0x5c组合,产生意想不到的效果。

3. 实战复现:从探测到数据提取

理论足够扎实后,我们进入实战环节。打开Pikachu靶场的“宽字节注入”关卡。页面通常是一个简单的用户查询表单,提示你输入一个用户名。我们的目标,是绕过转义,利用注入漏洞获取数据库中的敏感信息。

3.1 漏洞探测与确认

首先,我们需要确认漏洞是否存在。一个经典的探测步骤如下:

  1. 正常查询:在输入框输入一个已知的用户名,比如kobe,提交。页面应正常返回该用户的信息(如uid和email)。这建立了基准。
  2. 触发转义:输入kobe'(一个单引号)。如果页面返回数据库错误(如You have an error in your SQL syntax...),说明单引号被带入了查询,触发了语法错误。但更常见的情况是,由于addslashes的转义,输入变成了kobe\',查询可能因找不到用户而返回“用户不存在”或空结果。这时,页面可能没有明显报错,但也没有返回kobe的用户信息。
  3. 尝试宽字节绕过:输入kobe%df'。这里%df就是我们的“魔术字符”。提交后,观察页面反应。
    • 如果漏洞存在:由于%df与转义符\(%5c)结合成汉字,单引号逃逸,kobe%df'在SQL中可能被解析为类似username='kobe運',这显然不是数据库中的用户名,因此可能返回“用户不存在”。但这还不够,我们需要证明可以执行任意SQL。
  4. 构造永真条件:输入kobe%df' or 1=1#。or 1=1是一个永真条件,#用于注释掉原查询中剩余的部分。提交后:
    • 成功标志:页面返回了所有用户的数据,而不仅仅是kobe的。这意味着or 1=1这个条件被成功执行,注入成功!
    • 失败标志:如果只返回“用户不存在”或报错,则可能不存在宽字节注入漏洞,或者需要调整Payload。

在实际操作中,我强烈建议使用Burp Suite这类工具来辅助。因为浏览器地址栏或表单直接输入%df这样的特殊字符,有时会被自动编码或处理,导致Payload变形。用Burp Suite抓包后,在Repeater模块中直接修改原始请求数据,可以确保Payload被精确发送。

Burp Suite操作步骤简述:

  1. 开启Burp代理,浏览器配置好代理设置。
  2. 在Pikachu页面输入kobe并提交,用Burp拦截这个POST请求。
  3. 将请求发送到Repeater。
  4. 在Repeater中,找到name参数,将其值从kobe修改为kobe%df' or 1=1#。注意,这里#在POST数据中可能需要编码为%23。
  5. 点击“Send”,观察响应。如果返回的数据包含了所有用户,恭喜你,漏洞确认。

3.2 信息收集与利用

确认漏洞后,下一步就是利用它来提取信息。标准的SQL注入利用流程通常包括:判断字段数、确定回显点、查询数据库信息、枚举表名、列名,最后获取数据。

第一步:判断字段数 使用order by子句。Payload:kobe%df' order by 1#,然后order by 2#,order by 3#... 直到页面返回错误或显示异常。当order by N正常而order by N+1错误时,字段数就是N。在Pikachu的这个关卡中,通常字段数是2(例如,一个字段显示uid,另一个显示email)。

第二步:确定回显点 使用union select联合查询,将我们想要的信息显示在页面上。Payload:kobe%df' union select 1,2#。如果页面正常显示,并且原本显示数据的位置出现了数字1和2,说明这两个位置可以作为回显点。例如,你可能看到“your uid: 1”和“your email is: 2”。记下这些位置。

第三步:获取数据库基本信息 利用回显点,替换union select后面的内容。

  • 当前数据库名:kobe%df' union select database(),2#
  • 数据库版本:kobe%df' union select version(),2#
  • 当前用户:kobe%df' union select user(),2#

第四步:枚举表名 这是关键一步,需要查询information_schema.tables系统表。但这里有一个陷阱:我们的Payload里本身已经用单引号逃逸了一个引号来闭合语句,如果直接在where table_schema='pikachu'里再用单引号,这个内部的单引号又会被转义,导致语法错误。因此,我们需要避免在Payload内部使用引号。

有几种绕过方法:

  • 使用十六进制编码:将数据库名或表名转换成十六进制。例如,pikachu的十六进制是0x70696b61636875,users是0x7573657273。
  • 使用嵌套查询:用select database()代替字符串'pikachu'。
  • 使用CONCAT或CHAR函数:拼接出字符串。

这里演示使用十六进制和嵌套查询的方法:

-- 方法1:使用十六进制编码表名
kobe%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x70696b61636875#

-- 方法2:使用嵌套查询,避免引号
kobe%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database())#

执行后,你应该能在回显点看到数据库中的所有表名,例如httpinfo,member,message,users,xssblind等。我们的目标通常是users表。

第五步:枚举列名 知道了表名(users),接下来查询它的列结构。同样要避免引号:

-- 将表名‘users’转为十六进制 0x7573657273
kobe%df' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273#

回显结果可能类似id,username,password,level,这样我们就知道了表中的列。

第六步:提取数据 最后,从目标表中提取敏感数据,比如用户名和密码。

kobe%df' union select group_concat(username), group_concat(password) from users#

或者,如果回显点有限,可以分两次查询:

kobe%df' union select username, password from users limit 0,1#

通过修改limit子句的参数,可以遍历所有数据行。

整个利用过程,就像在迷宫中寻找出口,每一步都需要谨慎和技巧。下表总结了关键步骤和对应的Payload思路:

步骤目的关键Payload思路注意事项
探测确认宽字节注入存在%df' or 1=1#观察是否返回所有数据
判断字段确定union select的列数order by N递增N直到报错
找回显点确定数据在页面显示的位置union select 1,2,...,N数字会显示在页面对应位置
查库/版本获取环境信息union select database(), version()直接替换回显点数字
枚举表名获取所有表名... where table_schema=database()避免内部引号,用十六进制或函数
枚举列名获取目标表结构... where table_name=0x...表名需十六进制编码
提取数据获取最终敏感信息union select 列1,列2 from 表注意数据可能被截断,可用substr分片

4. 漏洞修复:从根源上杜绝隐患

复现漏洞是为了更好地防御。针对宽字节注入,修复的核心思路是统一字符集和使用参数化查询,从根本上消除字符 misinterpretation 的可能性。以下是几种经过验证的修复方案,我会结合代码示例和原理进行对比分析。

方案一:统一使用UTF-8编码(推荐) 这是最彻底、最一劳永逸的解决方案。UTF-8是一种变长编码,兼容ASCII,且没有GBK那种特定的双字节组合规则。将整个Web应用栈(PHP文件编码、MySQL连接字符集、数据库/表/字段字符集)全部设置为UTF-8或UTF8MB4,可以完全避免宽字节注入问题。

  • PHP文件编码:确保你的.php文件以UTF-8 without BOM格式保存。
  • HTML头部声明:在HTML的<head>中添加<meta charset="UTF-8">。
  • PHP连接MySQL时设置字符集:
    // 使用MySQLi
    $mysqli = new mysqli($host, $user, $pass, $db);
    $mysqli->set_charset("utf8mb4"); // 优先使用utf8mb4以支持完整Unicode
    
    // 使用PDO
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass);
    
  • 数据库/表/字段字符集:在MySQL中,确保数据库、表和字段的字符集也是utf8mb4。
    ALTER DATABASE your_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    

方案二:正确使用转义函数(治标不治本) 如果因历史遗留问题必须使用GBK,那么绝对不要单独使用addslashes()。应该使用mysqli_real_escape_string()或PDO::quote(),并且必须在调用这些函数之前,先设置好正确的连接字符集。

// 错误示范:先转义,后设置字符集(仍有风险)
$input = addslashes($_GET['name']);
mysqli_set_charset($conn, 'gbk'); // 太晚了!

// 正确示范:先设置字符集,再转义
mysqli_set_charset($conn, 'gbk'); // 关键步骤!
$input = mysqli_real_escape_string($conn, $_GET['name']);

mysqli_real_escape_string()会考虑当前数据库连接的字符集来进行转义,比addslashes更安全。但请注意,它仍然不是绝对安全的,因为其安全性依赖于正确的字符集设置。

方案三:使用参数化查询(预编译语句)——最佳实践 这是目前公认的最有效的防止SQL注入的方法,包括宽字节注入。参数化查询将SQL语句的结构与数据分离,用户输入的数据始终被当作参数处理,而不会被解释为SQL代码的一部分。这就从根本上杜绝了注入的可能。

  • 使用PDO(PHP Data Objects):
    $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
    $stmt->execute(['username' => $_GET['name']]);
    $results = $stmt->fetchAll();
    
  • 使用MySQLi:
    $stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
    $stmt->bind_param("s", $_GET['name']); // 's'表示字符串类型
    $stmt->execute();
    $result = $stmt->get_result();
    

参数化查询不仅安全,而且通常性能更好,因为数据库可以缓存编译后的语句。对于所有涉及用户输入的数据查询,都应强制使用此方法。

为了更清晰地对比这几种方案,我整理了下面的表格:

修复方案核心思想优点缺点/注意事项安全等级
统一使用UTF-8消除GBK双字节组合风险彻底根除宽字节问题,符合现代开发规范对已有GBK编码的老系统改造工作量较大高
正确使用转义函数在正确字符集环境下转义相对addslashes更安全,兼容老代码严重依赖字符集设置顺序,仍有潜在风险中
参数化查询SQL结构与数据分离从根本上免疫所有SQL注入,性能佳需要重构旧代码,学习曲线稍陡最高

在实际项目中,我的建议是:新项目一律采用“UTF-8 + 参数化查询”的组合拳。对于老旧的GBK系统,如果无法全面重构,应优先推动将字符集迁移至UTF-8,并在关键业务点逐步引入参数化查询。安全是一个系统工程,堵住一个宽字节注入的漏洞,往往能带动整个应用安全水平的提升。

5. 深入思考与拓展场景

掌握了Pikachu靶场中的基础宽字节注入后,我们可以将视野放得更广一些。现实世界中的漏洞利用往往不会这么“标准”,攻击者会结合其他技巧,防御方案也可能存在新的变体。

变体与组合利用

  • 二次编码与特殊字符:有时,应用程序或WAF会对输入进行多次URL解码或过滤。攻击者可能会尝试双重编码(如将%df编码为%25df),以绕过简单的过滤规则。
  • iconv函数引发的注入:如前所述,使用iconv进行字符集转换时,如果遇到无法转换的字符,可能会插入0xbf等字节,若其后紧跟0x5c,也可能构成GBK字符(如0xbf5c是“縗”),导致注入。Payload可能形如%bf'。
  • 与其他注入类型结合:宽字节注入本质上是一种绕过转义的手段,它打开了一个注入点。之后,攻击者可以在此注入点上进行报错注入、布尔盲注、时间盲注等更深度的利用。例如,在无法union select回显的情况下,可以尝试:
    kobe%df' and updatexml(1,concat(0x7e,(select database()),0x7e),1)#
    
    利用报错函数将查询结果带出。

防御的纵深 单一的防御措施总是脆弱的。一个健壮的系统应该构建纵深防御体系:

  1. 输入验证与过滤:在业务层面对输入进行严格的白名单验证(如用户名只允许字母数字),拒绝非法格式。
  2. 使用安全的API:强制使用参数化查询或ORM框架(如Eloquent、Doctrine),它们通常内置了安全的查询构造方式。
  3. 最小权限原则:为数据库连接账户分配最小必要的权限,避免使用root或拥有FILE、OUTFILE等危险权限的账户。
  4. 错误处理:在生产环境关闭PHP的错误回显(display_errors = Off),避免将数据库结构、路径等敏感信息泄露给攻击者。
  5. Web应用防火墙(WAF):部署WAF可以帮助拦截一些已知的、模式化的攻击Payload,作为一道额外的防线。

给开发者的自查清单 在代码审计或开发自查时,可以快速扫描以下风险点:

  • [ ] 是否在PHP连接MySQL后使用了set_charset('gbk')或SET NAMES 'gbk'?
  • [ ] 是否在使用了addslashes()、mysql_real_escape_string()等转义函数?
  • [ ] 转义函数调用是否在设置字符集之后?
  • [ ] 是否存在iconv或mb_convert_encoding等字符转换函数,且转换目标字符集为GBK?
  • [ ] SQL语句是否通过字符串拼接方式构造?

回顾这次在Pikachu靶场的实战,从最初对转义机制的困惑,到理解编码组合的微妙,再到亲手构造Payload完成数据提取,最后探讨如何从根本上修复它,整个过程是一次完整的安全攻防思维训练。宽字节注入虽然是一个“老”漏洞,但它揭示的安全哲学却历久弥新:安全往往败在细节和“想当然”之上。真正牢固的防御,源于对底层原理的深刻理解和对安全边界的持续审视。当你下次在代码中写下addslashes时,或许会停下来想一想,字符集是否已经统一?有没有更优的参数化查询方式可以替代?这种条件反射式的安全思考,正是我们通过一次次靶场练习所追求的目标。

74CMS3.0 宽字节注入后台+任意文件写入获取shell复现 复现宽字节注入后台 进入后台 任意输入密码,填写正确验证码,开启burp抓包 把拦截的包发送给重发器,修改admin_name如图所示,再点击发送 成功进入后台 复现任意文件写入 如图所示构造post文件名和内容创建模板写入 然后再访问写入路径即可 原理分析 admin_login.php <?php /* * 74cms 锟斤拷录页锟斤拷 * ====================================================================== 阅读详情

相关推荐

SQL注入进阶之1宽字节注入攻击(Pikachu漏洞练习平台)

说在开头:文章是我通过查询资料后按照自己的理解总结出来的,所以如果有说法不对的地方,欢迎大佬指正~ 宽字节注入攻击可以说是SQL注入的进阶攻击方式,在我之前列出的学习计划体系中,前面的union联合查询注入攻击、布尔盲注、报错注入、时间盲注这几种常见的SQL注入方式,在我之前的博客中已经分析过了,那么今天在下面这些进阶的SQL注入方式中,要翻牌的就是宽字节注入。 原理讲解 接下来的讲解,将以问...

ISNS的博客 4900

Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)

本文介绍了图像处理中的高通滤波技术及其应用,包括索贝尔算子、沙尔算子和拉普拉斯算子等边缘检测方法。通过Python代码演示了这些算子的实现过程,对比了不同算子的特点和适用场景。此外,还展示了图像特效处理方法,如浮雕效果、油画效果、彩色映射和镜像效果等。这些技术可用于图像增强、边缘检测和艺术效果处理,为计算机视觉任务提供了基础支持。

weixin_64110589的博客 3807

pikachu靶场 :四、SQL注入

pikachu靶场 :四、SQL注入概述数字型注入(post)字符型注入(get)insert/update 注入insertupdatedelete 注入sql 盲注基于布尔基于时间宽字节注入 概述 在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。 一个严重的SQL注入漏洞,可能会直接导致一家公司破产! SQL注入漏洞主要形成...

qq_43233085的博客 2785

sqli-labs靶场实战-Basic Challenges通关攻略(五)(宽字节注入篇)

网站使用的是utf-8,数据库用的编码是GBK网站需要对用户的字符进行转义操作(发现敏感字符会自动添加转义字符\)

m0_66808441的博客 314

GBK宽字节注入实战:Pikachu靶场SQL注入绕过与防御

SQL注入是Web安全领域的经典漏洞类型,其核心原理在于攻击者通过构造恶意输入,改变原始SQL查询的语义逻辑。当应用程序对用户输入进行转义处理时,通常会使用addslashes等函数在特殊字符前添加反斜杠进行转义。然而,在特定字符集环境下,这种防御机制可能被绕过。GBK等宽字节字符集采用双字节编码,当应用层与数据库层字符集不一致时,攻击者可以提交特殊编码字符,使转义反斜杠成为宽字节字符的一部分,从而让单引号成功逃逸。这种技术被称为宽字节注入,在渗透测试中常用于突破基础过滤机制。本文以Pikachu靶场为实验

weixin_34161064的博客 507

GBK宽字节注入漏洞原理与Pikachu靶场实战解析

SQL注入是Web安全领域的核心威胁之一,其本质是攻击者通过构造恶意输入,篡改后端数据库查询逻辑,从而窃取或破坏数据。在众多注入技术中,宽字节注入是一种利用特定字符集(如GBK、GB2312)编码特性绕过传统转义防御的经典手法。其技术原理在于,当数据库连接使用双字节字符集时,转义字符(如反斜杠\)可能与用户输入的前一字节被错误地组合解释为一个合法宽字符,导致原本用于防护的单引号转义失效,从而为SQL注入打开缺口。这种漏洞在遗留系统或配置不当的现代应用中仍有出现,深刻揭示了字符集一致性在应用安全中的重要性。本

weixin_42524171的博客 262

避坑指南:Quartus II下My74161计数器设计与仿真的5个常见错误

本文针对FPGA初学者在Quartus II环境下设计My74161计数器时常见的五个错误,提供了详细的避坑指南。重点剖析了同步与异步逻辑混淆、引脚锁定错误、Testbench编写陷阱、模块例化连接问题以及硬件验证误区,并给出了具体的解决方案和最佳实践,帮助读者高效完成计数器设计与仿真,避免调试陷阱。

mango的博客 684

新手必看:用Pikachu靶场通关10种SQL注入,从数字型到宽字节一篇搞定

本文详细介绍了如何利用Pikachu靶场从零开始掌握10种SQL注入技术,包括数字型、字符型、搜索型、HTTP头注入、盲注和宽字节注入等。通过实战案例和自动化工具辅助,帮助新手快速构建完整的SQL注入知识体系,同时提供有效的防御方案和最佳实践。

weixin_30457465的博客 638

实战解析:如何利用GBK编码绕过Pikachu靶场的SQL注入防御(附详细Payload)

本文深入解析了如何利用GBK编码特性绕过Pikachu靶场的SQL注入防御,详细介绍了宽字节注入的核心原理、Payload构造技巧及实战应用。通过具体案例和高级绕过技术,帮助安全测试人员掌握这一特殊注入方法,同时提供了有效的防御策略和最佳实践。

ik678901234的博客 829

宽字节注入漏洞:原理剖析与实战攻防指南

SQL注入作为Web安全领域的经典漏洞,其核心在于攻击者通过构造恶意输入,使应用程序将用户数据误执行为SQL代码。其原理在于应用程序未对用户输入进行充分过滤,直接将输入拼接到SQL语句中执行。这种漏洞的技术价值在于它直接威胁数据库安全,可能导致数据泄露、篡改甚至服务器被控制。在众多应用场景中,尤其是在使用特定字符集(如GBK、GB2312)的旧系统中,一种名为“宽字节注入”的变体尤为突出。它并非新型注入技术,而是巧妙地利用了字符编码转换与防御机制(如addslashes函数)之间的不一致性。当数据库连接使用

weixin_34192816的博客 388

SQL注入实战:从原理到Pikachu靶场十种攻击手法全解析

SQL注入是一种经典的Web安全漏洞,其核心原理在于攻击者通过构造恶意输入,篡改后端应用程序与数据库交互的原始查询语句逻辑。这通常源于开发中将用户输入未经充分验证便直接拼接到SQL语句中。理解其技术价值至关重要,它直接关系到数据库的机密性、完整性和可用性,可能导致数据泄露、篡改甚至服务器被完全控制。在应用场景上,SQL注入可出现在用户登录、数据搜索、信息展示等任何涉及数据库查询的功能点。本文以热门的Pikachu漏洞靶场为实战环境,系统性地复现了包括数字型、字符型、盲注及宽字节注入在内的多种攻击手法,并深入

jlins_you的专栏 390

PHPStudy环境下Pikachu靶场宽字节注入实战:从原理到绕过技巧

本文深入解析PHPStudy环境下Pikachu靶场的宽字节注入技术,从原理到实战绕过技巧全面覆盖。详细介绍了GBK编码特性与SQL注入的结合方式,提供手工注入和自动化工具(如SQLmap)的实战方法,并给出多层防御方案,帮助开发者有效防范此类安全漏洞。

transformer2023的博客 572

从Pikachu靶场看SQL注入防御:那些年被我们忽略的GBK编码漏洞

本文通过Pikachu靶场分析了GBK编码环境下的SQL注入漏洞,探讨了宽字节注入的攻击原理及防御失效原因。文章详细介绍了GBK编码的特殊性、典型攻击流程,并提供了包括字符集统一、参数化查询、输入验证等多层次的防御方案,帮助开发者有效防范SQL注入风险。

weixin_29314405的博客 101

Pikachu靶场-宽字节注入

当 %DF (单字节)与 %5C (单字节)相邻时,GBK 会将两者视为一个双字节汉字(即 %DF%5C 对应汉字“連”的编码,示例中可能为其他字符,取决于编码表)。- %df' 被转义为 %df\' ( addslashes() 添加 \ ),此时十六进制字节为 %DF%5C ( \ 的十六进制是 %5C )。输入 id=-1%df' ( %df 是十六进制字节,GBK 中代表半个汉字,需与后续字节组合成完整字符)。- 漏洞点:单引号成功闭合,后续可拼接恶意 SQL。

2401_83964264的博客 606

SQL注入实战入门:从Pikachu靶场到Web安全核心原理

SQL注入作为Web安全领域的经典漏洞,其核心原理在于应用程序未对用户输入进行有效过滤,导致恶意SQL代码被拼接执行。理解这一漏洞需要从数据库查询机制入手,区分数字型与字符型注入的关键在于引号处理,而联合查询、报错注入、盲注等技术则是在不同场景下的数据提取手段。掌握SQL注入不仅有助于发现和利用漏洞,更能从攻击者视角理解安全编码的重要性,例如参数化查询和输入验证等防御措施。本文以Pikachu靶场为例,通过实战演示了从环境搭建到多种注入手法的完整流程,特别针对新手常见问题如宽字节注入和布尔盲注进行了详细拆解

weixin_30470643的博客 433

Lora无线温湿度传感器方案

综上所述,Lora无线温湿度传感器以其长距离传输、低功耗、高稳定性、精准测量、无线传输以及广泛的应用场景等特点,在环境监测领域展现出了强大的竞争力和广泛的应用前景。Lora无线温湿度传感器广泛应用于各种需要远程监控和数据采集的场景,如仓储、农业、机房、楼宇、交通、工业、矿产、电力等领域。Lora无线温湿度传感器是一种采用Lora无线通信技术进行数据传输的温湿度监测设备。四、产品参数(以某款工业级Lora温湿度传感器为例)

weixin_46632654的博客 757

[Pikachu靶场实战系列] 宽字节注入:从原理到实战绕过技巧

本文深入解析了宽字节注入的原理与实战技巧,通过Pikachu靶场演示了从检测注入点到获取数据库信息的完整过程。文章详细介绍了GBK编码特性导致的SQL注入漏洞,并提供了手工注入与Sqlmap自动化工具的使用方法,最后给出了统一字符集和参数化查询等有效防御方案。

weixin_30642561的博客 487

【CTFSHOW】web入门 黑盒测试

文章目录写在前面web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394web395参考资料 写在前面 一直没搞过渗透,先学学黑盒测试吧 web380 进入题目发现是一个关于灯泡的悲伤故事,点进去,看到跳转到page_1.php页面。 我们访问page.php试试: 发现报错:$id.php,可以猜想需要传名称为id的参数,来访问id.php。我们访问page.php?id=1试试

7ruth0hn的博客 1896

从汉字编码到SQL注入:Pikachu靶场中的GBK陷阱全揭秘

本文深入剖析了Pikachu靶场中的宽字节注入漏洞,揭示了在GBK等多字节字符集环境下,传统的转义机制(如addslashes)如何因编码解析差异而失效。通过实战演示,详细讲解了漏洞原理、利用方法及Wireshark取证分析,并最终提供了统一使用UTF-8编码、采用参数化查询等根除隐患的最佳防御实践。

q9r0s的博客 195

多跳问答技术解析:从原理到金融领域实践

多跳问答(Multi-hop QA)是自然语言处理中的高级任务,要求系统通过多步推理整合分散信息来回答问题。其核心技术在于理解文档间的复杂关联,相比单跳问答需要更精细的数据集设计和模型架构。在金融、医疗等专业领域,多跳问答能有效处理如'腾讯大股东投资的港股上市公司'这类需要串联多个信息点的问题。典型实现方案包括MR-Search框架的三级检索器设计,分别处理实体召回、关系匹配和数值比较。当前最佳实践表明,结合稠密检索与稀疏检索的混合策略,配合动态路由机制,能在保持较高精度的同时控制计算成本。这类技术在金融风

weixin_42566072的博客 605

分享一个我自用的 Python 消息发送模块,支持邮件、钉钉、企业微信

🔥 分享一个我自用的 Python 消息发送模块,支持邮件、钉钉、企业微信

XiaoqiangClub的博客 476
上一篇: 飞牛NAS玩家必备:5分钟搞定Easytier异地组网(附安卓/Windows配置指南)
下一篇: 有序逻辑回归实战:用Stata分析用户满意度数据(附完整代码和数据集)
白露未晞593
博客等级 码龄3年 54粉丝 1563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值