来源:自学PHP网 时间:2015-04-17 11:59 作者: 阅读:次
[导读] 在magic_quotes_gpc=On的情况下,提交的参数中如果带有单引号rsquo;,就会被自动转义\rsquo;,使很多注入攻击无效,GBK双字节编码:一个汉字用两个字节表示,首字节对应0times;81-0xFE,尾字节...
在magic_quotes_gpc=On的情况下,提交的参数中如果带有单引号’,就会被自动转义\’,使很多注入攻击无效, 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; 条件变成永真,成功注入。 补充: 0xD50×5C不是唯一可以绕过单引号转义的字符,0×81-0xFE开头+0×5C的字符应该都可以; 根据utf8的编码范围,无此问题; 这种变换在xss等领域也可以应用,假如服务端是GBK编码格式。 //mysql_query(“SET NAMES ‘gbk’”); mysql_query(“SET character_set_connection=’gbk’,character_set_results=’gbk’,character_set_client=binary”); } |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com