web靶场搭建之帝国cms7.5( 二 )


mid=$mid");printerror("LoadInModSuccess","db/ListTable.php".hReturnEcmsHashStrHref2(1));}
看到()文件包含 , path参数在上面上传文件处使用time().(10)进行加密文件名 , 跟进()函数 , 在//e/class/.php里看到
function make_password($pw_length){$low_ascii_bound=48;$upper_ascii_bound=122;$notuse=array(58,59,60,61,62,63,64,91,92,93,94,95,96);while($i<$pw_length){if(PHP_VERSION<'4.2.0'){mt_srand((double)microtime()*1000000);}mt_srand();$randnum=mt_rand($low_ascii_bound,$upper_ascii_bound);if(!in_array($randnum,$notuse)){$password1=$password1.chr($randnum);$i++;}}return $password1;}
一个伪随机数生成 , 因此可以通过添加创建文件的代码绕过 。
代码注入 (CVE-2018-19462) 漏洞原理:
.5及之前版本中的.php文件存在代码注入漏洞 。
该漏洞源于外部输入数据构造代码段的过程中 , 网路系统或产品未正确过滤其中的特殊元素 。攻击者可利用该漏洞生成非法的代码段 , 修改网络系统或组件的预期的执行控制流 。
漏洞复现:
来到执行SQL语句页面
首先我们要知道存放的绝对路径 , 这里可以使用一个()用第一种方法传上去 , 
");?>
之后访问
这里只是找到了php的绝对路径 , 还不是web所存储的路径 , 这时候查看源代码搜索查询网站所处的绝对路径
用 … into 语句写入php一句话木马
select '' into outfile 'D:/vmworkstation/phpstudy/phpstudy_pro/WWW/Empirecms/upload/e/admin/get.php'
蚁剑连接
成功连上
源码审计:
来到/e/admin/db/DoSql.php处 , 
//执行SQL语句function DoExecSql($add,$userid,$username){global $empire,$dbtbpre;$dosave=(int)$add['dosave'];$query=$add['query'];if(!$query){printerror("EmptyDoSqlQuery","history.go(-1)");}if($dosave==1&&!$add['sqlname']){printerror("EmptySqltext","history.go(-1)");}$query=ClearAddsData($query);//保存if($dosave==1){$add['sqlname']=hRepPostStr($add['sqlname'],1);$isql=$empire->query("insert into {$dbtbpre}enewssql(sqlname,sqltext) values('".$add['sqlname']."','".addslashes($query)."');");}$query=RepSqlTbpre($query);DoRunQuery($query);//操作日志insert_dolog("query=".$query);printerror("DoExecSqlSuccess","DoSql.php".hReturnEcmsHashStrHref2(1));}
转到定义 , 发现只对表的前缀做了替换
//替换表前缀function RepSqlTbpre($sql){global $dbtbpre;$sql=str_replace('[!db.pre!]',$dbtbpre,$sql);return $sql;}
转到定义 , 对$query进行处理 。
//运行SQLfunction DoRunQuery($sql){global $empire;$sql=str_replace("\r","\n",$sql);$ret=array();$num=0;foreach(explode(";\n",trim($sql)) as $query){$queries=explode("\n",trim($query));foreach($queries as $query){$ret[$num].=$query[0]=='#'||$query[0].$query[1]=='--'?'':$query;}$num++;}unset($sql);foreach($ret as $query){$query=trim($query);if($query){$empire->query($query);}}}

web靶场搭建之帝国cms7.5

文章插图
对$sql参数只做了去除空格、以;分隔然后遍历,没有做别的限制和过滤,导致可以执行恶意的sql语句
注:我们知道这个参数在mysql的配置文件里起到的是能否写入的作用 , 当 = 为空 , 则可以写入sql语句到数据库 , 当 = NULL , 则不可以往数据库里写sql语句 , 当 = /xxx , 一个指定目录的时候 , 就只能往这个指定的目录里面写东西