信息搜集
web03
![]()
![]()
ctrl+shift+I或F12,ctrl+u查看源代码,啥也没有怎么办?
根据题目提示的,没有思路的时候抓个包看看,这里用到的抓包工具是Burp Suite(下面都简称burp)
在burp中的Proxy拦截,点击图中的红色框框,把拦截到的发送到Repeater中,再点击send就可以在Response中看到flag了
![]()
![]()
web04
题目提示了robots文件,直接在url后边加上robots.txt即可
关于robots.txt
- 但是,光是提示一个
robots,我怎么知道是robots.txt呢,这是猜出来的吗?不,robots.txt这个名字是标准规定好的。所以看到robots,就做出在url写robots.txt对于熟练的人来说是很自然的一个动作,对于不太熟练的,看多了就记住了。 - 其实,我们还可以用工具扫描来解:我这里用的工具是dirsearch
因为,dirsearch的字典里有robots.txt,所以它直接给我们扫出来了,但是关于robots.txt的内容我们还是要知道的,其次就是,虽然扫描很方便,但扫描也存在局限性,所以能够根据提示做出来的,就优先提示吧
再记住三个状态码
![]()
| 状态码 | 含义 | 说明 |
|---|---|---|
| 200 | 存在且能读 | 拿到了 |
| 301 | 重定向 | 常见于访问目录不带 /,比如 /.git → /.git/ |
| 403 | 存在但被禁止 | 目录在,但禁止列目录(可以再试具体文件) |
| 404 | 不存在 | 注意:很多站会返回自定义 404 页面,长度都相同 |
关于200(可能是软404)
200 只代表“服务器成功返回了内容”, 不代表这个文件真的存在。
有些站点(尤其是前端路由的站)会对任何路径都返回 200 + 首页, 这叫 软 404。
所以扫到 200 之后,还要打开看内容:
- 内容是
User-agent: ... / Disallow: ...→ 真存在 - 内容是首页 HTML → 软 404,是假的
一个URL拆开是这样的
https://xxx.challenge.ctf.show / system1103 / login.php ? a=1 └────── 协议+主机 ──────┘ └──────── path ────────┘ └query┘
Web 服务器(nginx / Apache)启动时会配置一个网站根目录(DocumentRoot,比如 /var/www/html)。你请求 /index.php,服务器就去 /var/www/html/index.php 找这个文件。
所以:
index.php、robots.txt、www.zip、.git/,在"写法"上完全一样,都是"根目录下的一个名字"。没有任何语法区别。- 区别只在
服务器拿到这个名字之后怎么处理:.php→ 交给 PHP 解释器执行,你只看到它输出的 HTML,看不到源码;.txt/.zip/.png/.git/xxx→ 当静态文件原样返回(zip 会变成下载)。
- 所以"能不能访问到"取决于两件事:文件到底存不存在、服务器有没有禁止访问它。
![]()
![]()
![]()
web05
![]()
题目提示了phps源码泄露,加之这题又是那种看源码啥也没有的,在url输入index.phps
为什么.phps可以看到源码?
.php是被执行的,我们是看不到源码的
浏览器请求 /index.php → 服务器发现是 .php → 交给 PHP 解释器执行 → 执行结果(HTML)返回给浏览器
我们在页面上按 Ctrl+U 看到的只是输出,不是源码
.phps是一个历史遗留配置:Apache 的 PHP 模块支持text AddType application/x-httpd-php-source .phps
意思是".phps后缀的文件,输出语法高亮后的源码,不要执行"。这本意是给开发者调试用的,一旦线上开着就是源码泄露- 所以为什么是
index.phps???
因为首页文件叫index.php,只是把后缀换成.phps而已
![]()
![]()
![]()
扫描的局限性
这题解完之后我还用扫描工具试了一下,结果全是404,这说明什么?
如下图所示,不难看出,我扫描的文件后缀名是php/asp/aspx/zip/html等,并没有这一题的后缀名phps,所以才扫不到,因为phps没那么常见,不在扫描字典里,从这里我们不难看出,扫描的局限性其实就是,万一文件的后缀名不常见,那就扫不出来
那也可以把以后写题遇到的,不常见的后缀名全部加到字典中,扩大扫描的范围
![]()
web06
题目提示
- “解压源码”说明存在
压缩包 - “到当前目录,测试正常就收工了”说明:“到当前目录”->在网站根目录,“测试正常就收工“->没删掉
- 未知:这个压缩包叫什么
为什么是www.zip?
因为www是网站根目录的习惯名,在打包的时候习惯了用根目录命名压缩包。
这是“人的习惯”,不是标准。 所以它不是“唯一正确答案”,而是“命中率最高的答案”。
![]()
![]()
![]()
![]()
web07
题目提示
- ”版本控制“:说明这题运用了版本控制工具(git/svn),它们在初始化时,会在项目根目录自动生成一个隐藏目录git-.git svn-.svn 所以我们要做的就是去找这个隐藏目录
- "不要部署到生产环境"说明,本来不应该部署到生产环境的,但在这一题中部署了
关于.git
- 为什么以点开头:linux的约定,点开头的文件/目录算隐藏文件,
ls默认不显示。 没有任何规则要求点前面必须有字母——.git就是一个完整名字。 - .git里面装了什么
text .git/ ├── HEAD 当前在哪个分支 ├── config 仓库配置(远程地址、有时含凭据) ├── index 暂存区:所有被跟踪文件的文件名清单 ├── objects/ 所有文件内容 + 每次提交(zlib 压缩) ├── refs/ 分支、tag 指向哪个 commit └── logs/ 操作历史(谁、什么时候、改了什么)
- 最重要的是index里边有文件名列表,ogjects里边有文件完整内容,这两样可以把项目还原出来,而它们都在.git下
- 301:目录存在,看图中/.git 是301说明这个目录是有的
200: /.git/ 和/.git相比较,就多了个斜杠,/..../代表访问的是目录
![]()
![]()
web08
题目提示
和web07一样,只不过这题是.svn
关于SVN
SVN 全称 Subversion,是 git 流行之前最主流的版本控制工具
老版本(1.6以前)
.svn/
├── entries 文件名 + 版本号清单(纯文本)
└── text-base/ 每个文件的“原始副本”
├── index.php.svn-base
├── config.php.svn-base
└── ...
text-base/里边存的是文件的明文副本,文件名规则是:源文件名+.svn-base
所以拿到 .svn 之后,不需要任何还原工具,直接访问:
/.svn/text-base/index.php.svn-base
返回的就是 index.php 的完整源码。
新版本(1.7+)
.svn/
├── wc.db SQLite 数据库:记录路径、版本、校验和
└── pristine/ 按 SHA1 命名的文件内容
├── 0a/
│ └── abcdef...
这时内容不是明文文件名了, 需要工具来解析:
perl rip-svn.pl -v -u http://目标/.svn/
这题简化了
![]()
![]()
web09
题目提示
看到vim,以后条件反射:
**vim 编辑文件时会留下临时文件,这个临时文件里存着文件内容。**这是找编辑器留下的痕迹
关于.swp
- vim 在编辑一个文件时,会在旁边创建一个交换文件(swap file)。
- 定时把内存里的编辑缓冲区写到磁盘,断电,ssh断了,数据还能恢复
- 所以交换文件里边的的内容就是文件内容本身,相当于copy了一份
text index.php ← 线上运行的文件 index.php.swp ← 编辑器里那份内容的副本
vim
标准写法:原文件名前加一个点,后面加 .swp
原文件:index.php 交换文件:.index.php.swp ← 注意前面那个点
如果第一个交换文件已存在,会依次变成:
.index.php.swo .index.php.swn
vim 还会留下其他痕迹:
.index.php~ ← 备份文件(保存前的旧版本) .index.php.un~ ← undo 历史 .index.php.swp ← 交换文件
这次访问的是
/index.php.swp ← 没有前面那个点
说明这个环境里放的正是不带点的变体。
但是实战里两个都要试
/.index.php.swp /index.php.swp
![]()
![]()
web10
Cookie是什么?
一组存在你浏览器里的键值对
这题看到flag有%7B%7D说明是URL编码,需要解码
![]()
![]()
web12
找后台地址 → 从页面公开信息里找密码 → 登录后台 → flag /admin 手机号 / QQ / 邮箱 admin + 密码
后台地址admin从哪来
来源是 robots.txt(就是 web04 学的那招)
密码从哪来
有时候网站上的公开信息,就是管理员常用密码 为什么网页中给你一串数字,好难猜哟~
![]()
![]()
![]()
![]()
![]()
web13
题目提示
① 技术文档 → 去站上找文档 ② 敏感信息 → 文档里有不该出现的东西 ③ 默认密码 → 后台用了默认密码,而且没改
首页 → 页脚 document 链接
→ 下载技术文档
→ 文档里写着后台地址 + 默认账号密码
→ 访问 /system1103/login.php
→ 登录 → flag
为什么是document?
因为那一小段英文就document首字母是小写,别的都是大写,为了引起你的注意
![]()
![]()
![]()
web14
题目信息
- editor提示了这题可以往
编辑器的方向去思考 - ”如果目录不存在,则会遍历服务器根目录“
先查看一下源码,发现没线索
![]()
![]()
![]()
扫描得到/editor/目录,访问一下
![]()
![]()
这就是一个editor的界面的demo页
为什么能确定这是一个demo界面?
页面底部 提交内容(提交快捷键: Ctrl + Enter) 是 KindEditor 自带 php/demo.php 的原样输出——说明整个安装包被扔到了网站根下,连示例都没删。
既然 /editor/ 是完整安装包,那它下面必然有:
/editor/ ├── kindeditor.js ← 主程序 ├── plugins/ ← 各种插件(filemanager、insertfile、image...) ├── themes/ ← 皮肤 ├── php/ │ ├── demo.php ← 看到的这个页面 │ ├── file_manager_json.php ← 文件空间的后端(本题主角) │ ├── upload_json.php ← 上传的后端 │ └── JSON.php ├── asp/ asp.net/ jsp/ ← 其他语言版本,也在! └── attached/ ← 上传文件存放目录(默认应该在这)
![]()
为什么点var?
Linux 的网站默认放在 /var/www。它命中的的可能性比较大——它让你少点几次,但不保证对。
![]()
为什么选www?
在前边的web题目中我们也遇到过,www就是常见的网站文件夹
![]()
为什么先选了html?
因为,html是前端三件套,该文件夹以此命名,说明是与网站有关的
![]()
为什么选nothinghere?
你不觉得,它很具有迷惑性吗?nothinghere这里啥也没有,你真信啊?
![]()
![]()
flooog.txt 和flag很像啊,大概率就是它,而且这下边只有这一个文件,你也只能点它,点击确定
![]()
关于绝对路径
/var/www/html/nothinghere/fl000g.txt
为什么它是绝对路径?
在linux系统中,根(/)就是这个斜杠,var/www/html/nothinghere/ 是文件夹,fl000g.txt是文件名,/也叫磁盘根,是linux整个硬盘的起点,这需要我们有一些linux相关的基础知识
关于网站根
网站根简称站根,网站根目录 = Web 服务器“对外开放”的那个起点文件夹。浏览器 URL 里的那个 /,指的就是它,不是硬盘的 /。
分清三个根
① 磁盘根 / ← Linux 整个硬盘的起点 ② 网站根 /var/www/html ← 网站“对外营业”的起点(DocRoot) ③ URL 根 https://host/ ← 浏览器眼里的起点,对应 ②
磁盘根 /
├── bin/ dev/ etc/ home/ lib/ ... ← 后厨,URL 访问不到
└── var/
└── www/
└── html/ ←←← 网站根(DocRoot)
├── index.php → URL: /
├── editor/ → URL: /editor/
├── assets/ → URL: /assets/
└── nothinghere/
└── fl000g.txt → URL: /nothinghere/fl000g.txt
绝对路径转换到url路径
由于url的根在html后边,从/开始,所以我们可以根据/var/www/html/nothinghere/fl000g.txt把url路径,/nothinghere/fl000g.txt写到url中,如图所示
![]()
web15(这题还蛮有意思的)
![]()
![]()
![]()
这里用到了QQ邮箱的一个特点:QQ邮箱一般都是qq号+@qq.com 这个qq号可能后面会用上,可能是密码什么的(像web12一样),也可能是其他的
看源码你会发现,没有什么信息,然后观察一下这个网站,是那种登录的,需要你输入name,和email,熟悉吗?和web12有点像,那是不是可以采取web12的思路呢,在url,写/admin
![]()
还真有,后台的管理员登录系统,可以先试一下,账号:admin / demo 密码:1156631961 或 0000000 或 12586954775
都试一下发现,都不是
忘记密码是不是可以看看
![]()
没招了,看看前面,有什么信息还没用?qq号,如果不是密码,那能不能去qq搜一下呢
![]()
好嘛,搜完得到地址是陕西安,回到重置密码那里,填入陕西西安不对,填西安
![]()
拿到密码,回到管理员登录界面,试试看,账号:admin 密码:admin7789
![]()
web16(阴魂不散的化学元素周期表)
![]()
这个网站做的很炫酷
![]()
为什么提示探针就知道要访问/tz.php?
关于tz.php
tz.php是「雅黑 PHP 探针」的默认文件名,而tz就是「探针」的拼音首字母(tan zhen)。它既不是 PHP 的规则,也不是 CTF 的约定,只是老站长们多年来一直这样做,于是这个文件名就成了固定叫法。- 早期用 VPS 建站的人想查看服务器的 CPU、内存、硬盘、PHP 版本、禁用的函数等,就会上传一个「PHP 探针」脚本。
- 国内最流行的是 雅黑 PHP 探针(官网
yahei.net)。它的下载包就叫tz.zip(yahei.net/tz/tz.zip),解压后主文件是tz.php,直接放在网站根目录就能访问。 - 所有教程、一键安装包(LNMP 等)用的都是这个文件名,没有人改名。时间一长,"探针 → tz.php" 就成了行业里的习惯叫法。
- 所以严格来说,它并不是“探针就等于 tz.php”这种等价关系;这里的意思是:圈内默认使用雅黑探针,而雅黑探针的默认文件名就是
tz.php。如果换一个探针程序,文件名就会改变。
怎么知道要点击PHP信息中的PHPINFO的?
其实这个是我一个个试出来的,当我进入到这个界面的时候,有没有别的提示,就只能一个个看,每一个都点一遍,看看哪里有东西,结果刚好看到phpinfo,其实flag藏在这里面的情况还挺常见的,有的还会藏在apache环境里,这也算是ctf会常出现的题吧
怎么快速找到藏在phpinfo里边的flag?
ctrl+F查询flag,/ctfshow就可以定位到含flag的地方
![]()
![]()
web17
题目信息
备份文件+sql,看到sql不要直接以为就是sql注入
怎么知道要访问/backup.sql的?
backup是备份文件最普遍、最没有创意的命名。 运维用mysqldump备份数据库时,想到的名字几乎都是backup.sql、db.sql、database.sql、data.sql、xxx_backup.sql、20261022.sql。和上一题的tz.php是同一个道理(见上一问):默认文件名保持默认,就等于问答题变成了填空题。- 放在网站根目录,才会「泄露」。
.sql不是 PHP,Web 服务器只会把它当普通文件返回,所以 URL 加/backup.sql就直接触发下载。如果备份放在/var/backup/这种站根(DocRoot)外面,URL 根本访问不到,这份文件再敏感也没事。所以这题真正的漏洞是备份文件被放进了对外可访问的目录,并非「有一个 sql 文件」。
如果/backup.sql不中怎么办?
按「备份文件字典」挨个试,或直接扫后缀:
backup.sql db.sql database.sql data.sql www.sql 1.sql sql.sql ctfshow.sql backup_20261022.sql /backup/backup.sql /db/backup.sql
![]()
![]()
![]()
web18(这题也好玩)
![]()
![]()
这是个游戏界面,先试着玩两把,题目说玩到101分给flag,反正我是玩不到那么多的了
那就查看查看源码吧
![]()
为什么选择.js?
这就是web前端三件套的内容了,其实你也可以,每一个都点进去,然后ctrl+F查询flag,最终还是会找到.js的
![]()
红框中的那串字母是是什么?
它是 JavaScript 的 Unicode 转义序列,格式为 \u + 4 位十六进制数,表示一个字符的码点(编码编号)。
怎么识别出来那串字母是转义序列?
一眼识别:\u + 4 位十六进制 [0-9a-fA-F]
这就是它的“签名”,三个特征同时满足:
\u4f60 ││└─┴── 4 位十六进制(0-9, a-f) │└────── 字母 u(Unicode 的首字母) └─────── 反斜杠(转义序列的起手式)
在实际代码里,它几乎总是成串、6 个字符一组出现,这个节奏感非常显眼:(记住这个特征就行)
\u4f60 \u8d62 \u4e86 \uff0c \u53bb \u5e7a \u5e7a \u96f6 \u70b9 ... 你 赢 了 , 去 幺 幺 零 点
怎么让它正常显示呢?
把它复制粘贴到控制台,如果控制台不给粘贴,就在里边敲“允许粘贴”并按回车键就好了
![]()
你赢了,去幺幺零点皮爱吃皮看看提示你去访问110.php
![]()
web19
- 先试试弱口令(虽然大概率是不对的)
- 试试查看源码
![]()
![]()
值得一提的是有没有发现,这种关键信息都在
解法一
![]()
为什么u=admin&p=a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04行不通?
注意看源代码:POST'username' post'pazzword'
所以真正的参数名username和pazzword,这就是为什么u=admin&p=a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04行不通,但是图中的却可以的原因
为什么不用key和iv?
![]()
![]()
为什么不用key和vi啊,这个看着也挺像回事的,挺像账号和密码的?其实是干扰项
仔细看,encrypt函数在做AES加密,在函数checkForm中,提交的key,和iv会先加密再返回,加密过后就无法满足===(强等于了)
所以,这里采用hackbar工具,POST参数,将script里边的哈希字符串绕过js加密,符合===强等于,可拿到flag
关于字符串,怎么知道它是哈希?
- 变量名/字段名:
password、pass、pwd、hash、key、token、sign; - 出现在
===/==比较、数据库users表、配置文件、Cookie/Session 里; - 和 salt 拼在一起:
hash:salt、md5($pass.$salt)这类格式,长度会偏离标准值; - 题目提示里出现“密钥”“不要放在前端”“签名”等字眼。
这题就是典型:源码里的 $p 被拿去和一段 64 位 hex 做 ===,同时旁边就有 key、iv,这些线索已经足以看出它的用途。
2.实在不确定,就上工具
![]()
![]()
解法二(获取明文)
通过代码,我们可以知道它的加密逻辑,和密文,那为什么不试试,解密拿到明文登录呢?
在解法一里边我们分析了它是AES加密
关于AES加密
key:密钥
iv:偏移量
密文:a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04
模式:代码中写了mode:CBC
填充方式:zeropadding 解密工具里没有zeropadding那就nopadding
可以找一个AES在线解密工具
![]()
账号:admin 密码明文:图中解密得到的字符串
我看别的题解有这个方法,但是不知道为什么,现在这个明文,登不上,可能是题目问题,那就作为一个思路补充吧
解法三(获取明文)
好像获取明文的解题方法现在都用不了,但是以前的题解有人解除了,说账号admin密码就是i_want_a_36d_girl,登陆不上不用太过纠结,作为思路补充
可以在控制台输入解密函数
function decryptHex(data, key, iv) {
var key1 = CryptoJS.enc.Latin1.parse(key);
var iv1 = CryptoJS.enc.Latin1.parse(iv);
return CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Hex.parse(data) }, // 关键:Hex → WordArray
key1,
{ iv: iv1, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding }
).toString(CryptoJS.enc.Utf8); // 关键:按 UTF-8 输出
}
decryptHex(
'a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04',
'0000000372619038',
'ilove36dverymuch'
);
// "i_want_a_36d_girl"
![]()
web20
![]()
根据题目提示访问/db/db.mdb
![]()
怎么想到/db/db.mdb这个路径的?
- 看提示做技术栈指纹:页面说「asp + access」,或响应头有
Server: Microsoft-IIS/6.0、X-Powered-By: ASP.NET、Set-Cookie: ASPSESSIONID...,就锁定老式 Windows/IIS 站。 - 找入口:
robots.txt、源码注释、/admin、/login.asp、报错页泄露的物理路径。 - 按惯例猜:这类老站目录命名高度套路化——
db/、data/、database/、databack/、bak/、backup/文件名:db.mdb、data.mdb、database.mdb、#db.mdb、admin.mdb、news.mdb、db.asa - 目录扫描兜底:
dirsearch、ffuf、gobuster、7kbscan + 敏感文件字典,把mdb/asa/asp/zip/rar/bak都挂上。
关于.mdb
.mdb 是 Microsoft Access 数据库文件(Microsoft Database),也是早期 Windows 生态里最常见的“文件型数据库”。
一个 .mdb 文件本身就是一个完整的关系型数据库,里面装着表、字段、索引、数据,还装着 Access 的窗体、报表、查询、宏、VBA 模块——不像 MySQL 那样是一堆文件加一个服务进程。
用数据库查看工具打开.mdb文件
这里我用的工具是MDB Viewer Plus
![]()
![]()
