BUUCTF [HCTF 2018]admin
寻找破解知识点
(看别人的思路应该主要都是审计flask模板中的代码)
方法1 - Flask session伪造
首先,先注册一个再登录,在change password那里查看源码,可以看到有提示:

原链接已经404,看的这一个
https://github.com/Wkh19/hctf_flask
这是一个flask模板,这样来看,这是一道模板注入类型的题目。
session可以在此处查看

从上面的图看,session明显是加密过的。那么我们要去找flask的加密算法是什么
用到的脚本来自:https://github.com/noraj/flask-session-cookie-manager
解码:
python .\flask_session_cookie_manager3.py decode -s "ckj123" -c "SessionValue"
编码:
python .\flask_session_cookie_manager3.py encode -s "ckj123" -t "解码值"
其中,需要把解码值中的name值改成admin,以伪造admin用户的session。
我们需要的值只有本地session和SECRET_KEY(在flask模板中config.py中的一个固定值)
最后利用伪造的session,成功登录admin账号,得到flag{2e49592c-5689-45ef-853d-0526d6299bc6}
方法2 - Unicode欺骗
其实这个Unicode欺骗很好理解。就是我们平时英文字母ABC… 在希腊字母中,就变成了αβγ一样。由于占用的空间和使用的用途不同,在转码的时候会有各种方式。
那么在这道题中该如何利用Unicode欺骗呢?简单来说,就是找一个奇怪语言的admin重新注册一个,把之前的admin密码覆盖掉,就可以用我们的密码登陆了。
造成这样的漏洞在于register和change中都出现了strlower函数:


def strlower(username):
username = nodeprep.prepare(username)
return username
strlower函数本意是把大写转换成小写。nodeprep.prepare的本意也是把A转换成a。但他遇见ᴬᴰᴹᴵᴺ时,会转换成ADMIN。这就是这个函数的漏洞。
我们利用这一漏洞注册一个Username为ᴬᴰᴹᴵᴺ的账户,实际Username是ADMIN,再修改密码,再次经过strlower函数,我们就可以修改admin账户的密码了。
参考链接:
https://blog.csdn.net/Obs_cure/article/details/113805070
https://blog.csdn.net/rfrder/article/details/109188719
浅谈Unicode设计的安全性

浙公网安备 33010602011771号