Cyber Apocalypse 2023 wp

前面几道题太基础,主要记录后面几道题目

Orbital

In order to decipher the alien communication that held the key to their location, she needed access to a decoder with advanced capabilities - a decoder that only The Orbital firm possessed. Can you get your hands on the decoder?

这道题就是sql注入登录,然后在下方可以进行下载文件,通过拦截数据,发现是一个文件包含,点击下载后会响应包中会有文件内容,于是根据本地文件查看得到flag所在文件名,抓包修改包内文件名,对其进行跨目录文件包含,得到flag,难度简单


主要看到一个大佬思路,我是没想到的,所以记录一下

1
2
3
4
5
6
7
8
9
10
11
12
def login(username, password):
# I don't think it's not possible to bypass login because I'm verifying the password later.
user = query(f'SELECT username, password FROM users WHERE username = "{username}"', one=True)

if user:
passwordCheck = passwordVerify(user['password'], password)

if passwordCheck:
token = createJWT(user['username'])
return token
else:
return False

这里看到username被直接包含到sql语句中去,所以这是存在sql注入,

这段sql语句主要是查询数据库中用户名为输入数据的在数据表中的用户名和密码,

然后返回的用户名和密码保存到user变量中

1
SELECT username, password FROM users WHERE username = "{username}"

当检测输入了用户名后,进行password校验

1
2
if user:
passwordCheck = passwordVerify(user['password'], password)

这里是将用户输入参数password,先进行md5加密,与数据库查询得到的password进行md5比较

1
2
3
4
5
6
7
def passwordVerify(hashPassword, password):

md5Hash = hashlib.md5(password.encode())

if md5Hash.hexdigest() == hashPassword: return True

else: return False

其实开始我是最先想到直接插入sql语句,这道题直接注入没有回显,需要报错注入


但是看到一个大佬的wp,我又多了一个新思路

既然它是将我输入的passwd与它通过存在sql注入漏洞的语句返回的查询值中的passwd进行md5

比较

如果,我修改后面的语句,使其返回一个admin用户名以及我伪造的md5密码,是不是就可以把admin用户密码认证伪造掉

1
" union select "admin","e10adc3949ba59abbe56e057f20f883e"#

这句话接到后面,前面语句返回为空,接着后面返回admin和密码123456e10adc3949ba59abbe56e057f20f883e

那么它就会把123456认为是admin的正确密码,然后和我们输入的密码进行对比,从而我们成功登录admin账户

image-20230325214900826

这是很好的思路,这比直接利用sql注入更加优雅,还是我对代码的敏感性不够

image-20230325215054574

image-20230325220025877