理论学习

学习进度:
75%

SQL注入漏洞概述

什么是SQL注入?

SQL注入是一种常见的Web安全漏洞,攻击者通过在应用程序的输入字段中插入恶意的SQL代码,从而操控后台数据库执行非预期的查询操作。

危害等级

高危

可能导致数据泄露、数据篡改、权限提升等严重后果

影响范围

  • 数据库数据泄露
  • 用户隐私信息暴露
  • 系统权限被绕过
  • 数据完整性被破坏

SQL注入技术原理

漏洞成因

当应用程序直接将用户输入拼接到SQL查询语句中,而没有进行适当的过滤和转义时,就可能产生SQL注入漏洞。

脆弱代码示例


// 脆弱的PHP代码
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysql_query($sql);
                                

攻击原理图解

SQL注入攻击流程图

联合查询注入攻击方法

UNION查询基础

UNION操作符用于合并两个或多个SELECT语句的结果集。在SQL注入中,攻击者可以利用UNION查询来获取其他表的数据。

攻击步骤

  1. 判断注入点

    通过输入特殊字符判断是否存在SQL注入

    id=1' OR '1'='1
  2. 判断字段数

    使用ORDER BY语句确定查询的字段数量

    id=1' ORDER BY 3--
  3. 确定显示位

    使用UNION SELECT确定哪些字段会在页面中显示

    id=-1' UNION SELECT 1,2,3--
  4. 获取数据库信息

    利用显示位获取数据库版本、名称等信息

    id=-1' UNION SELECT 1,version(),database()--

SQL注入防护措施

预编译语句(推荐)


// 安全的PHP代码 - 使用预编译语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
$result = $stmt->fetchAll();
                                

输入验证和过滤

  • 对用户输入进行严格的类型检查
  • 使用白名单过滤特殊字符
  • 限制输入长度和格式

最小权限原则

  • 数据库用户只授予必要的权限
  • 禁用危险的数据库函数
  • 定期审查数据库权限配置

SQL注入实际案例

案例1: 某电商网站用户信息泄露

漏洞描述: 该网站的用户登录接口存在SQL注入漏洞

攻击过程: 攻击者通过构造特殊的用户名参数,成功获取了所有用户的账号密码

影响范围: 约10万用户信息泄露

修复方案: 使用参数化查询重写登录验证逻辑

学习笔记

实践操作

环境运行中 剩余时间: 28:45

实验指导

1

访问靶场应用

点击上方链接访问靶场,观察登录页面的结构

✓ 已完成
2

测试注入点

在用户名输入框中输入 admin' OR '1'='1 测试是否存在注入

进行中
3

判断字段数

使用ORDER BY语句确定查询的字段数量

4

构造UNION查询

利用UNION SELECT获取数据库信息

载荷历史

  • admin' OR '1'='1 成功
  • admin' ORDER BY 3-- 成功
  • admin' ORDER BY 4-- 失败

响应结果


Database Version: MySQL 5.7.32
Current Database: dvwa
User: dvwa@localhost