CTF / LEARNING NOTES

CTF WP

从前端源码到 Base64 解码
▰   CTF 题解约 851 字 · 3 分钟
本文目录

Web

Base64编码隐藏

据题可知,此web题目涉及base64编码的解码,加之此题难度极低,可以想到其可能隐藏在前端源码里面。

(1)F12查看前端源码

alt text
可以看到一串base64编码的字符串:Q1RGe2Vhc3lfYmFzZTY0fQ==

(2)进行base64解码

alt text
得到flag。
此题可知网站的前端:元素,网络,应用等可能隐藏这信息,可以优先看这些地方。

HTTP 头注入

(1)查看一下web的内容

其实想到这个是因为再浏览器内查看比较麻烦,终端查看比较明了。

1
curl -is https://a78e7eda-2ef1-416a-ad46-cdaa9da2a1e3.challenge.ctf.show

alt text
此处可见允许了很多指令的功能,这与http头注入有关
继续下翻
alt text
在此处看到了if这个指令,可以大体了解到如果你输入的密码经过base64加密后和正确的密码不一样会报错,那就可以想到如果一样那会怎样呢?(这里的correctpassword是上题中的flag,这个在上面有所显示)

(2)进行试验

alt text
可以看到此处出现你必须使用ctf-show-brower这个浏览器访问才可以进入,这就是本题目http头注入的考点,改变UA来进行访问。为了方便的话我用的是BP进行修改。

(3)BP的操作

首先在其内置浏览器里打开网页,再通过历史请求找到一条关于登录二点post请求
alt text
将这条请求发送repeater
alt text
这里对repeater做出注释:Repeater= 抓到一个包后,可以反复修改、反复重发,看每次响应变化。 改 HTTP 头注入题(比如伪造 User-Agent)最常用的就是它。
题目中让用特定的浏览器来访问,那就改UA
alt text
将上述蓝色标记的地方改为目标浏览器,再进行发送访问,最后找到flag。

Base64多层嵌套解码

其整体思路采用倒退,主要是看懂源码,后续操作和上一题保持一致

(1)

1
return btoa(encoded) === correctPassword;

知:

1
2
btoa():Base64 编码。
atob():Base64 解码。

可以从上述源码中得到,最后一串字符串经过base64编码后得到password
已知password为:SXpVRlF4TTFVelJtdFNSazB3VTJ4U1UwNXFSWGRVVlZrOWNWYzU=(在源码中已经说明)
那就对password进行解码得到:
IzUFQxM1UzRmtSRk0wU2xSU05qRXdUVVk9cVc5

(2)

1
encoded = btoa('aB3' + encoded + 'qW9').substr(2);

substr(2) 指的是删除前两个字符。aB3 -> YUIz 和上述Iz一样这就对应了把前两个字符YU删去了,那倒退时就要补回来,进行解码,再去掉固定的开头 aB3 和结尾 qW9。得到:PT13U3FkRFM0SlRSNjEwTUY=

(3)

1
encoded = btoa(encoded.split('').reverse().join(''));

对于split(‘’).reverse().join(‘’) 做出解释:

操作 作用 得到的结果
.split('') 把字符串拆成字符数组 ['a', 'b', 'c', 'd']
.reverse() 把数组顺序反过来 ['d', 'c', 'b', 'a']
.join('') 把数组拼回字符串,中间不加东西 "dcba"
btoa(...) 对倒序后的字符串做 Base64 编码 "ZGNiYQ=="
那倒退思路就是:解码,再反转
得到:FM016RTJ4SDdqSw==

(4)

1
encoded = btoa(encoded + 'xH7jK').slice(3);

相当于FM016RTJ4SDdqSw==是删过前三个字符得到的结果,并且已知完整字符串进行解码后缀一定含xH7jK
进行枚举得到:TVRFM016RTJ4SDdqSw==
解码得到:MTE3MzE2xH7jK

(5)

最后再解码得到:117316,这个就是密码,进行登录。

(6)

alt text
和上一题的思路一样,这里不再做详细展开
得到flag。