[SDCTF 2022]jawt that down!
打开题目,存在登录框
初步测试发现并不存在sql注入漏洞,只好扫一下目录发现有/js
的路径
我们进一步扫描
访问/js/login.js
看一下,搜索得到用户名和密码
AzureDiamond
hunter2
登陆成功后发现有个N
点进去提示token错误
我们将cookie中的值解密一下,发现验证失败
通过查询json参数可以知道
这个JSON对象表示一个用户的身份验证信息,包含以下参数:
"username"
:表示用户名,这里是 “AzureDiamond”。"token"
:表示令牌(token),这里是 “5086a09b2dc4f4bfd9295f942428c63b”。令牌通常用于身份验证和授权,可以用于标识用户或应用程序的身份。"iat"
:表示令牌的发行时间(issued at),这里是 1704255578。它是一个UNIX时间戳,表示令牌生成的时间,以秒为单位。"exp"
:表示令牌的过期时间(expiration time),这里是 1704255580。它也是一个UNIX时间戳,表示令牌的有效时间截至的时间点,以秒为单位。
说明令牌有效时间只有两秒,我们可以尝试写脚本来实现绕过令牌过期
import requests
sess = requests.Session() #创建session会话对象
url = "http://node5.anna.nssctf.cn:28195/"
def login():
sess.post(url + "login", data={"username":"AzureDiamond", "password":"hunter2"})
login()
resp = sess.get(url + "N")
print(resp.text)
运行脚本后回显S,当我们修改为访问/S
时却回显404
而修改为/N/S
时成功回显S,那么不妨大胆猜测下通过迭代的路径就是flag,比如/N/S/S/C/T/F/{/.../}
import requests
sess = requests.session()
URL = 'http://node5.anna.nssctf.cn:28611'
flag = '/N/'
while True:
data = {"username":"AzureDiamond","password":"hunter2"}
r = sess.post(URL+'/login',data=data)
print(flag)
r1 = sess.get(f'{URL}{flag}')
flag += r1.text + '/'
if '}' in flag:
break
print(flag.replace('/',''))
运行得到flag