【Web安全】转义字符注入?转义也会失效的SQL注入 - 指南

news/2025/11/1 15:24:04/文章来源:https://www.cnblogs.com/yxysuanfa/p/19183409

文章目录

    • 一、明明转义了,为啥还能注入?
    • 二、用代码还原漏洞过程
      • 1. 有漏洞的代码示例
      • 2. 漏洞一步步爆发
        • 第一步:黑客的输入
        • 第二步:PHP的转义操作
        • 第三步:MySQL的"错读"
        • 第四步:SQL被注入
    • 三、这个漏洞的风险有多大?
    • 四、怎么防御?
      • 1. 用`set_charset`同步字符集(最关键)
      • 2. 用预处理语句(彻底杜绝注入)
      • 3. 别用废弃的扩展
    • 五、总结

⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。

一、明明转义了,为啥还能注入?

先看个场景:程序员为了防SQL注入,老老实实用了PHP官方推荐的转义函数,结果还是被黑客注入了。问题就出在"字符集"这个容易被忽略的细节上——PHP和MySQL用了不同的"翻译手册",转义的保护作用被悄悄抵消了。

二、用代码还原漏洞过程

咱们用一段具体代码,看看黑客是怎么得手的。

1. 有漏洞的代码示例

<?php
// 连接数据库(PHP默认用GBK字符集处理)
$conn = mysqli_connect('localhost', 'user', 'pass', 'testdb');
if (!$conn) {
die('连接失败: ' . mysqli_error($conn));
}
// 程序员只告诉MySQL用UTF-8,却没告诉PHP(关键错误!)
mysqli_query($conn, "set names utf8");
// 获取用户输入(假设黑客输入:testuser%81' or sleep(3)-- -)
$name = $_GET['name'];
// 用转义函数处理(PHP以为还在用GBK,按GBK规则转义)
$safe_name = mysqli_real_escape_string($conn, $name);
// 拼接SQL语句
$sql = "select * from users where name='$safe_name'";
echo "执行的SQL: " . $sql; // 方便查看最终SQL
// 执行查询(这里会触发注入)
$result = mysqli_query($conn, $sql);
mysqli_close($conn);
?>

2. 漏洞一步步爆发

第一步:黑客的输入

黑客在URL里输入:info?name=testuser%81' or sleep(3)-- -

这里的%81是关键,它对应计算机里的字节0x81(十六进制)。在GBK字符集里,0x81属于"双字节字符的前半部分"(可以理解为"半个字")——GBK规定,双字节字符的前半部分范围是0x81-0xFE(就像字典里的"偏旁部首",需要和后面的"笔画"组成完整的字)。

类似的"半个字"还有0xDF(也就是%df)、0x90%90)等,只要在0x81-0xFE范围内,作用都一样,黑客随便选一个就行。

第二步:PHP的转义操作

PHP的mysqli_real_escape_string按默认的GBK规则转义:

  • 输入里的单引号'(对应字节0x27)是特殊字符,转义函数会在它前面加一个反斜杠\(对应字节0x5C),把'变成\'(实际存储的字节是0x5C 0x27)。

这里有个容易误解的点:转义后我们看到的%81\\'里有两个反斜杠\\,但这只是"显示效果"。实际存储的只有一个反斜杠字节0x5C,之所以显示成\\,是因为反斜杠\本身在字符串里是"特殊符号",需要用\\才能正确显示。

简单说:%81'转义后,实际字节是0x81 0x5C 0x27(对应%81\'),但显示时会变成%81\\',方便我们看清"这里有一个反斜杠"。

第三步:MySQL的"错读"

因为程序员用了set names utf8,MySQL会用UTF-8规则解读收到的数据。这时候问题来了:

MySQL遇到无效组合时,会把它们拆成单个字节:0x81被当成一个无效字符(可能显示成?),0x5C(反斜杠)被单独拎出来——这时候反斜杠原本的"保护作用"(保护单引号不闭合)就没了。

第四步:SQL被注入

最终拼接的SQL变成:
select * from users where name='testuser%81\\' or sleep(3)-- -'

但MySQL用UTF-8解读后,实际效果是:
select * from users where name='testuser?\' or sleep(3)-- -'

这里的单引号'因为失去了反斜杠的保护,直接"打断"了前面的字符串,导致or sleep(3)-- -变成有效的SQL命令(-- -会注释掉后面多余的单引号)。于是MySQL执行sleep(3),页面卡顿3秒,黑客就知道注入成功了。

三、这个漏洞的风险有多大?

  1. 数据泄露:黑客可以通过注入获取数据库里的账号、密码、个人信息等;
  2. 数据篡改:修改、删除数据库中的数据(比如删订单、改余额);
  3. 服务器控制:如果数据库权限高,可能通过注入执行系统命令,控制整个服务器。

更危险的是,它利用了"官方推荐的转义函数",容易让程序员放松警惕,以为代码是安全的。

四、怎么防御?

核心原则:让PHP和MySQL用同一套"翻译手册"(字符集),并从根源上避免拼接SQL。

1. 用set_charset同步字符集(最关键)

不要用mysqli_query("set names utf8"),改用mysqli_set_charset,它会同时告诉PHP和MySQL用相同的字符集:

// 正确做法:同步字符集
$conn = mysqli_connect('localhost', 'user', 'pass', 'testdb');
mysqli_set_charset($conn, 'utf8'); // 同时更新PHP和MySQL的字符集

这样转义函数和MySQL的解读规则一致,反斜杠不会失效。

2. 用预处理语句(彻底杜绝注入)

最安全的方式是用"预处理语句",把SQL结构和用户数据分开,让黑客的输入永远当不了命令:

// 预处理示例(推荐!)
$conn = mysqli_connect('localhost', 'user', 'pass', 'testdb');
mysqli_set_charset($conn, 'utf8');
$name = $_GET['name'];
// 准备带占位符的SQL
$stmt = mysqli_prepare($conn, "select * from users where name=?");
// 绑定参数(s表示字符串类型)
mysqli_stmt_bind_param($stmt, 's', $name);
// 执行查询
mysqli_stmt_execute($stmt);

预处理语句里,?会被严格当作数据处理,不管输入什么特殊字符,都不会变成SQL命令。

3. 别用废弃的扩展

mysql_real_escape_string(属于早已废弃的mysql扩展)完全不能用,必须用mysqliPDO扩展。

五、总结

转义函数不是万能的,它的安全依赖于PHP和MySQL的字符集一致。如果两边"翻译错了",哪怕是0x810xDF这样的"半个字",都能让反斜杠的保护失效,导致注入。

同步字符集是基础,预处理语句是王道——这两个做到了,绝大多数SQL注入都能防住。

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

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

相关文章

isulad容器使用教程

iSulad是一个由C/C++编写实现的轻量级容器引擎,具有轻、灵、巧、快的特点,不受硬件规格和架构限制,底噪开销更小,可应用的领域更为广泛。 安装isulad:yum install -y iSulad成功安装iSulad之后,需要先配置好容器镜…

完整教程:基于类的四种设计模式

完整教程:基于类的四种设计模式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

Go基础:正则表达式 regexp 库详解 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JBoltAI 智能企业内训平台深度解析

企业内训智能化转型新标杆:JBoltAI 智能企业内训平台 在数字化转型浪潮下,企业培训模式正经历着从传统线下授课到全流程智能化的颠覆性变革。JBoltAI 智能企业内训平台作为企业培训领域的创新解决方案,凭借其 AI 驱…

2025 年 11 月云南财务服务,云南财税咨询,昆明代理记账公司最新推荐,技术实力与市场口碑深度解析!

2025 年 11 月,省税务师协会联合省数字财税发展研究院,针对全省 92 家开展云南财务服务、云南财税咨询、昆明代理记账业务的机构,开展以 “技术硬实力 + 市场好口碑” 为核心的专项测评。本次测评采用 “量化考核 +…

第四十五章 ESP32S3 Flash 模拟 U 盘实验 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JBoltAI框架揭秘:如何为Java应用注入“企业级AI知识库”能力

JBoltAI框架揭秘:如何为Java应用注入“企业级AI知识库”能力在企业级AI应用中,RAG(检索增强生成)是实现智能问答、决策辅助等场景的核心技术。而其根基,在于一个高效、可控的AI知识库。今天,我们将深入介绍JBolt…

2025 年 11 月云南财税服务,昆明财税代理,云南代理记账公司最新推荐,实力品牌深度解析采购无忧之选!

2025 年 11 月,省注册会计师协会联合省中小企业财税服务联盟,针对全省 87 家开展云南财税服务、昆明财税代理、云南代理记账业务的机构,开展 “实力品牌专项测评”。本次测评采用 “三维度权重评估法”:品牌资质维…

电脑恢复技巧:适用于 Windows 的 9 款最佳分区恢复软件

磁盘分区对于妥善存储数据、方便快捷地从硬盘访问数据至关重要。然而,如果分区损坏,其中存储的所有数据将突然无法访问。磁盘分区损坏的原因有很多,其中最常见的包括病毒攻击、突然断电、物理损坏或坏扇区的产生。 …

2025 年 11 月云南环保咨询,云南环评手续咨询,云南环评批复咨询最新推荐:聚焦资质、案例、售后的五家机构深度解读!

为解决云南企业在环评服务选型中 “资质真伪难辨、案例适配性不明、售后保障缺失” 的核心痛点,云南省环境保护产业协会联合省环境工程评估中心开展 2025 年度专项测评,覆盖全省 268 家咨询机构,最终筛选出 5 家在资…

20251031周五日记

20251031周五日记今日: 1.起的贼早,去实验室看会儿文章去和祥吃必胜客炉石联动。被上了一课,以后要更明确地懂别人的隐藏动作意思呀。陪他买个蛋糕回去上课了。 2.回去先把东西放回宿舍,把杜的信寄走。去听汇报和课…

完整教程:毕设项目基于Django的医药管理系统\251006(白嫖源码+演示录像)可做计算机毕设JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、文案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CSP-J 2025 题解

第一题:拼数 (number) 思路分析 题目要求使用一个字符串中包含的数字字符拼成一个最大的正整数。 要组成最大的数,我们的策略应该是把越大的数字放在越高的位(即越靠前的位置)。例如,用数字 \(9, 2, 1, 0, 0\) 能…

人工智能之编程基础 Python 入门:第五章 基本数据类型(一)

人工智能之编程基础 Python 入门:第五章 基本数据类型(一)人工智能之编程基础 Python 入门 第五章 基础数据类型(一)@目录人工智能之编程基础 Python 入门前言Number(数字)1. 整数 (int)特点:示例:2. 浮点数 …

150行的推箱子游戏

150行的推箱子游戏#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <ncurses.h> #include <algorithm> t…

嵌入式制作笔记(1)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

tmp2

3、复杂模型机累加指令 ;/*** Start Of Main Memory Data ****/ $P 00 20 ;START: IN R0,00H 从IN单元读入计数初值 $P 01 00 $P 02 61 ;LDI R1,0FH $P 03 0F ;立即数0FH送R1 $P 04 14 ;AND R0,R1 得到R0低…

中国移动获得手机直连卫星通讯牌照:行业变革的催化剂 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月抗衰老精华液,修护精华液,保湿精华液 OEM/ODM 加工厂最新推荐,聚焦高端定制需求与全案交付能力!

据国际高端美妆供应链协会 2025 年 10 月发布的《功效型精华代加工定制服务报告》显示,抗衰老、修护、保湿类精华高端定制 OEM/ODM 需求同比增长 61%,但 45% 的品牌方反馈合作工厂存在 “定制方案单一、全案交付断层…

2025 年 11 月烟酰胺精华液,富勒烯精华液,液态精华液 OEM/ODM 加工厂最新推荐,精准检测与稳定性能深度解析!

据国际美妆检测协会 2025 年 10 月发布的《液态功效型精华代加工检测与稳定性报告》显示,烟酰胺、富勒烯、液态类精华 OEM/ODM 需求同比增长 55%,但 43% 的品牌方反馈合作工厂存在 “检测标准不统一、液态性能不稳定…