sql宽字节注入原理

sql宽字节注入原理

在magic_quotes_gpc=On的情况下,提交的参数中如果带有单引号’,就会被自动转义\’,使很多注入攻击无效.

GBK 一个汉字用两个字节表示

ASCII编码 占用一个字节

PHP中编码为GBK,函数执行添加的是ASCII编码,MYSQL默认字符集是GBK等宽字节字符集.

GBK双字节编码:一个汉字用两个字节表示,首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),刚好涵盖了转义符号\对应的编码0×5C。

0xD50×5C 对应了汉字“诚”,URL编码用百分号加字符的16进制编码表示字符,于是 %d5%5c 经URL解码后为“诚”。

举个例子

访问 http://www.2cto.com /test.php?username=test%d5′%20or%201=1%23&pwd=test

经过浏览器编码,username参数值为(单引号的编码0×27)

username=test%d5%27%20or%201=1%23

经过php的url解码

username=test 0xd5 0×27 0×20 or 0×20 1=1 0×23 (为了便于阅读,在字符串与16进制编码之间加了空格)

经过PHP的GPC自动转义变成(单引号0×27被转义成\’对应的编码0×5c0×27):

username=test 0xd5 0×5c 0×27 0×20 or 0×20 1=1 0×23

因为在数据库初始化连接的时候SET NAMES ‘gbk’,0xd50×5c解码后为诚,0×27解码为’,0×20为空格,0×23为mysql的注释符#

上面的SQL语句最终为: SELECT * FROM user WHERE username=’test诚’ or 1=1#’ and password=’test’;

注释符#后面的字符串已经无效,等价于

SELECT * FROM user WHERE username=’test诚’ or 1=1;

条件变成永真,成功注入。

sql宽字节注入方法

输入%df和函数执行添加的%5C,被合并成%df%5C。由于GBK是两字节,这个%df%5C被MYSQL识别为GBK。导致本应的%df\变成%df%5C。%df%5C在GBK编码中没有对应,所以被当成无效字符。

  %DF’ :会被PHP当中的addslashes函数转义为“%DF\’” ,“\”既URL里的“%5C”,那么也就是说,“%DF’”会被转成“%DF%5C%27”倘若网站的字符集是GBK,MYSQL使用的编码也是GBK的话,就会认为“%DF%5C%27”是一个宽字符。也就是“縗’”

sql宽字节原理

sql宽字节注入具体解释

sql宽字节注入详解

文章目录
  1. 1. sql宽字节注入原理
  2. 2. 举个例子
  3. 3. sql宽字节注入方法
,