SQL注入漏洞原理

漏洞产生的根本原因

核心问题:用户输入与数据库交互

php 复制代码
// 安全代码(数据写死)
$sql = "SELECT * FROM table1 WHERE id < 4";

上述代码没有漏洞,因为查询条件是固定的。

php 复制代码
// 存在漏洞的代码(用户可控)
$id = $_GET['id'];
$sql = "SELECT * FROM table1 WHERE id < $id";

当用户可以控制查询参数时,就可能产生SQL注入漏洞。

漏洞触发条件

用户输入场景:

  • GET参数:?id=4
  • POST表单提交
  • Cookie值
  • HTTP头部信息

危险操作:

php 复制代码
// 带引号的参数
$sql = "SELECT * FROM table1 WHERE username='$username'";

如果用户输入包含单引号:

复制代码
?username=admin' OR '1'='1

实际执行的SQL变成:

sql 复制代码
SELECT * FROM table1 WHERE username='admin' OR '1'='1'

破坏引号闭合:

复制代码
?id=4'
?id=4\

这些输入会破坏SQL语句结构,导致:

  • 数据库报错
  • 泄露数据库结构信息
  • 执行恶意SQL语句

生产环境与实验环境差异

PHPStudy实验环境:

  • 默认关闭错误显示
  • 便于学习和测试
  • 不会暴露敏感信息

靶场环境:

  • 故意开启错误显示
  • 方便学习漏洞利用
  • 模拟不安全的配置

生产环境:

  • 应该关闭错误显示
  • 记录日志但不向用户展示
  • 使用通用错误页面

SQL注入实战案例

靶场地址:sqliabs.njhack.xyz

测试目标: 获取数据库中的所有用户信息

基础测试:

复制代码
http://sqliabs.njhack.xyz/?id=2
http://sqliabs.njhack.xyz/index.php?id=2

攻击思路:

  1. 判断注入点存在性
  2. 确定字段数量
  3. 获取数据库信息
  4. 提取表名和字段名
  5. 导出敏感数据

代码层面的漏洞分析

后端处理逻辑:

php 复制代码
<?php
$id = $_GET['id'];
$sql = "SELECT username, password FROM table1 WHERE id = $id";
$result = $conn->query($sql);
?>

正常请求:

复制代码
?id=1
执行:SELECT username, password FROM table1 WHERE id = 1

恶意请求:

复制代码
?id=1 OR 1=1
执行:SELECT username, password FROM table1 WHERE id = 1 OR 1=1
结果:返回所有记录

估算目标数据库语法

数据库语法差异: 不同数据库有不同的SQL方言:

  • MySQL:使用反引号、LIMIT语法
  • SQL Server:使用方括号、TOP语法
  • Oracle:使用ROWNUM
  • PostgreSQL:使用双引号

判断数据库类型: 通过错误信息、特定函数、语法差异来判断。

相关推荐
LaughingZhu13 分钟前
Product Hunt 每日热榜 | 2026-10-01
数据库·人工智能·深度学习·神经网络·搜索引擎
阳光九叶草LXGZXJ14 分钟前
达梦数据库-学习-67-SSL加密认证
linux·运维·数据库·sql·学习·ssl
ha_lydms19 分钟前
MaxCompute中JSON函数
大数据·数据库·阿里云·json·dataworks·maxcompute·odps
驭渊的小故事27 分钟前
MyBatis 入门:从 JDBC 到优雅操作数据库(一)
笔记·sql·spring
细嗅蔷薇@1 小时前
DML常见操作
数据库·mysql
lusklusklusk1 小时前
Oracle数据库基础之7_备份恢复基础之SCN
数据库·oracle
Wx-bishekaifayuan1 小时前
springboot房屋租赁系统11574-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·sql·spring·课程设计
ao-weilai2 小时前
MySQL数据库:MySQL基础概要
数据库·mysql
雪碧聊技术2 小时前
从 0 跑通一个最小 RAG Demo:文档切分、向量检索与答案生成
数据库·oracle
喜欢的名字被抢了2 小时前
08-Redis 性能优化篇:快在哪、BigKey、HotKey、慢查询与内存
数据库·redis·性能优化