一边做 一边写题解。
信息收集
web1

注释没来得及删除,直接看网页源码看他的注释

这里解释一下f12的检查器和直接查看网页源代码的区别。右键直接查看网页源代码的内容是不会变的,是服务器发送过来的原始代码文本,而f12的检查器,是浏览器内核对源代码渲染后生成的DOM树结构。简单来说检查器是一个动态的,检查器直接反映你看到的整个页面,你在页面中做了一些操作,页面会变化,检查器中的DOM树结构也会变化,但是网页源代码始终不变。还有就是一些ajax请求加载的数据,也只会在f12的检查器里,因为只有检查器是动态监测DOM树的
再补充一个小技巧:假如在源代码里ctrl+f搜不到某个信息,但是在f12检查器里或者js调试器里能看到,说明这个信息是JS动态加载的,可以去network里看看网络包
第一道入门题就这么详细…不愧是我…
web2

说明这题应该要禁用JS 就能拿到我想要的数据

进去之后发现怎么都动不了,这几个文字也复制不了,右键也没办法,f12也按不了,直接去火狐浏览器的配置里禁用JS就老实了。

把javascript的允许改成禁用
然后就能正常右键查看网页源代码了

web3

所以这题要抓包 启动Burp

where is flag?

直接放在了响应数据包的包头
web4

robots.txt是这个网站配置的给搜索引擎的爬虫协议文件,告诉搜索引擎的爬虫(比如百度的蜘蛛 谷歌的骨骼机器人)哪些文件你可以爬取,哪些你不可以。然后会放在网站的根目录。然后就会有一些人不希望后台的地址被爬取显示出来,就会在robots.txt里放后台的地址,但这是很危险的。所以这题就是让我们去看一下robots.txt能不能访问,能访问的话里面的内容是什么。

发现不让爬虫访问这个flagishere.txt
然后访问

这里多解释一下,robots.txt本质只是一个君子协议,君子遵守,比如百度、谷歌的爬虫;但是黑客的爬虫完全可以不遵守,反而你写了什么东西不给爬 我偏要爬。
还有就是有的时候你访问不到一个网站的robots.txt,原因可能是服务器主动的封锁,比如服务器会检查你请求包的User-Agent头,发现你如果不是那些“君子”爬虫引擎,是一个普通用户或者其它,就不让你访问。
web5

题目提示是php源码泄露,那我可以尝试看看有没有flag.php。

发现没有 那你完了我要扫你的目录了
扫完目录发现也没有。。。结果仔细看才发现是phps源码泄露…
尝试访问index.phps。


phps即PHP Source,假如一个文件以phps为后缀,那么访问服务器上这个phps文件时,服务器不会将其当作php代码执行,而是会交给一个内置的函数highlight_file(),将其文件内容转换成带有颜色高亮、格式化的彩色HTML文本,然后返回给浏览器,本意是希望在服务器上放一个php代码进行共享,公开分享代码示例,但是直接放在生产环境并且没注意的话,可能会泄露一些敏感信息。
但是为什么我们这个题访问的时候没有看到带颜色高亮的代码内容,而是直接下载呢?因为这需要 Apache 等服务器配置 AddType application/x-httpd-php-source .phps。如果没有这行配置,那么可能就是直接访问纯文本内容或者像这题一样,直接当成了静态资源,直接下载
web6

看到题目的提示,解压源码到当前目录,测试正常,收工:首先暴露了一个信息,就是拿压缩包解压完,测试正常,但是没有删除压缩包,因此根目录或者其它目录可能存在压缩包,如果服务器没有对压缩包格式进行配置的话,那么可能可以直接下载造成源码泄露。
尝试访问index.rar index.zip
发现没有,可能是解压整个网站源码,尝试访问www.rar www.zip

发现存在,解压之后是一个index.php和fl00g.txt

打开index.php,提示flag在那个txt文本文件里,但是发现并没有:


既然网站源码是这个,那我可以直接访问/fl000g.txt:

拿到flag。
web7

提示说.git文件可能不小心放到生产环境中了,先直接访问一下试试

直接拿到了。
git就不解释了
web8

也是一样的提示信息。
直接尝试/.git没反应

尝试队.git目录下一般会有的几个目录,比如说

都没能成功。
后来看了题解,才想起来除了git做版本控制,还有svn啊!现在几乎没有人用过了,我自己也没用过,所以一时间没想到。成功拿到flag

web9

看到这个提示,首先用vim在生产环境修改,但是突然死机,猜测网站下可能存在一些vim中间缓存或是临时文件,但之前没接触过这个,不知道会是什么文件怎样命名。AI后才知道:

尝试了/.index.php.swp /.index.html.swp /.flag.txt.swp等都没有,然后尝试把最前面的.删去,访问 /index.php.swp,得到文件:


但是为什么要不带这个.呢?默认的文件命名不是以.开头吗?包括我以前扫一些目录的时候,也是经常发现的以.开头的swp 还有.bak等以.开头的文件。
查了一下,可能的原因大概有两种:
一种是一般来说是apache nginx等web服务器给当前目录配置了禁止访问以.开头的文件。但是出题的人比较懒,懒得改apache配置,直接改了文件名。
第二种是Vim的配置文件中directory选项的配置值以双斜杠//结尾,这个时候Vim在生成文件名时就不会以.开头,而是用文件的本名。但是这个不是默认配置,需要自己去配置。
总之这题出的太不专业了。
web10

说明这题的信息藏在cookie中。
在f12的存储中,找到cookie的信息,发现flag

额外讲一下cookie的生命周期。一般是通过了认证或者登录后,响应包中会携带cookie,然后浏览器会自动解析响应包中的cookie信息放到存储中,之后你每次请求这个host时,请求头都会携带上这个cookie信息。额外抓个包看了一下,这题是直接就返回的cookie

web11

提示说域名也可以隐藏信息,下面还说什么会动态更新,我第一时间想到的就是域名解析DNS,对这个域名的解析历史记录。
这里windows可以直接使用命令:nslookup -qt=txt flag.ctfshow.com

发现解析不出来了,这道题可能出问题了,所以才在题目中写明最终的flag
web12

这题一看就是弱口令,并且跟网站内容相关。打开容器:

一个购物相关的网站。在底部发现了一个phonenumber: 372619038

猜测这个就是密码,寻找一下管理员登录的地址,猜测直接拼接admin

发现了登录框,但是还需要用户名,猜测是这个网站的名称,但是不对。
直接尝试用户名admin

登录成功 拿到flag

web13

提示说技术文档中的敏感信息,并且部署到生产环境修改默认密码??既然是隐私的技术文档为什么要部署到生产环境呢?
看到技术文档,本能地想到做java开发的时候的swagger,还有knife。打开容器后是一个类似电视机的销售网站。

盲猜这是一个java后端的项目吧。尝试访问一下上面提到的两个目录都不行。看看这个站点信息吧。发现底栏有一个document的链接可以点开

点开之后是一个pdf,关于这个产品的技术手册

在pdf中发现了后台的登录密码

尝试访问 拿到flag

web14

提示关键信息在源码里,并且提到了跟默认配置有关,暂时没想到什么东西。打开容器,又是这种门户站点:

在网页源代码中搜索提示信息editor:

发现editor是当前文件所在目录中的一个目录,尝试访问:

发现是一个引入的editor,这种古董editor漏洞最多了。尝试上传木马:

提示没有写权限。。但是发现旁边有个文件空间,直接把整个服务器资源路径全部列出来了。。。。

一直找找找,找到一个nothinghere的文件夹

发现flag.txt

然后这个网站页面其实就是那个index.php,默认是路由到这个目录,然后在后面拼接/nothinghere/fl000g.txt,访问得到flag

web15

提示邮箱泄露信息。找到这个站点的出现的邮箱

发现是一个qq.com。回想起我第一次打ctf第一个flag了。。就是通过qq号信息溯源。。。

发现现在的qq不是当年老版的qq了。当年老版的qq通过qq号就可以看你个人信息卡。现在啥都看不了。我的第一个flag也成了历史。。。
搞了半天没思路,让dirsearch搞一下,发现admin目录。出题也太随意了。。。。随随便便就搞个admin给你登录地址。。。等路径依赖了到时候挖洞的时候会很失望的。。。

访问admin。用户名就用这个qq 密码先试下admin

试了一下 用户名错误 把用户名改成admin 密码改成qq号,提示密码错误

可以尝试爆破,但是有个忘记密码的选项

提问我所在的城市是哪个。本来之前的qq,有qq号就能看到个人信息卡的,直接就过了,然后找了一下,找到一个通过qq查询信息的接口:https://uapis.cn/api/v1/social/qq/userinfo?qq=xxxx


Location是陕西西安。提交后发现重置了密码,然后登录,拿到flag.


web16

根据提示,需要找到探针的信息。打开是一个元素周期表

尝试访问当前路径下tz.php,直接就出来了

发现这下面有个数据库连接检测,用默认的密码root试了一下,发现检测连接成功

尝试用navicat去连接一下,发现并没法连接上。
然后上面有一个直接获取phpinfo()的接口,在phpinfo()界面里搜索flag,得到flag

这里解释一下为什么phpinfo()的界面里会有flag,相信很多师傅也有过这个问题,但是没去想。
首先,只要设置了 docker 容器启动时的环境变量 flag=xxx,且 PHP 运行在 CLI 模式(命令行)下,或 PHP-FPM 关闭了 clear_env 功能,那么之后 PHP 进程就能继承,并在 phpinfo() 的 Environment 中打印出来。
假如说flag是在PHP Variables这个板块下的,以nignx服务器为例,找到nginx配置文件中处理PHP请求的location,添加参数,例如:
server {
# ... 其他配置 ...
location ~ \.php$ {
include fastcgi_params; # 通常都会包含默认参数
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 你的 PHP-FPM 监听地址
# 在这里添加你的自定义参数
fastcgi_param FLAG "ctfshow{nginx_fastcgi_param}";
fastcgi_param MY_ENV "production";
# ...
}
}
重启nginx后,会在phpinfo()中的PHP Variables下的$_SERVER['FLAG']中看到刚刚设置的flag信息。很显然,这道题中也这样设置了

web17

提示寻找备份的sql文件。备份的sql文件有很多种啊,比如.sql,建表的sql文件,可以当做备份;还有像是mysql-bin这样运行过程中生成的救急恢复文件,还有经常管理员喜欢将备份文件的后缀改成.bak,应该是他们写的自动的脚本的命名。
直接尝试访问backup.sql 拿到了备份文件

这是一个表结构的备份文件,然后里面拿到flag

web18


打开后是这个小鸟过柱子的游戏。很经典了,这个题也比较经典。看到这种小游戏的题,基本上都是在js里去找线索的。因为web端的这种游戏逻辑完全由JS控制。并且他说了玩到101分给我flag,那我就去调试器里找到对应的分数的数值,在控制台里修改他,然后让js去判断给我想要的结果。以上是我的第一想法。
发现在js中有一段分数大于100的逻辑:

把这段unicode去解码一下

提示说去110.php看看,OK,拿到flag

web19

那么肯定在前端里

这一块整个的逻辑是:对用户输入的密码使用这个key和iv进行加密,然后和环境变量中的pazzword进行对比,如果一致则通过。
现在下面那块注释中有了加密有的数据,知道了加密方式和key还有偏移量,那么就能计算了。python代码如下:
from Crypto.Cipher import AES
import binascii
# ---------- 1. 已知硬编码参数 ----------
key = b"0000000372619038" # 16 字节,对应 AES-128
iv = b"ilove36dverymuch" # 16 字节 IV
# 你抓到的 64 位十六进制密文(Hex 格式)
hex_cipher = "a599ac85a73384ee3219fa684296eaa62667238d608efa81837030bd1ce1bf04"
# ---------- 2. Hex 解码成字节 ----------
ciphertext = binascii.unhexlify(hex_cipher) # 得到 32 字节
# ---------- 3. AES-CBC 解密 ----------
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext_padded = cipher.decrypt(ciphertext) # 得到带 ZeroPadding 的明文
# ---------- 4. 去除 ZeroPadding(去掉末尾所有 \x00) ----------
plaintext = plaintext_padded.rstrip(b'\x00')
# ---------- 5. 按 Latin1 编码转成字符串 ----------
original_string = plaintext.decode('latin1')
print("解密结果:", original_string)
得到的密码:

下面的注释中提示用户名是admin,输入后,得到flag

web20

access数据库,印象中是那个一个excel表格就当作数据库了的。打开后提示

尝试直接访问db.mdb。没访问到,拿dirsearch扫了半天也扫不到,看了一下题解,原来挡在db目录下,要开递归扫描扫到db/db.mdb,早该想到的啊

记事本中打开

至此信息收集这一块就结束了
爆破
web21

打开后是一个登录框,那直接抓到登录的包进行爆破

尝试抓输入登录密码后进行登录的数据包,没有发现账号密码的字段,但是有一个认证的字段,看上去是base64编码过的,拿去还原一下:


发现是把我账号密码用:连接,并用base64编码。同时题目给了一个字典,用这个字典进行爆破,然后再intruder模块中设置payload的编码方式。用户名默认admin


将这个url编码去掉,因为base64编码中存在=号,会把=号进行url编码。随后开始攻击

找到其中数据包长度不一致的,得到flag

web22

这道题失效了,就不测了
web23

打开后给到一些白盒代码

这段php代码的意思是,对token进行md5之后,第2个字符要等于第15个和第18个;满足条件后,用intval获取第1、15个字符的数字值,然后加上第18个字符,一起除第一个字符。intval函数会解析开头的数字部分,直到遇到非数字字符为止。
这里已经能判断第2、15、18个字符都是数字了,因为假如是字母的话,intval会取0,除0本身是会报错抛异常的。然后这样的话也能确定第32个字符的值是3了。
所以可以写一个脚本进行爆破,只要满足2、15、18位都是一样的数字,且32位是数字3,就能解开此题。


拿到flag

web24

这道题的代码是意思是,以372619038作为随机种子生成随机数,然后和传入的r参数进行对比。以某个数字作为随机种子的话,每次生成的随机数都是固定的,所以可以模拟这个过程,拿到固定的随机数。


拿到flag

查了一下,不同版本的php的mt_srand() mt_rand()函数还可能不同,因此得知道服务器中的php版本。这道题同时在下方还暴露了很多系统信息,因此可以考虑抓包看看能否返回php的信息。

发现是php7.3.11 我的是7.4.5 这两个函数是一样的
web25

这段代码意思是说,对这正flag md5之后取前八位,然后转化成数字,当做随机种子。然后将用户传入的数字与这个随机种子第一次生成的随机数作对比,如果相等,检查cookie中的token值和下两次随机数之和作对比,如果相同,那么输出flag。
那么这道题的目标就很明显了,拿到这个随机数的种子,之后一切都好办。php随机数的种子是可以反推的,通过生成出来的随机数,使用php_mt_seed工具进行反推。
我们首先随便发送一个数字,拿到他的第一个随机数的值。这里方便计算我输入0

得到第一个随机数是1145576791。丢到php_mt_seed里去跑:

得到了几个种子值。直接拿第一个进行生成:


然后抓包,增加cookie值:

发现不行。然后发现刚刚那个种子值是php5.2之前的。抓包发现这是php7.3.11,用一个7以后的,拿到flag:

web26

打开后是一个这样的界面:

点击开始安装,然后全部填空的,然后重放,就有flag了。不知道这题何意味

web27

打开后,依旧正方软件系统:

抓个包看一下,没什么信息。然后发现有一个录取名单何意个学生学籍信息管理系统。点击录取名单下载了一个xlsx,里面是学生信息

学生学籍信息查询系统,打开后

思路很明确了,用这个身份证号去爆破学籍信息。先抓个包

身份证是用明文传输的。中间缺少的是生日日期。这就好爆破了。

开始攻击

没成功,换个学生的身份证,也是不行,怀疑是日期的问题。然后重新生成从1980-2025的日期,重新爆破

发现一个长度明显不一样的,很显然,这个就是密码的unicode编码,拿去解码一下:

发现这个是学号,密码是身份证,然后登录,拿到flag

这题有点像edu挖洞的过程了,不过现在也没有能这么好挖的了,能找到一个这样的都算走运了。
web28

大海捞针吗有点意思。
点进去之后发现目录长这样

试着改成1.txt,不知道给我重定向到哪去了。。。

所以这题可能是目录爆破,然后选1-100的数字进行递归遍历。最终找到flag藏在/70/20这个目录下

至此爆破的题就结束了。其实这些题没有用到很复杂的爆破。真正遇到能重放的数据包的时候,更多的考虑的是目标值范围的确定以及性能取舍问题。

么么么