1. 程式人生 > 實用技巧 >紀實:校內線上訓練——WEB

紀實:校內線上訓練——WEB

近日,學校俱樂部舉辦了有關網安的比賽,不去不知道,真的是一句“我好菜”走天下……在此就是記錄一下那些我做過的和沒做上的題,其實看了一下別人的wp總是就差臨門一腳,心情很糟 v_v

接下來會按照順序呢會連續記錄PWN、REVERSE、MISC、WEB、CRYPTO的……

WEB部分只說幾道題,原因是有幾道感覺過於簡單,所以就略過了。

Trick trick

  Hint:一個反序列化的小trick

index.php原始碼:

<?php
error_reporting(0);
include "class.php";
highlight_file(__FILE__); if (isset($_GET['last'])) { $last=$GET['last']; if (!stristr($last,"flag")) { unserialize($last); echo "<br>"."you find it"; // class is getF:public key // must key = "flag" } }

  這道題其實讀完程式碼後,就會發現這道題的矛盾點就在於:我們如果想獲得flag,就必須建立一個getF的類,猜想會在創造類中會有列印資訊的功能。然而建立getF這樣的類需要一個key引數,如果想列印flag有關的訊息,key就必須等於“flag”,恰恰就是這裡!在執行反序列化之前需要過得一關就是:

!stristr($last,"flag")

  該語句的意思就是查詢$last中是否存在flag,所以我們不僅要key=“flag”的同時還要繞過sristr函式。

  這道題主要考察的就是序列化字串的表示格式

a    -->array     --> a:1:{"1","abc"}
b    -->boolean   --> b:0;
d    -->double    --> d:1.2323;
i    -->integer   --> i:3;
s/S  -->string,S可以有16進位制字元    --> s:3:"abc"; 或者 S:3:"\61bc"
O    -->class     --> O:1:"A":3:{s:4:"\00A\00a";N;s:4:"\00*\00b";N;s:1:"c";s:5:"hello";}
N    -->null      --> N;
r    -->物件引用   --> r:1 (數字為所引用的物件在序列化字串中第一次出現的位置)
R    -->指標引用   --> R:1 (會修改指標指向的內容)

  這裡借鑑的是大佬的手記--->墨雨琪師傅的部落格

  所以說這裡為了不修改最終答案,所以可以選擇把本應該的:

0:4:"getF":1:{s:3:"key";s:4:"flag"}

  這兩面的s型別轉換成S型別,同時把其中flag任意幾個字元變成16進位制即可:

0:4:"getF":1:{s:3:"key";S:4:"\66lag"}

  這裡要吐槽一句,其實這道題,題目就是個hint不是麼,hhhhhh……

EasySQL

  Hint:與時俱進(mysql都8.0了)

php原始碼:

<?php
//flag in table flag
highlight_file(__FILE__);
$conn = mysqli_connect('mysql', 'test', 'test', 'test');
if (!$conn) {
    die('Could not connect: ' . mysqli_error($conn));
}
if (isset($_GET['id'])) {
    $id = $_GET['id'];
    if (stristr($id, 'select') === false) {
        $sql = "select * from news where id=$id";
        $result = mysqli_query($conn, $sql);
        if ($result) {
            $row = mysqli_fetch_array($result);
            echo "<h1>" . $row['title'] . "</h1><br>";
            echo "<h3>" . $row['content'] . "</h3>";
        }
    }
}

  這道題是遮蔽了“select”關鍵詞,結合hint,我們就可以選用table語法來顯示:

  更多詳細介紹請戳--->https://dev.mysql.com/doc/refman/8.0/en/table.html

  知道了這一點後就比較簡單了:直接payload:

id=-1 union table flag limit 1

  這樣就能直接拿到flag了!