GBK宽字节注入原理

一句话概括

宽字节注入就是一种利用数据库的中文编码方式(如GBK) 的特殊性,来“骗”过网站的防护系统,从而进行SQL注入攻击的方法。


详细拆解

想象一个场景:网站有一个登录框,你输入用户名。正常的逻辑是,你输入 Alice,后台数据库会执行这样一句查询:

SELECT * FROM users WHERE username = 'Alice'

但如果你输入的是一个单引号 ',网站为了防止你破坏这个查询语句,会给你输入的单引号前面加一个反斜杠 ``来转义它。所以最终传到数据库的其实是:

SELECT * FROM users WHERE username = '\''

这个 \'在数据库里就只是一个普通的字符,而不是能闭合字符串的单引号,所以攻击就失败了。这个过程叫“转义”,是网站的一种安全防护。

那么,“宽字节注入”是如何绕过这个防护的呢?

它的核心在于利用了 GBK 这类中文编码的特性。在GBK编码中,两个连续的字节可以组合起来表示一个汉字(比如 %aa%5c可能就是一个汉字)。

攻击者就利用了这个特性:

方法一:%df吃掉 ``(最常用)
  1. 你输入 %df'(注意:'的URL编码是 %27)。

  2. 网站的安全程序很尽职,它看到 %27(单引号),就在它前面加一个反斜杠 \(它的URL编码是%5c)。

  3. 所以,最终程序传给数据库的字符串变成了:%df%5c%27

  4. 关键来了!数据库使用GBK编码来解读这段数据。它会%df%5c这两个字节组合在一起,当作一个汉字来处理。至于剩下的 %27,它就被独立出来了。

  5. 于是,最终的查询语句就变成了:

    SELECT * FROM users WHERE username = '某汉字''
    

    那个 %27(单引号)成功逃逸,闭合了前面的引号,后面就可以拼接我们想要的恶意SQL代码了。

简单比喻:就像你朋友手拉手(%df%5c)假扮成一个人(一个汉字),骗过了门口的保安(转义函数),然后你(%27)就能大摇大摆地跟进去了。

方法二:注释掉 ``

这个方法比较少见,思路是输入 %5c%27(即 \')。

  1. 网站的安全程序可能会再次转义,变成 %5c%5c%27(即 \\')。
  2. 在SQL中,两个反斜杠 \\可能被解释为一个普通的反斜杠字符,或者第一个 %5c被当作转义符“注释”掉了第二个 %5c,结果还是留下了独立的 %27(单引号)。

总结一下

  • 目标:让一个单引号 ' 成功逃过转义,去闭合SQL语句。
  • 手段:利用GBK编码两个字节算一个汉字的规则,构造一个特殊的字节(如%df),让它和转义符\(%5c)“组队”变成汉字,从而让单引号“落单”。
  • 前提条件:数据库连接采用GBK、BIG5等宽字节编码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值