当前位置:首页 > 电脑常识 > 正文

论PHP常见缝隙第一弹:安置的问题 8090安适门户

11-20 电脑常识

首先拿到一份源码,必定是先install上,而在安置文件上又会经常呈现问题。

一般的安置文件在安置完成后,根基上都不会自动删除这个安置的文件,我遇到过的会自动删除的仿佛也就qibocms了。

其他的根基都是通过生成一个lock文件来判断措施是否安置过了,如果存在这个lock文件了就会退出了。 这里首先先来说一下安置文件经常呈现的问题。

根柢无验证

这种的虽然不久不多,但是有时还是会遇到个。在安置完成, 并不会自动删除文件,又不会生成lock来判断是否安置过了。导致了可以直接重装过

例子: WooYun: PHPSHE B2C 重装

安置file

因为install一般城市有step 法式啥的。。Step 1 check 啥啥 step 2 是安置啥的。 而一些cms 默认step是1,而step又是GET 来的 而他check lock的时候就是在step 1里面。 这时候如果我们直接用GET提交step 2,那么就直接进入下一步了,就没check lock了。

例如某cms中的安置文件

if (empty ($step)) { $step = 1;//当用户没有提交step的时候 赋值为1 } require_once ("includes/inc_install.php"); $gototime = 2000; /*------------------------ 显示协议文件 ------------------------*/ if ($step == 1) //当1才检测lock { if (file_exists('installed.txt')) { echo '<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> 你已经安置过该系统,如果想从头安置,请先删除install目录下的 installed.txt 文件,然后再安置。 </body> </html>'; exit; } include_once ("./templates/s1.html"); exit (); } /*------------------------ 测试环境要求 ------------------------*/ else if ($step == 2) // 我们直接提交step为2 就不check lock了 { $phpv = @ phpversion(); $sp_os = $_ENV["OS"]; $sp_gd = @ gdversion(); $sp_server = $_SERVER["SERVER_SOFTWARE"]; $sp_host = (empty ($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_HOST"] : $_SERVER["SERVER_ADDR"]); $sp_name = $_SERVER["SERVER_NAME"]; $sp_max_execution_time = ini_get('max_execution_time'); $sp_allow_reference = (ini_get('allow_call_time_pass_reference') ? '<font color=green>[√]On</font>' : '<font color=red>[×]Off</font>'); $sp_allow_url_fopen = (in 变量笼罩导致重装
header("Content-Type: text/html; charset={$lang}");
 foreach(Array('_GET','_POST','_COOKIE') as $_request){
 foreach($$_request as $_k => $_v) ${$_k} = _runmagicquotes($_v);
 }
 function _runmagicquotes(&$svar){
 if(!get_magic_quotes_gpc()){
 if( is_array($svar) ){
 foreach($svar as $_k => $_v) $svar[$_k] = _runmagicquotes($_v);
 }else{
 $svar = addslashes($svar);
 }
 }
 return $svar;
 }
 if(file_exists($insLockfile)){
 exit(" 措施已运行安置,如果你确定要从头安置,请先从FTP中删除 install/install_lock.txt!");
 } foreach($$_request as $_k => $_v) ${$_k} = _runmagicquotes($_v);

这里是一个经常遇到的一个变量笼罩。

导致了我们可以笼罩失$insLockfile从而让file_exists为false就不会退出了。导致再次重装。 这个变量笼罩不知道咋的 能在一些小cms的安置文件里看到。

之前看的xdcms 和 frcms 都存在这个变量笼罩。
例子: WooYun: frcms 重装系统

解析缝隙

这个也对照少, 就随便说句。就是像dedecms很久以前的那样在安置完成后会在install.php rename 为 Install.php.bak 但是由于apache的解析缝隙,如果无法识别最后的一个后缀的话,就会向上解析,那么就又成php了。然后又结合dedecms安置时的变量笼罩,又成重装了。

满足一些条件不会退出的。

这种例子也不算太多, 本身仿佛也没遇到过太多。

首先以之前发过的sitestar举例下

if(file_exists($lockfile) && ($_a=='template' || $_a=='setting' || $_a=='check')) {
 exit('please delete install.lock!');
 }

这里我们来理解一下这个逻辑, 这里的file_exists($lockfile) 因为安置告成后 lockfile 必定存在的,所以这里必定会是true。然后再看一下,这里是一个 && true true 才会进入语句块。 那么如果$_a 不为 template 、 setting 、 check 的话,那么后面的就为false True and false => false就不会进入这个语句块,就不会exit,再共同后面的

else if($_a=="create"){
 $link = mysql_connect($db_host,$db_user,$db_pwd);

恰好有个其他的 如果$_a 为 create 那么就不会退出这个脚本
恰好这个create 能到达Getshell的效果
例子: WooYun: 建站之星Sitestar前台Getshell一枚

剩下的还有hdwiki之前也有一个根基差不久不多这样的例子

if (file_exists(HDWIKI_ROOT.'/data/install.lock') && $step != '8') { echo "<font color='red'>{$lang['tipAlreadyInstall']}</font>";

exit();

}

温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12600.html

博客主人杰米WWW
杰米博客,为大家提供seo以及it方面技巧喜欢的朋友收藏哦!
  • 11365文章总数
  • 1378073访问次数
  • 建站天数
  •