前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Real World CTF 2018 bookhub 总结

Real World CTF 2018 bookhub 总结

作者头像
phith0n
发布2020-10-15 11:38:38
7280
发布2020-10-15 11:38:38
举报
文章被收录于专栏:离别歌 - 信息安全与代码审计

挖坑必须填,虽然已久过去比较久了,但是我还是得简单写一下。

这个题目一共4个考点,文中图借用了参赛者的WP。

信息搜集

我一向出代码审计相关的题目,所以一般都直接给源码。打开源码,并简单浏览页面,发现后台登录用白名单限制了IP。

这其实是第一个考点,来源于之前遇到的一个案例:拿到目标的源码后发现无法访问,但在源码(Nginx配置文件)里找到了白名单的IP段,其中就包括目标办公网的IP。然后对这些IP进行扫描,发现了一些漏洞。

这个题也类似,登录的时候会爆出白名单的IP,其中有一个外网IP:

对这个IP进行扫描,发现开放了5000端口,这个端口运行的是debug模式的bookhub。我的原意是模拟了一个开发者,在本地(办公室)及线上运行了两个同样的系统,只是线上关闭了debug模式。

这里面我获取IP用的是X-Forwarded-For,很多人认为XFF一定可以伪造,其实不然,原因懒得说。

Flask 装饰器顺序问题

这是出本题的目的。其实已经有师傅说的比较清楚了:

http://blog.evalbug.com/2018/08/07/flask_decorator_sequence/

被Flask的@route装饰器修饰的函数,将作为一个view被外面访问。如果这个view需要鉴权,则增加@login_required修饰器。

但如果@login_required加在外层,将没有任何意义:因为@route只会将自己修饰的方法放入路由中。

redis eval注入

Flask-Session将session序列化后存入redis,如果控制redis,将可以执行任意命令。这也是我从之前遇到的案例里提取出来,可以参考这几篇文章:

第一篇文章是通过redis未授权访问控制redis,第二篇文章是通过SSRF控制redis。这个题目里面是通过redis.eval的任意lua代码注入来控制redis,其实核心没太大差别。

redis.eval注入点出现在debug模式下,用户可以清空redis中除了自己的sessionid以外其他所有的session。为了不多次读取redis,所以用到了redis.eval执行一个lua循环,其中自己的sessionid是拼接进去的。

反序列化

我们需要向redis中注入一个session,然后带上sessionid访问,触发python反序列化,最终执行任意命令。

python反序列化有几个点要注意:

  • python2.7和3默认protocol变化,所以你需要用python3生成payload
  • windows和linux下os是不一样的,所以你需要用linux生成payload
  • payload中有一些控制字符,所以你需要用lua代码来表示

这些坑慢慢试一下也就解决了,不再赘述。

总结

整个题目都是用了一些老考点,但我自认为还是比较贴近实战的,因为几个知识点都是比较常见的错误,也有遇到案例。

一些其他人的WP:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 信息搜集
  • Flask 装饰器顺序问题
  • redis eval注入
  • 反序列化
  • 总结
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档