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:使用双引号

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

相关推荐
名字还没想好☜8 分钟前
Go 的 database/sql 连接池实战:SetMaxOpenConns 怎么配、连接泄漏怎么查
数据库·sql·golang·go·数据库连接池
大眼、不聚光11 分钟前
2.oracle--表空间管理
数据库·oracle
字节跳动数据库15 分钟前
火山 PostgreSQL Serverless × 飞书妙搭:把 AI 装进数据库,一句话唤醒数据智能
数据库·人工智能·后端
玛丽莲茼蒿19 分钟前
Redis(六)—— Redis高级
数据库·redis·缓存
Csvn1 小时前
📊 SQL 入门 Day 20:锁机制
后端·sql
Wang's Blog1 小时前
PostgreSQL笔记22: WAL日志与崩溃恢复原理
数据库·笔记·postgresql
陈聪.1 小时前
企业级 NoSQL 数据库 Redis 核心知识整理
数据库·redis·nosql
翼龙云_cloud2 小时前
腾讯云国际代理商:CDB数据库自动备份和异地灾备配置 从快照到跨区域恢复
运维·数据库·云计算·腾讯云
小屁孩你滑稽掉了2 小时前
prisma操作数据库的方法使用教程(简洁版)
数据库·node.js·prisma·fastify
l1t2 小时前
利用DuckDB luajit插件和openblas库对表中数据做矩阵运算
数据库·线性代数·矩阵·duckdb