[HCTF 2018]admin
1.题目:
2.过程:
又是学习dalao操作的一天:
一、flask session 伪造

应该是要获取admin的账号……网页通过session识别用户的身份:
session是浏览器与服务器交互的会话,这个session可以来验证访问者的身份,大多数的session都是保存在服务器的,但是也有少部分是客户端session,如flask框架。
传统PHP中session都是被放在服务器中的,用户只是看到一串随机字符串,真正的session内容在服务器中,flask是一个python轻量级web框架,他的session存储在客户端的cookie字段中,为了防止session篡改,flask进行了一定的处理,代码存放在flask模块中sessions.py文件中。
flask session 的加解密需要一个secret-key:

源码中的config文件中可以被找到
用 flask-session-cookie-manager 对cookie进行解密:
解密:
python flask_session_cookie_manager3.py decode -s SECRET_KEY -c “session”
加密:
python flask_session_cookie_manager3.py encode -s SECRET_KEY -t “未加密session”

在index中:

只验证了session中的’name’即可:

修改cookie即可以admin身份登录获取flag……
二、Unicode欺骗

在change页面可以清楚的看到,对获取到的name进行了小写处理。python中含有小写函数:lower()
这里用的是strlower:

用到了nodeprepare.prepare,这个方法从Twisted库中导出:

这里的Twisted版本很低,dalao怀疑这里有漏洞……搜索了一下相关内容:
https://engineering.atspotify.com/2013/06/18/creative-usernames/中记录了因为使用nodeprepare.prepare导致的一起漏洞。注册时, ‘ᴮᴵᴳᴮᴵᴿᴰ’经处理得到‘BIGBIRD’,就成功注册了‘BIGBIRD’账户,但在修改密码时,再次对name使用了nodeprepare.prepare。那么修改的账户就变成‘bigbird’,原来的bigbird账户的密码就被控制了。官方的原话为:
”We were relying on nodeprep.prepare being idempotent, and it wasn’t.“
转化为小写的函数原本应当是幂等的,但在这个特殊情况下,两次的结果是不同的。
在https://news.ycombinator.com/item?id=5902506的讨论中:

似乎是python的工作方式的改变破坏了Twisted库。
或许是因为某些原因导致不支持ᴮᴵᴳᴮᴵᴿᴰ字符,进行了强制的转换?到这里我仍不是很明白。Unicode同形字引起的安全问题中介绍了关于Unicode转ASCII的GitHub的漏洞,但不是ᴬᴰᴹᴵᴺ到ADMIN的转换。
我找到了Unicode的标准化处理:
unicodedata.normalize(form, unistr)
把一串UNICODE字符串转换为普通格式的字符串,具体格式支持NFC、NFKC、NFD和NFKD格式。
Unicode标准定义了四种规范化形式: Normalization Form D (NFD),Normalization Form KD (NFKD),Normalization Form C (NFC),和Normalization Form KC (NFKC)。大约来说,NFD和NFKD将可能的字符进行分解,而NFC和NFKC将可能的字符进行组合。
NFC(Normalization Form C)使用最少的码位构成等价的字符串;
NFD把组合字符分解成基字符和单独的组合字符;
在另外两个规范化形式(NFKC和NFKD)的首字母缩略词中,字母K表示“compatibility”(兼容性)。这两种是较严格的规范形式,对“兼容字符”有影响。
=》https://blog.csdn.net/weixin_38492159/article/details/107135663

NFKC和NFKD下,都会转换为ADMIN;NFC和NFD下,仍为ᴬᴰᴹᴵᴺ。
大概是该方法在遇到ᴬᴰᴹᴵᴺ时,因为某些原因只进行了规范化而没有转化为小写导致了漏洞吧……更深的就不知道了……
p大:https://www.leavesongs.com/PENETRATION/client-session-security.html
关于Unicode安全的好像有一道Unicode shop,回来可以写写。
三、条件竞争
……确实不是很懂,先贴dalao题解,学习学习:
https://blog.csdn.net/weixin_44677409/article/details/100733581
https://www.anquanke.com/post/id/164086
……wohaocai