ctfshow-web-信息搜集

ctfshow-web-信息搜集

web-wp

信息搜集

web03

Snipaste_2026-10-20_23-57-36

Snipaste_2026-10-20_23-52-10

ctrl+shift+I或F12,ctrl+u查看源代码,啥也没有怎么办?

根据题目提示的,没有思路的时候抓个包看看,这里用到的抓包工具是Burp Suite(下面都简称burp)

在burp中的Proxy拦截,点击图中的红色框框,把拦截到的发送到Repeater中,再点击send就可以在Response中看到flag了

Snipaste_2026-10-21_00-08-11

Snipaste_2026-10-21_00-10-09


web04

题目提示了robots文件,直接在url后边加上robots.txt即可

关于robots.txt

  • 但是,光是提示一个robots,我怎么知道是robots.txt呢,这是猜出来的吗?不,robots.txt这个名字是标准规定好的。所以看到robots,就做出在url写robots.txt对于熟练的人来说是很自然的一个动作,对于不太熟练的,看多了就记住了。
  • 其实,我们还可以用工具扫描来解:我这里用的工具是dirsearch
    因为,dirsearch的字典里有robots.txt,所以它直接给我们扫出来了,但是关于robots.txt的内容我们还是要知道的,其次就是,虽然扫描很方便,但扫描也存在局限性,所以能够根据提示做出来的,就优先提示吧
    image-20261021181349472

再记住三个状态码

image-20261021181720999

状态码含义说明
200存在且能读拿到了
301重定向常见于访问目录不带 /,比如 /.git → /.git/
403存在但被禁止目录在,但禁止列目录(可以再试具体文件)
404不存在注意:很多站会返回自定义 404 页面,长度都相同

关于200(可能是软404)

200 只代表“服务器成功返回了内容”, 不代表这个文件真的存在。

有些站点(尤其是前端路由的站)会对任何路径都返回 200 + 首页, 这叫 软 404。

所以扫到 200 之后,还要打开看内容:

  • 内容是 User-agent: ... / Disallow: ... → 真存在
  • 内容是首页 HTML → 软 404,是假的

一个URL拆开是这样的

text
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 会变成下载)。
  • 所以"能不能访问到"取决于两件事:文件到底存不存在、服务器有没有禁止访问它。

Snipaste_2026-10-21_00-18-34Snipaste_2026-10-21_00-17-34Snipaste_2026-10-21_00-18-01


web05

Snipaste_2026-10-21_00-34-46

题目提示了phps源码泄露,加之这题又是那种看源码啥也没有的,在url输入index.phps

为什么.phps可以看到源码?

  • .php是被执行的,我们是看不到源码的
text
浏览器请求 /index.php
   → 服务器发现是 .php
   → 交给 PHP 解释器执行
   → 执行结果(HTML)返回给浏览器

我们在页面上按 Ctrl+U 看到的只是输出,不是源码

  • .phps 是一个历史遗留配置:Apache 的 PHP 模块支持
    text
    AddType application/x-httpd-php-source .phps
    

    意思是".phps 后缀的文件,输出语法高亮后的源码,不要执行"。这本意是给开发者调试用的,一旦线上开着就是源码泄露
  • 所以为什么是index.phps???
    因为首页文件叫 index.php,只是把后缀换成 .phps 而已

Snipaste_2026-10-21_00-28-58Snipaste_2026-10-21_00-29-41

Snipaste_2026-10-21_00-29-18

扫描的局限性

这题解完之后我还用扫描工具试了一下,结果全是404,这说明什么?

如下图所示,不难看出,我扫描的文件后缀名是php/asp/aspx/zip/html等,并没有这一题的后缀名phps,所以才扫不到,因为phps没那么常见,不在扫描字典里,从这里我们不难看出,扫描的局限性其实就是,万一文件的后缀名不常见,那就扫不出来

那也可以把以后写题遇到的,不常见的后缀名全部加到字典中,扩大扫描的范围

image-20261021192247975


web06

题目提示

  1. “解压源码”说明存在压缩包
  2. “到当前目录,测试正常就收工了”说明:“到当前目录”->在网站根目录,“测试正常就收工“->没删掉
  3. 未知:这个压缩包叫什么

为什么是www.zip?

因为www是网站根目录的习惯名,在打包的时候习惯了用根目录命名压缩包。

这是“人的习惯”,不是标准。 所以它不是“唯一正确答案”,而是“命中率最高的答案”。

Snipaste_2026-10-21_00-58-07Snipaste_2026-10-21_00-59-30Snipaste_2026-10-21_01-00-12

Snipaste_2026-10-21_01-03-48


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相比较,就多了个斜杠,/..../代表访问的是目录

image-20261021100657678

image-20261021101442440


web08

题目提示

和web07一样,只不过这题是.svn

关于SVN

SVN 全称 Subversion,是 git 流行之前最主流的版本控制工具

老版本(1.6以前)

text
.svn/
├── entries          文件名 + 版本号清单(纯文本)
└── text-base/       每个文件的“原始副本”
    ├── index.php.svn-base
    ├── config.php.svn-base
    └── ...

text-base/里边存的是文件的明文副本,文件名规则是:源文件名+.svn-base

所以拿到 .svn 之后,不需要任何还原工具,直接访问:

text
/.svn/text-base/index.php.svn-base

返回的就是 index.php 的完整源码。

新版本(1.7+)

text
.svn/
├── wc.db        SQLite 数据库:记录路径、版本、校验和
└── pristine/    按 SHA1 命名的文件内容
    ├── 0a/
    │   └── abcdef...

这时内容不是明文文件名了, 需要工具来解析:

text
perl rip-svn.pl -v -u http://目标/.svn/

这题简化了

image-20261021102153899

image-20261021102126198


web09

题目提示

看到vim,以后条件反射:

**vim 编辑文件时会留下临时文件,这个临时文件里存着文件内容。**这是找编辑器留下的痕迹

关于.swp

  • vim 在编辑一个文件时,会在旁边创建一个交换文件(swap file)。
  • 定时把内存里的编辑缓冲区写到磁盘,断电,ssh断了,数据还能恢复
  • 所以交换文件里边的的内容就是文件内容本身,相当于copy了一份
    text
    index.php       ← 线上运行的文件
    index.php.swp   ← 编辑器里那份内容的副本
    

vim

标准写法:原文件名前加一个点,后面加 .swp

text
原文件:index.php
交换文件:.index.php.swp      ← 注意前面那个点

如果第一个交换文件已存在,会依次变成:

text
.index.php.swo
.index.php.swn

vim 还会留下其他痕迹:

text
.index.php~        ← 备份文件(保存前的旧版本)
.index.php.un~     ← undo 历史
.index.php.swp     ← 交换文件

这次访问的是

text
/index.php.swp     ← 没有前面那个点

说明这个环境里放的正是不带点的变体。

但是实战里两个都要试

text
/.index.php.swp
/index.php.swp

image-20261021103811884

image-20261021103744443


web10

Cookie是什么?

一组存在你浏览器里的键值对

这题看到flag有%7B%7D说明是URL编码,需要解码

image-20261021104555503

image-20261021104527507


web12

text
找后台地址  →  从页面公开信息里找密码  →  登录后台  →  flag
   /admin         手机号 / QQ / 邮箱          admin + 密码

后台地址admin从哪来

来源是 robots.txt(就是 web04 学的那招)

密码从哪来

有时候网站上的公开信息,就是管理员常用密码 为什么网页中给你一串数字,好难猜哟~

image-20261021210657805

image-20261021114533163

image-20261021210718559

image-20261021210516371

image-20261021114505451


web13

题目提示

① 技术文档 → 去站上找文档 ② 敏感信息 → 文档里有不该出现的东西 ③ 默认密码 → 后台用了默认密码,而且没改

text
首页 → 页脚 document 链接
     → 下载技术文档
     → 文档里写着后台地址 + 默认账号密码
     → 访问 /system1103/login.php
     → 登录 → flag

为什么是document?

因为那一小段英文就document首字母是小写,别的都是大写,为了引起你的注意

image-20261021211101953

image-20261021115735139

image-20261021115634984


web14

题目信息

  • editor提示了这题可以往编辑器的方向去思考
  • ”如果目录不存在,则会遍历服务器根目录“

先查看一下源码,发现没线索

image-20261022011347276

image-20261022011435491

image-20261022011854488

扫描得到/editor/目录,访问一下

image-20261022012020957

image-20261022023956600

这就是一个editor的界面的demo页

为什么能确定这是一个demo界面?

页面底部 提交内容(提交快捷键: Ctrl + Enter) 是 KindEditor 自带 php/demo.php 的原样输出——说明整个安装包被扔到了网站根下,连示例都没删。

既然 /editor/ 是完整安装包,那它下面必然有:

text
/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/                ← 上传文件存放目录(默认应该在这)

image-20261022012129727

为什么点var?

Linux 的网站默认放在 /var/www。它命中的的可能性比较大——它让你少点几次,但不保证对。

image-20261022012335424

为什么选www?

在前边的web题目中我们也遇到过,www就是常见的网站文件夹

image-20261022012258113

为什么先选了html?

因为,html是前端三件套,该文件夹以此命名,说明是与网站有关的

image-20261022012945470

为什么选nothinghere?

你不觉得,它很具有迷惑性吗?nothinghere这里啥也没有,你真信啊?

image-20261022013013714

image-20261022013049593

flooog.txt 和flag很像啊,大概率就是它,而且这下边只有这一个文件,你也只能点它,点击确定

image-20261022013125383

关于绝对路径

/var/www/html/nothinghere/fl000g.txt

为什么它是绝对路径?

在linux系统中,根(/)就是这个斜杠,var/www/html/nothinghere/ 是文件夹,fl000g.txt是文件名,/也叫磁盘根,是linux整个硬盘的起点,这需要我们有一些linux相关的基础知识

关于网站根

网站根简称站根,网站根目录 = Web 服务器“对外开放”的那个起点文件夹。浏览器 URL 里的那个 /,指的就是它,不是硬盘的 /。

分清三个根

text
① 磁盘根        /                        ← Linux 整个硬盘的起点
② 网站根        /var/www/html             ← 网站“对外营业”的起点(DocRoot)
③ URL 根        https://host/             ← 浏览器眼里的起点,对应 ②
text
磁盘根  /
 ├── 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中,如图所示

image-20261022014417305


web15(这题还蛮有意思的)

image-20261022121419013

image-20261022121847971

image-20261022123157449

这里用到了QQ邮箱的一个特点:QQ邮箱一般都是qq号+@qq.com 这个qq号可能后面会用上,可能是密码什么的(像web12一样),也可能是其他的

看源码你会发现,没有什么信息,然后观察一下这个网站,是那种登录的,需要你输入name,和email,熟悉吗?和web12有点像,那是不是可以采取web12的思路呢,在url,写/admin

image-20261022122606861

还真有,后台的管理员登录系统,可以先试一下,账号:admin / demo 密码:1156631961 或 0000000 或 12586954775

都试一下发现,都不是

忘记密码是不是可以看看

image-20261022123555555

没招了,看看前面,有什么信息还没用?qq号,如果不是密码,那能不能去qq搜一下呢

image-20261022124026135

好嘛,搜完得到地址是陕西安,回到重置密码那里,填入陕西西安不对,填西安

image-20261022124111365

拿到密码,回到管理员登录界面,试试看,账号:admin 密码:admin7789

image-20261022124255721


web16(阴魂不散的化学元素周期表)

image-20261022124829645

这个网站做的很炫酷

image-20261022151802936

为什么提示探针就知道要访问/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的地方

image-20261022150424638

image-20261022144441342


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不中怎么办?

按「备份文件字典」挨个试,或直接扫后缀:

text
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

image-20261022153519515

image-20261022153342627

image-20261022153426719


web18(这题也好玩)

image-20261022155109766

image-20261022162231729

这是个游戏界面,先试着玩两把,题目说玩到101分给flag,反正我是玩不到那么多的了

那就查看查看源码吧

image-20261022162547376

为什么选择.js?

这就是web前端三件套的内容了,其实你也可以,每一个都点进去,然后ctrl+F查询flag,最终还是会找到.js的

image-20261022162739241

红框中的那串字母是是什么?

它是 JavaScript 的 Unicode 转义序列,格式为 \u + 4 位十六进制数,表示一个字符的码点(编码编号)。

怎么识别出来那串字母是转义序列?

一眼识别:\u + 4 位十六进制 [0-9a-fA-F]

这就是它的“签名”,三个特征同时满足:

text
\u4f60
││└─┴── 4 位十六进制(0-9, a-f)
│└────── 字母 u(Unicode 的首字母)
└─────── 反斜杠(转义序列的起手式)

在实际代码里,它几乎总是成串、6 个字符一组出现,这个节奏感非常显眼:(记住这个特征就行)

text
\u4f60 \u8d62 \u4e86 \uff0c \u53bb \u5e7a \u5e7a \u96f6 \u70b9 ...
  你     赢     了     ,     去     幺     幺     零     点

怎么让它正常显示呢?

把它复制粘贴到控制台,如果控制台不给粘贴,就在里边敲“允许粘贴”并按回车键就好了

image-20261022163950578

你赢了,去幺幺零点皮爱吃皮看看提示你去访问110.php

image-20261022160120785


web19

  • 先试试弱口令(虽然大概率是不对的)
  • 试试查看源码

image-20261022205355587

image-20261022205335532

值得一提的是有没有发现,这种关键信息都在

解法一

image-20261022205214151

为什么u=admin&p=a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04行不通?

注意看源代码:POST'username' post'pazzword'

所以真正的参数名username和pazzword,这就是为什么u=admin&p=a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04行不通,但是图中的却可以的原因

为什么不用key和iv?

image-20261022210827846

image-20261022210949673

为什么不用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.实在不确定,就上工具

image-20261022213731387

image-20261022205256653

解法二(获取明文)

通过代码,我们可以知道它的加密逻辑,和密文,那为什么不试试,解密拿到明文登录呢?

在解法一里边我们分析了它是AES加密

关于AES加密

key:密钥

iv:偏移量

密文:a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04

模式:代码中写了mode:CBC

填充方式:zeropadding 解密工具里没有zeropadding那就nopadding

可以找一个AES在线解密工具

image-20261022222253193

账号:admin 密码明文:图中解密得到的字符串

我看别的题解有这个方法,但是不知道为什么,现在这个明文,登不上,可能是题目问题,那就作为一个思路补充吧

解法三(获取明文)

好像获取明文的解题方法现在都用不了,但是以前的题解有人解除了,说账号admin密码就是i_want_a_36d_girl,登陆不上不用太过纠结,作为思路补充

可以在控制台输入解密函数

js
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"

image-20261022224719275


web20

image-20261023001726209

根据题目提示访问/db/db.mdb

image-20261023001937621

怎么想到/db/db.mdb这个路径的?

  1. 看提示做技术栈指纹:页面说「asp + access」,或响应头有 Server: Microsoft-IIS/6.0、X-Powered-By: ASP.NET、Set-Cookie: ASPSESSIONID...,就锁定老式 Windows/IIS 站。
  2. 找入口:robots.txt、源码注释、/admin、/login.asp、报错页泄露的物理路径。
  3. 按惯例猜:这类老站目录命名高度套路化—— db/、data/、database/、databack/、bak/、backup/ 文件名:db.mdb、data.mdb、database.mdb、#db.mdb、admin.mdb、news.mdb、db.asa
  4. 目录扫描兜底: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

image-20261023002044204

image-20261023002109909

ctfshow-web-爆破
php伪协议+base64过滤