SQL注入之宽字节注入

原理:宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围),而当我们输入有单引号时会自动加入\进行转义而变为\'(在PHP配置文件中magic_quotes_gpc=On的情况下或者使用addslashes函数,icov函数,mysql_real_escape_string函数、mysql_escape_string函数等,提交的参数中如果带有单引号('),就会被自动转义\',使得多数注入攻击无效),由于宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,将后面的一个字节与前一个大于128的ascii码进行组合成为一个完整的字符(mysql判断一个字符是不是汉字,首先两个字符时一个汉字,另外根据gbk编码,第一个字节ascii码大于128,基本上就可以了),此时单引号(')前的\就被吃了,我们就可以使用单引号(')了,利用这个特性从而可实施SQL注入的利用。

这里我们以 sqli-labs-master第32关为例:

第一步判断是否存在注入点,我们这里省略不做累赘;

第二步判断闭合情况,我们输入单引号,这时你会发现页面显示得是 1\',而不是1',很明显单引号被网站转义了!

这时候我们可以在单引号的前面加上%df,页面正常报错

加上闭合符,页面回显正常

接下来我们继续判断页面的列数及显示位

接下来就可以曝数据库名、版本等信息了

但到了曝数据表的时候,数据库名因为需要加上单引号又被转义了,这时你会发现即使再加上前面我们说过的%df也无效了。那怎么办?

我们可以将目标字符串转成16进制编码,这时字符串就不需要单引号来保护它了,而且编码后还需要在字符串前加上0X,

这样语句就被成功执行了。同理可以继续曝数据库的列名及其他信息!!

 

 

 

 

 

宽字节注入是一种常见的 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 注入攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值