SQL Injection6(宽字节注入)

SQL Injection6(宽字节注入)

前言

前面sql注入时最怕碰到的就是字符型注入,然后’被过滤,反正当时时没有什么办法解决,但宽字节注入给这样的情况带来了希望

宽字节注入原理

首先是编码,之所以产生宽字节注入,就是因为有不同的编码方式

因为php后端会对我们的输入进行转义,转义的方式通常是加上’\’,

比如 addslashes() 函数返回在预定义字符之前添加反斜杠的字符串(预定义字符是:单引号(’),双引号("),反斜杠(\),NULL)又或者在php.ini中设置magic_quotes_gpc = On

GBK 占用两字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。
大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。

这里为什么要用%df呢,我查了下,gbk是多字节字符,但长度可变,比如英文字符就是单字节

GBK中字符是一个或者两个字节,单字节00–7F这个区间和ASCII是一样的;双字节字符的第一个字节在81-FE之间,通过这个可以判断是单字节还是双字节

我觉得这里的%df是可以替换,81到FE理论上应该都可以才对(下面实验的时候测试了下81开始就是可以的,7f是不行的,前面的自然不行,所以都用%df是为什么呢?)

所以也就是在php后端过滤的时候按照ascii码来进行转义将%df%27变成了%df%5c%27,然后到sql端,gbk以两个字节来读取,%df%5c组成了一个而%27被单独出来,这样用来转义的’\'和前面的一个字节一起转成了一个gbk字,而这里%27的单引号成功的又逃了出来,困扰我们没法用单引号闭合字符注入的问题就成功解决了

环境搭建

dvwa没有宽字节的练习,这里很幸运的发现了sqli-labs这个靶场,全是sql注入的练习,很棒啊,sql注入我一直觉得是web的一个难点需要多练习

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值