dede/sys_info.php中
//保存配置的改动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| if($dopost=="save") { if(!isset($token)){ echo 'No token found!'; exit; }
if(strcasecmp($token, $_SESSION['token']) != 0){ echo 'Token mismatch!'; exit; } foreach($_POST as $k=>$v) { if(preg_match("#^edit___#", $k)) { $v = cn_substrR(${$k}, 1024); } else { continue; } $k = preg_replace("#^edit___#", "", $k); $dsql->ExecuteNoneQuery("UPDATE `#@__sysconfig` SET `value`='$v' WHERE varname='$k' "); } ReWriteConfig(); ShowMsg("成功更改站点配置!", "sys_info.php"); exit(); }
|
在选择更改配置后,通过foreach($_POST as $k=>$v)接受参数,并且将参数内容写入了数据库,之后进入ReWriteConfig();。
//更新配置函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| function ReWriteConfig() { global $dsql,$configfile; if(!is_writeable($configfile)) { echo "配置文件'{$configfile}'不支持写入,无法修改系统配置参数!"; exit(); } $fp = fopen($configfile,'w'); flock($fp,3); fwrite($fp,"<"."?php\r\n"); $dsql->SetQuery("SELECT `varname`,`type`,`value`,`groupid` FROM `#@__sysconfig` ORDER BY aid ASC "); $dsql->Execute(); while($row = $dsql->GetArray()) { if($row['type']=='number') { if($row['value']=='') $row['value'] = 0; fwrite($fp,"\${$row['varname']} = ".$row['value'].";\r\n"); } else { fwrite($fp,"\${$row['varname']} = '".str_replace("'",'',$row['value'])."';\r\n"); } } fwrite($fp,"?".">"); fclose($fp); }
|
这里的代码将前面插入数据库的数据直接取出,没有再做验证。在while($row = $dsql->GetArray()),有两个分支,当$row[‘type’]==’number’时,会往文件中直接写入,其他情况下会进行一次str_replace(“‘“,’’,$row[‘value’])将单引号替换掉。所以我们考虑使用第一个分支,选择一个默认为数字的参数。
比如使用参数cfg_ftp_port,它表示采用的ftp端口,

我们填入值为21;phpinfo

Getshell:

查看配置文件 data/config.cache.inc.php

原文地址:https://xianzhi.aliyun.com/forum/topic/2071