一句话概括
宽字节注入就是一种利用数据库的中文编码方式(如GBK) 的特殊性,来“骗”过网站的防护系统,从而进行SQL注入攻击的方法。
详细拆解
想象一个场景:网站有一个登录框,你输入用户名。正常的逻辑是,你输入 Alice,后台数据库会执行这样一句查询:
SELECT * FROM users WHERE username = 'Alice'
但如果你输入的是一个单引号 ',网站为了防止你破坏这个查询语句,会给你输入的单引号前面加一个反斜杠 ``来转义它。所以最终传到数据库的其实是:
SELECT * FROM users WHERE username = '\''
这个 \'在数据库里就只是一个普通的字符,而不是能闭合字符串的单引号,所以攻击就失败了。这个过程叫“转义”,是网站的一种安全防护。
那么,“宽字节注入”是如何绕过这个防护的呢?
它的核心在于利用了 GBK 这类中文编码的特性。在GBK编码中,两个连续的字节可以组合起来表示一个汉字(比如 %aa%5c可能就是一个汉字)。
攻击者就利用了这个特性:
方法一:%df吃掉 ``(最常用)
-
你输入
%df'(注意:'的URL编码是%27)。 -
网站的安全程序很尽职,它看到
%27(单引号),就在它前面加一个反斜杠\(它的URL编码是%5c)。 -
所以,最终程序传给数据库的字符串变成了:
%df%5c%27。 -
关键来了!数据库使用GBK编码来解读这段数据。它会把
%df%5c这两个字节组合在一起,当作一个汉字来处理。至于剩下的%27,它就被独立出来了。 -
于是,最终的查询语句就变成了:
SELECT * FROM users WHERE username = '某汉字''那个
%27(单引号)成功逃逸,闭合了前面的引号,后面就可以拼接我们想要的恶意SQL代码了。
简单比喻:就像你朋友手拉手(%df%5c)假扮成一个人(一个汉字),骗过了门口的保安(转义函数),然后你(%27)就能大摇大摆地跟进去了。
方法二:注释掉 ``
这个方法比较少见,思路是输入 %5c%27(即 \')。
- 网站的安全程序可能会再次转义,变成
%5c%5c%27(即\\')。 - 在SQL中,两个反斜杠
\\可能被解释为一个普通的反斜杠字符,或者第一个%5c被当作转义符“注释”掉了第二个%5c,结果还是留下了独立的%27(单引号)。
总结一下
- 目标:让一个单引号
'成功逃过转义,去闭合SQL语句。 - 手段:利用GBK编码两个字节算一个汉字的规则,构造一个特殊的字节(如
%df),让它和转义符\(%5c)“组队”变成汉字,从而让单引号“落单”。 - 前提条件:数据库连接采用GBK、BIG5等宽字节编码。
1192

被折叠的 条评论
为什么被折叠?



