在 NahamCon 大会的一次演讲中,安全专家 Tib3rius 深入剖析了进行手工 SQL 注入(SQLi)的系统性方法。
以下是精简提炼后的核心方法论。
第一部分:“破坏与修复”检测法
摒弃猜测,采用科学方法。初期的目标并非立即窃取数据,而是验证数据库是否会响应你的输入。
核心逻辑:
若能故意“破坏”一个页面,再通过特定输入“修复”它,则证明你拥有控制查询语句的能力。
五步工作流程:
- 寻找注入点:识别包含ID参数的URL(例如
id=1)、搜索框或登录表单。
- 建立行为基线:
- 输入一个有效的值(如
id=1)。页面正常加载吗?是。
- 输入一个无效的值(如
id=9999)。页面是否返回404或错误?是。
- “破坏”语法:在有效值后添加一个单引号 (
‘) 来制造语法错误。
- 输入:
id=1'
- 结果:页面是否返回500服务器错误或变成空白?如果是,很好,你成功引发了错误。
- “修复”语法:使用注释符来“修复”你添加的单引号。
- 输入:
id=1' -- -
- 结果:页面是否恢复正常加载?
- 漏洞确认:如果步骤3导致页面崩溃,而步骤4使其恢复正常,那么你已成功发现一个SQL注入漏洞。这是进行网络安全实战测试的基础。
第二部分:常见语法陷阱与解决方案
1. 尾随空格问题
通常使用 -- 来注释查询的剩余部分。
- 问题:许多数据库要求注释符后必须有一个空格。若Web服务器过滤了尾部空格,攻击便会失败。
- 解决方案:使用
-- -。末尾多余的 - 能确保中间的空白被数据库识别。
2. 注释符失效时
有时,注释掉后续代码会导致网站功能异常(例如,原查询需要一个闭合结构)。
- 解决方案:不删除代码,而是构造一个永真条件来维持原语法结构。
- 有效载荷:
‘ AND ‘1’=’1
- 这样既能保持查询完整,又能嵌入你自己的逻辑。
第三部分:数据库指纹识别
不要盲目猜测数据库类型。直接让数据库“告诉”你它是什么。
逐一尝试以下载荷,首个返回“200 OK”(正常页面)的即为目标数据库技术。

第四部分:数据窃取与漏洞利用
确认漏洞后,便可进行数据提取。
1. UNION 联合查询攻击
目的是将你的查询结果与应用程序的数据合并显示。
- 问题:页面通常只显示第一个查询结果(即原始数据)。
- 解决方案:使原始查询结果为空。
- 方法:将参数改为一个不存在的值,例如
id=-1。
- 结果:应用程序找不到ID为-1的数据,因此会显示你通过UNION注入的数据。
2. 高效确定列数
使用UNION的前提是必须知道前后查询的列数一致。
- 低效方法:依次尝试
ORDER BY 1, ORDER BY 2, ORDER BY 3…(速度慢)。
- 高效方法(二分查找):
- 尝试
ORDER BY 10。报错吗?
- 尝试
ORDER BY 5。成功吗?
- 那么答案就在5到10之间。以此类推,能在数秒内确定列数。
3. 登录绕过技巧
尝试绕过身份验证时:
- 经典载荷:
‘ OR 1=1 --
- 风险:这可能返回所有用户,导致应用逻辑混乱。
- 优化方案:
‘ OR 1=1 LIMIT 1 --
- 作用:强制数据库仅返回第一条(通常是管理员)记录,实现精准登录绕过。
第五部分:盲注攻击(当数据库静默时)
有时,数据库不会直接返回数据或错误信息,只通过页面是否正常加载来反馈“是”或“否”。
切勿逐字符暴力猜解(例如:密码第一个字母是a吗?是b吗?…)。
应采用基于数学的二分查找法:
- 将字符转换为其ASCII码值。
- 询问数据库:该值是否大于100?页面正常(是)→ 排除了小于100的所有可能。
- 询问:该值是否大于110?页面错误(否)→ 范围缩小到100-110之间。
使用此方法,仅需约 7 次请求 便可确定一个字符的准确值,极大提升了盲注效率。
总结
自动化工具如 SQLmap 在确认漏洞后用于数据导出非常高效。但如何首先发现漏洞呢?掌握这套手工检测与利用的科学安全测试方法论至关重要。
|