SQL注入入门介绍
字数 1427 2025-08-15 21:32:35

SQL注入入门详解

0x01 SQL基础概念

SQL(Structured Query Language)是结构化查询语言,用于访问和处理数据库的ANSI标准计算机语言。

SQL注释方法(以MySQL为例)

  • #:单行注释
  • -- (杠杠空格):单行注释
  • /*...*/:多行注释

0x02 SQL注入漏洞概述

漏洞描述

Web程序对用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏SQL语句原有逻辑,攻击者可利用该漏洞执行任意SQL语句。

漏洞产生原因

  1. 通过用户可控参数注入SQL语法
  2. 使用字符串拼接方式构造SQL语句
  3. 未对用户参数进行足够过滤

漏洞危害

  • 获取数据库敏感信息(如管理员密码)
  • 修改或插入数据库内容
  • 获取webshell或服务器系统权限(在特定条件下)

0x03 注入点与注入类型

常见注入点

  • GET数据
  • POST数据
  • Cookie数据
  • HTTP头部字段

注入类型分类

按数据类型

  • 数字型:数据无引号包围(如userid = 3)
  • 字符型:数据有单/双引号包围(如username = "admin")

按注入手法

  1. UNION query SQL injection:可联合查询注入
  2. Error-based SQL injection:报错型注入
  3. Boolean-based blind SQL injection:布尔型盲注
  4. Time-based blind SQL injection:基于时间延迟注入
  5. Stacked queries SQL injection:可多语句查询注入(堆叠查询)

注:前四种主要用于查询,最后一种可用于增删改查

0x04 数据库结构与information_schema

关系型数据库层次结构:库名→表名→字段名→字段内容

MySQL源数据库information_schema关键部分:

字段
information_schema tables table_name(表名)
table_schema(表所属库)
columns column_name(字段名)
table_name(字段所属表)
table_schema(字段所属库)

0x05 SQL注入示例分析

示例1:注释绕过认证

原始SQL:

SELECT * FROM user WHERE username = 'admin' AND password=''

注入输入:admin'#

注入后SQL:

SELECT * FROM user WHERE username = 'admin'#' AND password=''

实际执行:

SELECT * FROM user WHERE username = 'admin'

示例2:逻辑运算绕过

注入输入:admin' OR '1'='1

注入后SQL:

SELECT * FROM user WHERE username = 'admin' OR '1'='1' AND password=''

执行逻辑变为:username = 'admin' OR '1'='1' AND password='',其中'1'='1'恒真

0x06 漏洞源码分析与防御

漏洞源码示例

$user = $_GET['username'];
$pass = $_GET['password'];
$pass = md5($pass);
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";

基础防御方法

if(strstr($user,"#") || strstr($user,"-")) {
    echo "<script>alert('非法字符!')</script>";
    return;
}

注:此方法仅过滤了部分字符,实际防御需更全面的过滤和参数化查询

0x07 进阶防御建议

  1. 使用预处理语句(参数化查询)
  2. 对输入进行严格过滤和转义
  3. 最小权限原则:限制数据库账户权限
  4. 使用Web应用防火墙(WAF)
  5. 定期安全审计和漏洞扫描

总结

SQL注入是OWASP TOP10中最严重的安全风险之一,理解其原理和防御方法对Web安全至关重要。本文介绍了SQL注入的基础概念、类型分类、实际案例和防御思路,为进一步学习更复杂的注入技术奠定了基础。

SQL注入入门详解 0x01 SQL基础概念 SQL(Structured Query Language)是结构化查询语言,用于访问和处理数据库的ANSI标准计算机语言。 SQL注释方法(以MySQL为例) # :单行注释 -- (杠杠空格):单行注释 /*...*/ :多行注释 0x02 SQL注入漏洞概述 漏洞描述 Web程序对用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏SQL语句原有逻辑,攻击者可利用该漏洞执行任意SQL语句。 漏洞产生原因 通过用户可控参数注入SQL语法 使用字符串拼接方式构造SQL语句 未对用户参数进行足够过滤 漏洞危害 获取数据库敏感信息(如管理员密码) 修改或插入数据库内容 获取webshell或服务器系统权限(在特定条件下) 0x03 注入点与注入类型 常见注入点 GET数据 POST数据 Cookie数据 HTTP头部字段 注入类型分类 按数据类型 数字型 :数据无引号包围(如 userid = 3 ) 字符型 :数据有单/双引号包围(如 username = "admin" ) 按注入手法 UNION query SQL injection :可联合查询注入 Error-based SQL injection :报错型注入 Boolean-based blind SQL injection :布尔型盲注 Time-based blind SQL injection :基于时间延迟注入 Stacked queries SQL injection :可多语句查询注入(堆叠查询) 注:前四种主要用于查询,最后一种可用于增删改查 0x04 数据库结构与information_ schema 关系型数据库层次结构: 库名→表名→字段名→字段内容 MySQL源数据库 information_schema 关键部分: | 库 | 表 | 字段 | |----|----|------| | information_ schema | tables | table_ name(表名) | | | | table_ schema(表所属库) | | | columns | column_ name(字段名) | | | | table_ name(字段所属表) | | | | table_ schema(字段所属库) | 0x05 SQL注入示例分析 示例1:注释绕过认证 原始SQL: 注入输入: admin'# 注入后SQL: 实际执行: 示例2:逻辑运算绕过 注入输入: admin' OR '1'='1 注入后SQL: 执行逻辑变为: username = 'admin' OR '1'='1' AND password='' ,其中 '1'='1' 恒真 0x06 漏洞源码分析与防御 漏洞源码示例 基础防御方法 注:此方法仅过滤了部分字符,实际防御需更全面的过滤和参数化查询 0x07 进阶防御建议 使用预处理语句(参数化查询) 对输入进行严格过滤和转义 最小权限原则:限制数据库账户权限 使用Web应用防火墙(WAF) 定期安全审计和漏洞扫描 总结 SQL注入是OWASP TOP10中最严重的安全风险之一,理解其原理和防御方法对Web安全至关重要。本文介绍了SQL注入的基础概念、类型分类、实际案例和防御思路,为进一步学习更复杂的注入技术奠定了基础。