【BUUCTF-Web】[HCTF 2018]admin

412 阅读2分钟

Subject

权限问题 flask session


Mind Palace

访问网址:

查看网页源码:

顺势register a user:

可能需要admin权限才可以访问?

看来这里的关键就是如何让自己成为admin => 找到admin账户的密码or欺骗服务器认为自己是admin

在eclipse账户更换密码的网页源码中发现了提示:

登陆网址发现是源码 git clone下来发现是 flask 框架写的“”“”“”“

(・ェ・。) 暂时还没学过 原地螺旋回转再见👋

========================

Two thousand years later ... ... ...

========================

0x01 伪造admin的flask session

在index.html文件中找到关键信息:

只要session的name字段==admin就可以显示出flag的值 => 可以想到去构造session['name']=='admin'的session(在这里就需要用到flask的session的encode&decode工具了)

并且在config.py文件中找到SECRET_KEY

在eclipse账户中使用BP抓包获得session值:

运用工具decode账户eclipse下的session

修改此session中的name字段值为'admin'并且带着SECRET_KEY => encode出伪造的flask session值

复制得到的session值在eclipse账户下抓包后修改session值得到flag:

0x02 Unicode欺骗

在routes.py文件下的register() login() change()函数中均找到有点不一样的函数:

跟踪到这个函数:

在requirements.txt文件中发现Twisted==10.2.0与最新版差别较大 => 盲猜有问题

查阅必应,大神的wp果然是有问题的

nodeprep.prepare()会进行的转换:

ᴬᴰᴹᴵᴺ -> ADMIN -> admin

并且login的时候会进行一次这个函数并把转换过的name(此刻变成了"ADMIN")存入session中

change的时候再会进行一次这个函数把转换过的name(此刻就变成了"admin")存入session中

Payload:可以注册ᴬᴰᴹᴵᴺ账户 => 登陆一次然后账户变成了ADMIN => 修改一次密码 => session中存入的name字段名字就变成了admin

登陆login():

修改密码change()后重新用admin+password登陆:

0x03 条件竞争

代码逻辑上的漏洞;

详见blog.csdn.net/weixin_4467…


Look Ahead

由于 flask 是非常轻量级的 Web框架 ,其 session 存储在客户端中(可以通过HTTP请求头Cookie字段的session获取),且仅对 session 进行了签名,缺少数据防篡改实现,这便很容易存在安全漏洞

关于如何解析flask的session字段在references最后两个网页中有讨论等有时间再去研究一下

( ̄▽ ̄)~*


Reference:

blog.csdn.net/weixin_4467…

www.cnblogs.com/chrysanthem…

工具:

github.com/noraj/flask…

关于flask的session问题:

www.leavesongs.com/PENETRATION…

xz.aliyun.com/t/3569


END ヾ(^▽^ヾ)