本文目录
Web
Base64编码隐藏
据题可知,此web题目涉及base64编码的解码,加之此题难度极低,可以想到其可能隐藏在前端源码里面。
(1)F12查看前端源码

可以看到一串base64编码的字符串:Q1RGe2Vhc3lfYmFzZTY0fQ==
(2)进行base64解码

得到flag。
此题可知网站的前端:元素,网络,应用等可能隐藏这信息,可以优先看这些地方。
HTTP 头注入
(1)查看一下web的内容
其实想到这个是因为再浏览器内查看比较麻烦,终端查看比较明了。
1 | curl -is https://a78e7eda-2ef1-416a-ad46-cdaa9da2a1e3.challenge.ctf.show |

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

可以看到此处出现你必须使用ctf-show-brower这个浏览器访问才可以进入,这就是本题目http头注入的考点,改变UA来进行访问。为了方便的话我用的是BP进行修改。
(3)BP的操作
首先在其内置浏览器里打开网页,再通过历史请求找到一条关于登录二点post请求
将这条请求发送repeater
这里对repeater做出注释:Repeater= 抓到一个包后,可以反复修改、反复重发,看每次响应变化。 改 HTTP 头注入题(比如伪造 User-Agent)最常用的就是它。
题目中让用特定的浏览器来访问,那就改UA
将上述蓝色标记的地方改为目标浏览器,再进行发送访问,最后找到flag。
Base64多层嵌套解码
其整体思路采用倒退,主要是看懂源码,后续操作和上一题保持一致
(1)
1 | return btoa(encoded) === correctPassword; |
知:
1 | btoa():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)

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

