一、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'
测试是否存在注入,发现单引号'
被转义成\'
失效了,考虑使用宽字节注入绕过转义符
构造?id=1%df'
,页面有报错回显,说明单引号成功逃逸
接下来使用常规思路构造payload获取数据库名等:?id=100%df' union select 1,database(),3 --+
4. 防范措施
- 避免直接使用
addslashes()
:考虑替代方案如使用预处理语句或更安全的转义函数。 - 严格验证用户输入:确保只接受符合预期格式和内容的数据。
- 统一字符编码方式:避免混合使用不同字符编码方式来处理字符串。
- 定期审查代码:持续审查代码以发现潜在漏洞,并及时修复。
通过加强对宽字节注入攻击原理及防范措施的了解,并采取相应措施加固系统安全性,可以有效降低系统受到此类漏洞威胁带来风险。保障用户数据和系统完整性是开发人员不可或缺的责任与挑战。