SQL注入之宽字节注入
0x01简介
SQL注入近几年来连续被OWASP当作十大漏洞中最最危险的漏洞而存在。无论是从数据库中获得敏感信息还是执行一系列的恶意操作甚至是直接获取整个数据库权限,都可能发生在一次小小的提交参数的过程中。为此大多数网站开始对于SQL注入做了一定的防御方法,最早有人提出,将用户提交的所有敏感字符进行过滤和转义,要么将提交参数中的敏感字符过滤掉后再提交给数据库,要么对那些敏感字符使用转义符号进行转义,使其丧失掉注入功能后再进行提交。但我们知道,如果不对源头进行处理,再怎么亡羊补牢也是无济于事。后来这些网站在面对黑客那些令人匪夷所思的Bypass技巧面前根本没有应对方法,最终无奈选择关闭。
本篇文章,美创安全实验室将给大家介绍一种当年绕过转义防御最好用的技巧即宽字节注入攻击。
0x02编码历史
一听到“宽字节注入”,那不可避免地就要提到有关字节编码方面的知识,所以在讲解注入原理之前,我们简单讲解一下有关编码的历史。
最早美国人决定用8个可以开合的晶体管来组成不同的状态,这些晶体管只有“亮”或“不亮”两种形态,也就是对应了二进制的0和1。而1个字节有8个比特位,可以组合成2^8=256种不同的方案,他们把编号从0开始的32种状态用在规定的特殊用途,这32个字符后来成为“控制码”;他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,而这96个字符也被称为”ASCII码”。
后来随着计算机不断发展,世界各国为了可以让计算机保存各国的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,于是从第128字符到最后一个255字符被称为“扩展字符集”。
但是等到中国人民得到计算机时,已经没有多余的字节状态来存储汉字。于是国人自主研发,将127之后的字符全部去掉,并规定:一个小于127的字符意义与原来相同,若两个大于127的字符连在一起时,就表示一个汉字,这种方案被叫做“GB2312“。但中国的汉字实在太多G