哔哩哔哩 1024 安全挑战赛解题思路(前篇)
又名 bilibili 猜谜竞赛。被 W 拖来玩了。还挺有意思的。
这里是第一到第五题的题解。
一 页面的背后是什么?
页面的背后是什么?
打开之后页面长这样。
二话不说 F12 调出控制台开始看源码。翻开 <head>...</head>
,看到里面有两个奇怪的 <script>...</script>
。展开,有一串数值 values="flag1" value="22c9e7f7-1e0bf6d2-2adc392b-5d79aeff"
。
这个大概就是我们要的答案了。
二 真正的秘密只有特殊的设备才能看到
真正的秘密只有特殊的设备才能看到
等下这个页面怎么和上面一样?
开 F12 调出控制台看源码。发现后面有个 flag2
。行吧,再乱翻看看。
这里有个神秘的 url 以及跟 flag2
一样的描述。
看到 get
就马上联想到网络相关。不过我用的是 Windows,PowerShell 的 Invoke-WebRequest
太难用了……那么 WSL 启动!
从请求头里捞出 cookie,跟上面的参数一起传过去。
1 | $ curl -b 'session=(my cookie)' -X GET http://45.113.201.36/api/ctf/2 |
?被服务器拒绝了?
重新看看页面。
真正的秘密只有特殊的设备才能看到
需要使用bilibili Security Browser浏览器访问~
稍加思索.jpg
User-Agent。作用之一是标识浏览器。那么,往里面加个 -A
构造一下 UA 试试?
1 | $ curl -b 'session=(my cookie)' -A 'bilibili Security Browser' -X GET http://45.113.201.36/api/ctf/2 |
成功!
三 密码是啥?
密码是啥?
打开后页面长这样。
继续开 F12 看源码。
它用 json 传值。就懒得用命令行了,直接用网页。
继续翻,似乎也没看到什么有用的信息。请求头和回应头里也没有什么特别的。
完全没有。那就直接本社爆破。这个破站经常用的几个字符串无非就是 2233
、bilibili
那些。然后它要的又是管理员,那账号就直接试试 Administrator
,Admin
,Administrator22
,Administrator33
,administrator
,admin
……
账号填 admin
,密码填 bilibili
。
好的,flag 出来了。(居然是弱口令……)
四 对不起,权限不足~
对不起,权限不足~
前五题里最难的一道。
F12。
这回 <script>...</script>
在 <body>...</body>
里。
先用 curl 发一个 GET 看看。
1 | $ curl -b 'session=(my cookie)' -X GET http://45.113.201.36/api/ctf/4 |
HTTP response code 是 200,起码服务器没有拒绝我们;但是 msg 里什么都没有啊?还得继续猜。
再回到网页里看看。看看请求头和回应头里有什么东西。
cookie 里除了 session,还有个 role=(XXX)
的值。突然注意到这个以前没用上的 role
。前面的题都只用了那个用作登陆验证的 session
。
把这串值传过去。
1 | $ curl -b 'session=(my cookie); role=ee11cbb19052e40b07aac0ca060c23ee' -X GET http://45.113.201.36/api/ctf/4 |
?被服务器拒绝了?权限不够吗?
试试把上一道题的账号和密码传过去。
1 | $ curl -b 'session=(my cookie); role=ee11cbb19052e40b07aac0ca060c23ee' -d 'name=admin' -d 'subject=bilibili' -X GET http://45.113.201.36/api/ctf/4 |
行……继续猜。直接改role呢?
1 | $ curl -b 'session=(my cookie); role=admin' -X GET http://45.113.201.36/api/ctf/4{"code":"403","data":"","msg":""} |
还是不对。
盯着 role 的这个字符串想了一下。是不是到了尝试加密解密的时候了?
去 CTF Wiki 里逛了一圈,拎了个 hashcat 过来。
用 hashcat 暴力破解之后得到了后缀带个 :user
的字符串。看了一下,它用的加密算法是 MD5。
等下,前面那串不是跟上面一模一样吗?
草幸好只是在字符串后面加了个 :user,要是完全改掉了的话这不知道要破到什么时候
先试试把 user 替换成 admin Admin administrator Administrator superadmin sa SA……然后 MD5 加密一下传回去。
……那干脆点,连 user 的 hash 都不要了,直接上管理员名字的字符。
用 Administrator
做 MD5 加密传值后,成功得到 flag。
五 别人的秘密
别人的秘密
打开页面……草。
F12 看一下源码。
UID……
1 | $ curl -b 'session=(my cookie)' -X GET http://45.113.201.36/api/ctf/5\?uid\=2357**** |
果不其然(
看看 Cookies 里的 role
。跟上一道题一样。估计没有什么有价值的东西。但旁边的文件有意思了。
这里恰好有一个 UID。那么把这个 UID 传过去。
1 | $ curl -b 'session=(my cookie)' -X GET http://45.113.201.36/api/ctf/5\?uid\=100336889 |
看来答案没这么直接。
在百思不得其解的时候 W 说了句:“它说是别人的秘密。要不用暴搜UID爆破一下吧?”那就爆破一下。
Python 代码很快就写出来了。
1 | import requests |
运行一下。很快,在 UID = 100336942 的时候 flag 出来了。(难怪叫别人的秘密……flag 在别的 UID 里……)
插曲
flag 敲成了 falg。不知道是故意的还是单纯的手滑。
你密码呢?
UID = 100336889 和 100336942 的用户原来真的存在啊。不过看上去都是普通用户。