SQL注入——宽字节注入

在PHP+mysql的服务器中,php的配置文件有一个被称为魔术引号的配置选项magic_quote_gpc,当magic_quote_gpc=on的时候,这相当于PHP中使用了addslshes()函数,这个函数的功能是将单引号、双引号,反斜杠等进行转义,也就是将这些字符前加一个反斜杠,那么当遇到字符型的注入点时就会因为无法引入单引号进行闭合,导致sql语句不能正确执行,当然常规的方法就无法进行注入了,但在一种情况下可能可以采用多字节编码漏洞来利用。

当网站采用GBK、EUC-KR、SJIS等宽字节字符集编码时,由于php转义字符时采用单字节编码,而web传递给mysql时采用了多字节编码,这时就引发了多字节编码漏洞

下面这个实例,就体现了多字节编码漏洞的触发过程:http://www.sql.com/1/mysql/mysql_char.php?id=1,当加入单引号时,没有出现错误,页面也返回正常,当输入%df’时,页面返回了错误:

因为当加入单引号的时候,经过php的转义函数会变成\’,反斜杠的16进制编码是5c,而mysql是按照多字节编码的,此时引入的%df与5c组合被解释成一个汉字“運”,从而相当于起到转义作用的\被“吃”掉了,而单引号又恢复了它的作用,只要重新构造如下语句:http://www.sql.com/1/mysql/mysql_char.php?id=1%df'and1=2unionselect1,2,3%23,就能成功注入,具体方法与之前介绍的union方式一致


宽字节注入漏洞产生的原因:开发者为了防止出现SQL注入攻击,将用户输入的数据用addslashes等函数进行过滤。addslashes等函数会默认将单引号等字符进行转义,这样就可以避免注入。宽字节注入产生的原因是MySQL在使用GBK编码的时候,如果第一个字符的ASCII码大于128时,会认为两个字符是一个汉字,会将后面的转义字符“\”吃掉,拼接为汉字,这样就可以将SQL语句闭合,造成宽字节注入

利用宽字节注入原理,只要是第一个字符的ASCII码大于128时,会认为两个字符是一个汉字,会将后面的转义字符吃掉,可以正常闭合SQL语句进行注入,那就可以用ASCII码为129的进行注入,URL编码为%81

发现存在宽字节注入就可以配合union联合查询注入进行信息查询了

你可能感兴趣的:(#,SQL注入,sql,php,数据库,渗透测试,安全)