SQL注入入门介绍
字数 1427 2025-08-15 21:32:35
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:
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 进阶防御建议
- 使用预处理语句(参数化查询)
- 对输入进行严格过滤和转义
- 最小权限原则:限制数据库账户权限
- 使用Web应用防火墙(WAF)
- 定期安全审计和漏洞扫描
总结
SQL注入是OWASP TOP10中最严重的安全风险之一,理解其原理和防御方法对Web安全至关重要。本文介绍了SQL注入的基础概念、类型分类、实际案例和防御思路,为进一步学习更复杂的注入技术奠定了基础。