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

目录

1.原理知识:

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

一、基本概念

二、典型攻击场景(以密码更新为例)

三、具体攻击步骤分解

四、与普通注入的关键区别

五、防御方案

1. 数据存储阶段

2. 数据使用阶段

3. 深度防御措施

4. 安全审计建议

六、实际案例检测

七、进阶防护:ORM层防护

2.更新密码的二阶注入攻击关系解释

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

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

二、关键漏洞形成原理

三、与传统注入的核心区别

四、完整攻击实例分析

五、针对性防御方案

1. 存储阶段防御

2. 使用阶段防御

3. 深度防御措施

六、漏洞检测方法

七、现代框架的最佳实践

3.建立具有密码更新功能的网站

3.1用户注册页面(html)

3.1实现注册功能(php)

3.3登录验证(php)

3.4更新密码 (html)

3.5更新密码功能(php)

4.用户使用功能测试

5.二阶注入攻击的防护

​​5.1PHP转义​

​​工作原理​​

​​1. 转义特殊字符​​

​​2. 防止 SQL 注入​​

​​注意事项​​

5.2Mysqli参数化更新


1.原理知识:

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

一、基本概念

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

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

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

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

    存储结果

    id username
    1 admin'--
  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('/[^\[email protected]]/', '', $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''--')

    数据库实际存储:

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值