【SQL注入】深入解析宽字节注入原理(附靶场环境讲解)

一、addslasehes()转义函数

addslashes() 是 PHP 中用于转义字符串中的特殊字符的函数之一。它会在指定的预定义字符(单引号、双引号、反斜线和 NUL 字符)前面添加反斜杠,以防止这些字符被误解为代码注入或其他意外操作。

1. 用法

string addslashes ( string $str )
  • 参数
    • $str:需要进行转义的字符串。
  • 返回值:返回转义后的字符串。

2. 示例

$input = "It's a beautiful day!";
$escaped_input = addslashes($input);
echo $escaped_input;

在上述示例中,如果 $input 包含单引号 ',调用 addslashes() 后将会得到 "It\'s a beautiful day!"。这样做可以避免潜在的 SQL 注入等安全问题。

二、宽字节注入

在网站开发中,防范SQL注入是至关重要的安全措施之一。常见的防御手段之一是使用PHP函数 addslashes() 来转义特殊字符,如单引号、双引号、反斜线和NULL字符。然而,宽字节注入攻击利用了这种转义机制的漏洞,通过特殊构造的宽字节字符绕过 addslashes() 函数的转义,从而实现对系统的攻击。

1. 宽字节注入原理

通常情况下,SQL注入点是通过单引号来识别的。但当数据经过 addslashes() 处理时,单引号会被转义成无功能性字符,在判断注入点时失效。攻击者利用宽字节字符集(如GBK)将两个字节识别为一个汉字,绕过反斜线转义机制,并使单引号逃逸,实现对数据库查询语句的篡改。

2. 示例与Payload构造
  • 假设有以下测试payload:
输入payload: ' or 1=1 #
经过 addslashes() 后:\' or 1=1 #

分析:'的url编码是%27,经过addslashes()以后,'就变成了\',对应的url编码就是%5c%27

  • 针对上述情况,可以构造绕过payload:
构造绕过payload: %df' or 1=1 #
经过 addslashes() 后: %df\' or 1=1 #

分析:我们在payload中的'之前加了一个字符%df,经过addslashes()以后,%df'就变成了%df\',对应的URL编码为:%df%5c%27。 当MySQL使用GBK编码时,会将%df%5c 解析成一个字,从而使得单引号%27成功逃逸。

3. 靶场场景示例:

以sqli dumb series-32为例,讲解宽字节注入使用方式:
首先输入?id=1'测试是否存在注入,发现单引号'被转义成\'失效了,考虑使用宽字节注入绕过转义符
image.png
构造?id=1%df',页面有报错回显,说明单引号成功逃逸
image.png
接下来使用常规思路构造payload获取数据库名等:?id=100%df' union select 1,database(),3 --+
image.png

4. 防范措施
  • 避免直接使用addslashes():考虑替代方案如使用预处理语句或更安全的转义函数。
  • 严格验证用户输入:确保只接受符合预期格式和内容的数据。
  • 统一字符编码方式:避免混合使用不同字符编码方式来处理字符串。
  • 定期审查代码:持续审查代码以发现潜在漏洞,并及时修复。

通过加强对宽字节注入攻击原理及防范措施的了解,并采取相应措施加固系统安全性,可以有效降低系统受到此类漏洞威胁带来风险。保障用户数据和系统完整性是开发人员不可或缺的责任与挑战。

宽字节注入是一种常见的 SQL 注入技术,它利用了一些编码方式对非 ASCII 字符进行编码的特点,从而绕过某些安全机制,达到执行恶意 SQL 语句的目的。 宽字节注入原理是将非 ASCII 字符编码为多个 ASCII 字符,然后将这些 ASCII 字符作为参数传递给应用程序,应用程序在解析这些参数时,可能会将其视为多个独立的字符,从而绕过一些安全机制。 例如,假设我们有一个包含语句的 Web 应用程序: ``` SELECT * FROM users WHERE username='admin' AND password='123456'; ``` 如果我们想使用宽字节注入技术来执行恶意 SQL 语句,我们可以将输入的用户名编码为 UTF-8 格式,并在其后面添加一个宽字节(%u00),这样就可以绕过应用程序的安全机制,注入额外的 SQL 语句,例如: ``` SELECT * FROM users WHERE username='admin%u00' OR 1=1 -- ' AND password='123456'; ``` 在这个例子中,%u00 是一个宽字节,它将 'a' 编码为 '%61%00',这样在应用程序解析这个参数时,它会将其视为两个独立的字符:'a' 和 '\u00'。因此,应用程序将执行以下 SQL 语句: ``` SELECT * FROM users WHERE username='admin' OR 1=1 -- ' AND password='123456'; ``` 其中,'--' 表示注释符号,它可以使后面的 SQL 语句被忽略,从而达到绕过验证的目的。 需要注意的是,宽字节注入是一种常见的 SQL 注入技术,但并不是万能的,它只能绕过一些简单的安全机制,对于一些高级安全机制可能无法生效。因此,在开发应用程序时,应该使用参数化查询或 ORM 框架等技术来防止 SQL 注入攻击。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值