Loading

BUUCTF [HCTF 2018]admin

寻找破解知识点

(看别人的思路应该主要都是审计flask模板中的代码)

方法1 - Flask session伪造

首先,先注册一个再登录,在change password那里查看源码,可以看到有提示:

原链接已经404,看的这一个https://github.com/Wkh19/hctf_flask

这是一个flask模板,这样来看,这是一道模板注入类型的题目。

Session机制详解

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。
我们需要的值只有本地sessionSECRET_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设计的安全性

posted @ 2023-08-28 21:47  Amsterdamnit  阅读(163)  评论(0)    收藏  举报