更新密码--二阶注入攻击的原理

article/2025/7/21 20:24:50

1.原理知识:

二阶SQL注入攻击(Second-Order SQL Injection)原理详解

一、基本概念

二阶注入是一种"存储型"SQL注入,攻击流程分为两个阶段:

  1. ​首次输入​​:攻击者将恶意SQL片段存入数据库
  2. ​二次调用​​:当应用程序使用存储的数据构造SQL查询时触发攻击
二、典型攻击场景(以密码更新为例)

三、具体攻击步骤分解
  1. ​初始注入阶段​

    -- 攻击者注册特殊用户名
    INSERT INTO users(username) VALUES ('admin''-- ')

    存储结果

    idusername
    1admin'--
  2. ​触发阶段(密码更新操作)​

    // 应用代码示例(存在漏洞)
    $newPassword = $_POST['password'];
    $username = $_SESSION['username']; // 从会话获取"admin'--"$sql = "UPDATE users SET password='$newPassword' WHERE username='$username'";

    实际执行SQL

    UPDATE users SET password='hacked' 
    WHERE username='admin'-- '

    ​效果​​:

    • --注释掉了后续条件
    • 所有用户的密码被更新为hacked
四、与普通注入的关键区别
特性普通SQL注入二阶注入
触发时机即时执行延迟执行(数据被使用时)
输入点直接拼接的输入参数存储在数据库中的数据
防御难度较易检测更难发现
五、防御方案
1. 数据存储阶段
// 存入前转义+类型检查
$username = $pdo->quote($_POST['username']); 
// 或使用预处理
$stmt = $pdo->prepare("INSERT INTO users(username) VALUES (?)");
$stmt->execute([$_POST['username']]);
2. 数据使用阶段
// 永远使用参数化查询(即使数据来自数据库)
$stmt = $pdo->prepare("UPDATE users SET password=? WHERE username=?");
$stmt->execute([$newPassword, $dbStoredUsername]);
3. 深度防御措施
  • ​数据净化​​:在读取数据库后仍进行过滤
    function sanitizeDbValue($value) {return preg_replace('/[^\w@.-]/', '', $value); 
    }
  • ​权限分离​​:
    CREATE USER 'app_update'@'localhost' IDENTIFIED BY 'pass';
    GRANT UPDATE(password) ON db.users TO 'app_update'@'localhost';
    -- 无权限修改其他字段
4. 安全审计建议
-- 监控非常规模式
CREATE TRIGGER audit_password_changes 
AFTER UPDATE ON users
FOR EACH ROW
INSERT INTO audit_log VALUES(NEW.id, '密码变更', NOW());
六、实际案例检测

检测代码是否脆弱:

// 危险代码模式(可被二阶注入利用)
function updatePassword($conn, $newPass){$user = getUserFromDB(); // 从数据库获取用户名$conn->query("UPDATE users SET pass='$newPass' WHERE user='{$user['name']}'");
}// 安全版本
function safeUpdatePassword($pdo, $newPass){$user = getUserFromDB();$stmt = $pdo->prepare("UPDATE users SET pass=? WHERE user=?");$stmt->execute([$newPass, $user['name']]);
}
七、进阶防护:ORM层防护
// 使用Laravel Eloquent示例
User::where('name', $request->username)->update(['password' => bcrypt($request->password)]); 
// 自动参数化,无需手动处理

关键原则:​​所有来自外部和内部的数据在拼接SQL时都应视为不可信的​​,必须通过参数化查询处理。

2.更新密码的二阶注入攻击

用户注册的特殊账号会再更新密码的过程中引起二阶注入攻击。

更新密码场景下的二阶SQL注入攻击原理详解

一、攻击流程全貌(以密码更新为例)

二、关键漏洞形成原理
  1. ​第一次存储时的"无害"数据​

    -- 注册时(使用了参数化查询,此时安全)
    INSERT INTO users(username) VALUES('admin''--')

    数据库实际存储:

    idusername
    1admin'--
  2. ​密码更新时的危险拼接​

    // 漏洞代码示例
    $username = getUsernameFromDB(); // 获取存储的"admin'--"
    $newPass = $_POST['password'];// 直接拼接SQL(未使用参数化)
    $sql = "UPDATE users SET password='$newPass' WHERE username='$username'";

    生成的恶意SQL:

    UPDATE users SET password='hacked' 
    WHERE username='admin'-- '
  3. ​注入效果​

    • --注释掉了原SQL的条件部分
    • 语句等效于:
      UPDATE users SET password='hacked'
    • ​所有用户的密码被修改​
三、与传统注入的核心区别
特性传统注入二阶注入
输入点直接来自HTTP请求来自数据库存储的数据
触发条件立即执行需要特定业务逻辑触发
防御盲区输入过滤即可防御需要全程参数化
检测难度容易被扫描器发现需要业务流分析
四、完整攻击实例分析
  1. ​攻击准备阶段​

    POST /register HTTP/1.1
    username=admin'--&password=123
    • 后端安全地存储了该用户名(此时无风险)
  2. ​触发攻击阶段​

    POST /update-password HTTP/1.1
    new_password=hacked
    • 后端操作流程:
      // 从数据库获取当前用户名
      $user = $db->query("SELECT username FROM users WHERE id = {$_SESSION['id']}")->fetch();// 危险操作:拼接SQL
      $db->exec("UPDATE users SET password='hacked' WHERE username='{$user['username']}'");
  3. ​实际执行的恶意SQL​

    UPDATE users SET password='hacked' 
    WHERE username='admin'-- '
五、针对性防御方案
1. 存储阶段防御
// 注册时严格过滤
function validateUsername($name) {return preg_match('/^[a-z0-9_]{3,20}$/i', $name);
}// 使用预处理语句存储
$stmt = $pdo->prepare("INSERT INTO users(username) VALUES(?)");
$stmt->execute([$_POST['username']]);
2. 使用阶段防御
// 密码更新操作(安全版本)
function updatePassword($userId, $newPass) {$pdo = new PDO(...);// 步骤1:获取用户名(使用参数化)$stmt = $pdo->prepare("SELECT username FROM users WHERE id = ?");$stmt->execute([$userId]);$user = $stmt->fetch();// 步骤2:更新密码(再次参数化)$stmt = $pdo->prepare("UPDATE users SET password = ? WHERE username = ?");$stmt->execute([password_hash($newPass, PASSWORD_BCRYPT), $user['username']]);
}
3. 深度防御措施
  • ​数据库权限隔离​

    CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'pass';
    GRANT SELECT, UPDATE(password) ON db.users TO 'app_user'@'localhost';
    -- 禁止修改username等其他字段
  • ​审计日志​

    CREATE TRIGGER password_change_audit
    AFTER UPDATE ON users
    FOR EACH ROW
    INSERT INTO security_log VALUES(USER(), CONCAT('Password changed for ', OLD.username),NOW()
    );
六、漏洞检测方法
  1. ​代码审计关键点​

    • 查找所有从数据库读取数据后直接拼接SQL的地方
    • 特别关注:用户资料更新、密码重置、权限变更等敏感操作
  2. ​自动化测试脚本​

# 二阶注入测试脚本示例
def test_second_order_injection():# 注册测试账号register("test'--", "123456")# 修改密码resp = update_password("new_password")# 验证是否所有用户密码被修改admin_pass = get_password("admin")assert admin_pass == "new_password"  # 如果成立说明漏洞存在
七、现代框架的最佳实践
// Laravel示例(自动防护二阶注入)
User::where('username', $request->username)->update(['password' => bcrypt($request->new_password)]);
// Eloquent ORM自动使用参数化查询// 即使这样也是安全的:
$user = User::find($id);
DB::update("UPDATE users SET password = ? WHERE username = ?", [$newPass, $user->username]);

关键安全原则:​​无论数据来自HTTP请求还是数据库,在拼接SQL时永远使用参数化查询​​。这种防御方式能同时防护一阶和二阶SQL注入攻击。


http://www.hkcw.cn/article/TPhWpicdZm.shtml

相关文章

RFID技术助力托盘运输线革新

RFID技术助力托盘运输线革新 湖北某工厂托盘运输线使用上存在的问题: 1、托盘在运输线上受信息录入时间等问题影响,导致效率低下; 2、原先托盘上粘贴的条码容易污损,并且时常需要更新更换,导致信息录入、出入库等步…

EasyRTC嵌入式音视频通信SDK助力1v1实时音视频通话全场景应用

一、方案概述​ 在数字化通信需求日益增长的今天,EasyRTC作为一款全平台互通的实时视频通话方案,实现了设备与平台间的跨端连接。它支持微信小程序、APP、PC客户端等多端协同,开发者通过该方案可快速搭建1v1实时音视频通信系统,适…

java.io.IOException: ZIP entry size is too large or invalid

java.io.IOException: ZIP entry size is too large or invalid 解决方案&#xff1a;pom.xml添加<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>

vue3 项目配置多语言支持,如何从服务端拿多语言配置

在 Vue3 项目中实现多语言支持并从服务端获取配置&#xff0c;可以使用 Vue I18n 库。在初始化阶段可以发送请求获取多语言配置或者通过本地文件加载json文件的方式&#xff0c;都可以实现。我这里是tauri项目&#xff0c;所以使用的是invoke从tauri端拿到配置文件&#xff0c;…

龙舟竞渡与芯片制造的共通逻辑:华芯邦的文化破局之道

端午节承载着中华民族数千年的精神密码&#xff0c;龙舟最初是古人沟通天地、祈求风调雨顺的仪式载体。战国时期&#xff0c;屈原投江的悲壮故事为端午注入了家国情怀&#xff0c;龙舟竞渡从此兼具纪念英雄与祈福避疫的双重意义。这种文化内核&#xff0c;与深圳市华芯邦“以科…

OS9.【Linux】基本权限(下)

目录 1.默认权限 掩码 修改权限掩码 目录的权限说明 r权限 w权限 x权限 结论 家目录权限 2.共享目录 粘滞位t 承接OS8.【Linux】基本权限(上)文章 1.默认权限 创建用户时拥有者所属组都是该用户,而且对其他人没有任何权限 掩码 新建文件new.txt1和目录folder后…

【容器docker】启动容器kibana报错:“message“:“Error: Cannot find module ‘./logs‘

说明&#xff1a; 1、服务器数据盘挂了&#xff0c;然后将以前的数据用rsync拷贝过去&#xff0c;启动容器kibana服务&#xff0c;报错信息如下图所示&#xff1a; 2、可能是拷贝docker文件夹&#xff0c;有些文件没有拷贝过去&#xff0c;导致无论是给文件夹授权用户kibana或者…

【25-cv-05917】HSP律所代理Le Petit Prince 小王子商标维权案

Le Petit Prince 小王子 案件号&#xff1a;25-cv-05917 立案时间&#xff1a;2025年5月28日 原告&#xff1a;SOCIETE POUR LOEUVRE ET LA MEMOIRE DANTOINE DE SAINT EXUPERY - SUCCESSION DE SAINT EXUPERY-DAGAY 代理律所&#xff1a;HSP 原告介绍 《小王子》&#x…

信创国产化

一、硬件国产化 1. 飞腾E2000Q 二、操作系统国产化 1. 麒麟系统 1.1 麒麟嵌入式支持飞腾E2000Q 1.1.1 启动安装盘制作 1. 下载rufus工具,安装,下载麒麟系统ISO镜像文件。 2. 使用rufus制作启动盘,U盘插入(注先备份数据,会格式化盘符),配置参数如图。 3. 点击…

一、Sqoop历史发展及原理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月30日 专栏&#xff1a;Sqoop教程 在大数据时代&#xff0c;数据往往分散存储在各种不同类型的系统中。其中&#xff0c;传统的关系型数据库 (RDBMS) 如 MySQL, Oracle, PostgreSQL 等&#xff0c;仍然承载着大量的关键业务…

2.从0开始搭建vue项目(node.js,vue3,Ts,ES6)

从“0到跑起来一个 Vue 项目”&#xff0c;重点是各个工具之间的关联关系、职责边界和技术演化脉络。 从你写代码 → 到代码能跑起来 → 再到代码可以部署上线&#xff0c;每一步都有不同的工具参与。 &#x1f63a;&#x1f63a;1. 安装 Node.js —— 万事的根基 Node.js 是…

包管理工具

npx工具 npx是什么捏&#xff1f; npx是npm5.2之后自带的一个命令 npx的作用非常之多&#xff0c;但是比较常见的是它用来调用项目中的某个模块的指令 现在假设一个场景&#xff1a; 你在项目里安装了webpack&#xff0c;也在全局中安装了webpack&#xff0c;但是这俩版本…

信号发生器幅值和偏置设置

Vrms是有效幅度 Vpp是幅度峰峰值 Vp是幅度最大值 幅度 2Vpp, 偏置 0V: 信号范围&#xff1a; -1V (谷底) 到 1V (峰顶) -> 中心点在 0V。 幅度 2Vpp, 偏置 1V: 信号范围&#xff1a; (-1V 1V) 0V (谷底) 到 (1V 1V) 2V (峰顶) -> 中心点在 1V。 形状和 Vpp (2…

深入浅出:Spring IOCDI

什么是IOC IOC IOC(Inversion of Control)&#xff0c;是一种设计思想&#xff0c;在之前的SpringMVC里就在类上添加RestController和Controller注解就是使用了IOC&#xff0c;这两个注解就是在Spring中创建一个对象&#xff0c;并将注解下的类交给Spring管理&#xff0c;Spr…

Java并发

一、进程和线程 进程&#xff1a; 程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff0c;因此进程是动态。系统运行一个程序即是一个进程从创建&#xff0c;运行到消亡的过程。 在Java中&#xff0c;当我们启动main函数时其实就是启动了一个JVM进程&#xff…

通过回调函数注册定时器触发事件

1、说明 使用回调函数&#xff0c;注册定时器触发事件的模式&#xff0c;提高定时器中断的可操作性&#xff0c;那如何实现呢&#xff1f; 2、.h文件 下面是定时器句柄的声明 3、.c文件 3.1、静态定时器句柄头 3.2、定时器回调函数处理 下面的函数是放在1ms的中断中的&#…

Visual Studio+SQL Server数据挖掘

这里写自定义目录标题 工具准备安装Visual studio 2017安装SQL Server安装SQL Server Management Studio安装analysis service SSMS连接sql serverVisual studio新建项目数据源数据源视图挖掘结构部署模型设置挖掘预测 部署易错点 工具准备 Visual studio 2017 analysis servi…

大模型-attention汇总解析之-MHA

一、MHA(Multi-Head Attention) 1.1 MHA 原理 MHA&#xff08;Multi-Head Attention&#xff09;称为多头注意力&#xff0c;开山之作所提出的一种 Attention 计算形式&#xff0c;它是当前主流 LLM 的基础工作。在数学原理上&#xff0c;多头注意力 MHA 等价于多个独立的单头…

历年上海交通大学计算机保研上机真题

2025上海交通大学计算机保研上机真题 2024上海交通大学计算机保研上机真题 2023上海交通大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school String Match 题目描述 Finding all occurrences of a pattern in a text is a problem that arises freq…

DeepSeek-R1-0528-Qwen3-8B 本地ollama离线运行使用和llamafactory lora微调

参考: https://huggingface.co/deepseek-ai/DeepSeek-R1-0528-Qwen3-8B 量化版本: https://huggingface.co/unsloth/DeepSeek-R1-0528-Qwen3-8B-GGUF https://docs.unsloth.ai/basics/deepseek-r1-0528-how-to-run-locally 1、ollama运行 升级ollama版本到0.9.0 支持直接…