SQL注入——二次注入的原理 利用以及防御

二次注入

二次注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。二次注入是sql注入的一种,但是比普通sql注入利用更加困难,利用门槛更高。普通注入数据直接进入到 SQL 查询中,而二次注入则是输入数据经处理后存储,取出后,再次进入到 SQL 查询。

原理

在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在后端代码中可能会被转义,但在存入数据库时还是原来的数据,数据中一般带有单引号和#号,然后下次使用在拼凑SQL中,所以就形成了二次注入。

过程

  1. 插入1‘#
  2. 转义成1\’#
  3. 不能注入,但是保存在数据库时变成了原来的1’#
  4. 利用1’#进行注入,这里利用时要求取出数据时不转义

换言之, 二次注入需要具备的两个条件:
(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)
(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户

利用

:以sqli-lab24为例
1正常来说无法通过注入来登录admin,因为用户输入会被转义
2注册admin ‘#
3登录admin ‘# 转义成admin\’#,则登录的是admin’#
4修改admin ‘# 由于这里不会被转义,故可以直接利用,这个时候就变成了修改了admin的密码了
在这里插入图片描述

防御

1 解决SQL注入最推荐的方法还是预处理+数据绑定。
2 另一个防御的点就是 对输入一视同仁,无论输入来自用户还是存储,在进入到 SQL 查询前都对其进行过滤、转义

### SQL 二次注入攻击原理 SQL 二次注入是一种特殊的SQL注入形式,在这种情况下,恶意输入被暂时保存在数据库中而不是立即执行。当应用程序稍后检索并处理这些数据时,未正确转义的数据可能导致意外的SQL命令被执行[^1]。 例如,考虑一个论坛应用允许用户设置自己的签名档。假设该平台没有充分验证或清理提交的内容,则攻击者可以在此字段内嵌入有害字符串。当下次显示此用户的帖子列表时,服务器端代码可能会尝试读取这条记录来构建页面输出,而其中包含未经适当过滤的先前存储下来的特殊字符序列,从而触发潜在风险。 ```sql -- 用户提供的恶意签名可能如下所示: ' OR '1'='1 ``` 一旦上述内容作为正常查询的一部分再次拼接成新的语句片段,就有可能绕过预期逻辑控制流,造成非授权操作的发生。 ### 防御措施 为了防止SQL 二次注入的风险,应当采取多层次的安全策略: #### 参数化查询与预编译语句 通过使用参数化的SQL查询而非直接拼接字符串的方式构造指令集,能够有效阻止大部分类型的SQL注入威胁。这种方式确保了传入变量仅会被解释为值而不是部分构成语法结构本身的部分。 ```csharp using (var command = new SqlCommand("SELECT * FROM Users WHERE Username=@username", connection)) { command.Parameters.AddWithValue("@username", userInput); } ``` #### 数据净化和编码转换 对于任何来自外部源的信息,在存入库之前都应经过严格的清洗流程去除掉不必要的空白符、HTML标签以及其它可疑成分;同时针对特定上下文环境做相应的编码变换(比如URL编码),以此减少后续环节遭遇解析错误的概率[^4]。 #### 输出逃逸机制 即使是在展示阶段也要保持警惕——特别是那些曾经由第三方供给过的材料。采用合适的函数对即将呈现给浏览器或其他客户端组件前的数据实施必要的转义动作,使得它们不会干扰到渲染过程中的标记语言解析器工作状态[^3]。 #### 定期审查和更新依赖库 随着技术进步,旧版软件可能存在未知漏洞。因此建议开发者团队持续关注官方发布的补丁通知,并及时升级至最新稳定版本以获得更好的保护性能[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值