跳转到主要内容

django-xss-fuzzer:Django视图的XSS漏洞模糊测试器。

项目描述

Django XSS Fuzzer

用于Django视图的XSS漏洞模糊测试器。

此测试器将在模板渲染之前将XSS模式注入到上下文数据中,包括

  • 简单字符串
  • 查询集中Django ORM对象的属性

此工具的目标是快速发现Django模板中的任何XSS漏洞。

任何成功的注入都会将消息写入浏览器JavaScript控制台。

安装

通过pip安装

$ pip install django-xss-fuzzer

ViewFuzzerMiddleware添加到中间件列表中的测试环境

MIDDLEWARE = [
    ...
    'django_xss_fuzzer.ViewFuzzerMiddleware'
]

不要将此部署到生产服务器!

配置

通过Django全局设置配置中间件。

  • XSS_PATTERN:要尝试的XSS模式。参见XSS速查表以获取灵感。
  • XSS_INJECT_KWARGS(默认为False):一个开关,用于禁用注入XSS视图函数关键字参数
  • XSS_INJECT_CONTEXT_DATA(默认为True):一个开关,用于禁用将XSS注入到类数据中

使用Pytest和Selenium进行自动模糊测试

此软件包附带一个Pytest扩展,用于添加参数化固定值,xss_pattern

重启Django后,它将用恶意字符串替换上下文数据中的任何“类似字符串”。默认情况下,它将尝试<script>throw onerror=eval,\'=console.log\\\'{0}\\\'</script>

将要替换的值

  • 任何字符串变量
  • 模型实例中的任何字符串属性
  • 包含数据模型的查询集中任何字符串属性

fuzzer

当您浏览您网站上的任何页面时,您应该看到Django成功保护并转义字符串。

evil-page

当您打开JavaScript控制台时,如果您看到任何--SUCCESS[]--消息,这意味着您的页面存在漏洞,替换的字段名称将位于方括号内。

要更改恶意字符串,请将Django设置中的XSS_PATTERN变量设置。

它被设计成与PyTest、PyTest-Django和Selenium配合使用,以便它将尝试一系列恶意字符串,直到找到成功的攻击向量。

需要Selenium集成,以便每个视图都将由Chrome渲染并处理。一旦Chrome加载了页面,工具将检查JavaScript日志中是否存在任何--SUCCESS[field]--的实例,然后如果找到就失败测试。

以下是针对URL//home的示例测试

import pytest


paths = (
    '/',
    '/home'
)


@pytest.mark.django_db()
@pytest.mark.parametrize('path', paths)
def test_xss_patterns(selenium, live_server, settings, xss_pattern, path):
    setattr(settings, 'XSS_PATTERN', xss_pattern.string)
    selenium.get('%s%s' % (live_server.url, path), )
    assert not xss_pattern.succeeded(selenium), xss_pattern.message

测试函数test_xss_patterns是一个参数化测试,它将使用pytest-django运行一个实时服务器,并使用pytest-selenium为每个测试打开一个浏览器。要测试更多视图,只需将URI添加到paths

要设置Selenium,请将以下内容添加到您的conftest.py

import pytest


@pytest.fixture(scope='session')
def session_capabilities(session_capabilities):
    session_capabilities['goog:loggingPrefs'] = {'browser': 'ALL'}
    return session_capabilities


@pytest.fixture
def chrome_options(chrome_options):
    chrome_options.headless = True
    return chrome_options

这将配置Chrome为无头模式,并启用日志记录以捕获XSS漏洞。

要使用此插件运行PyTest,请使用--driver标志作为Chrome,并使用--driver-path指向您已安装的Chrome版本下载的Chrome Driver。

 $ python -m pytest tests/ --driver Chrome --driver-path /path/to/chromedriver -rs -vv

一旦运行,您将看到类似以下输出

对于每个失败的测试,使用攻击字符串检查特定的视图,以查看潜在漏洞所在。

Django内置的XSS保护如何呢?

在99%的情况下,Django会清理注入字符串,它们将不会成功。

但是,有一些限制,例如HTML标签属性的未引用表达式

<style class={{ var }}>...</style>

此扩展会自动将var替换为x onafterscriptexecute=console.log('found attribute-based xss in {0}')

Django将渲染以下HTML

<style class=x onafterscriptexecute=console.log('found attribute-based xss in {0}')>...</style>

在onafterscriptexecute中的JavaScript代码将由浏览器执行,展示了漏洞。

其他示例,例如在Django模板中使用|safe过滤器。这个过滤器可以不加理解地放入Django视图中。

例如,在永久性XSS攻击中,数据库或内存状态可能包含危险字符串。

在CI/CD中运行

GitHub Actions在ubuntu-latest映像中预装了Chrome和Chromedriver。

您可以使用相同的环境变量使用相同的标志运行测试

    - name: Run Security Tests
      run: |
        python -m pytest tests/your_security_tests --driver Chrome --driver-path $CHROMEWEBDRIVER/chromedriver

Azure Pipelines使用相同的映像,但语法不同。您可以使用如下脚本任务运行

- script: |
    pytest tests/your_security_tests --driver Chrome --driver-path $(CHROMEWEBDRIVER)/chromedriver
  displayName: 'Run Security tests'

还可以使用我的pytest-azurepipelines扩展来自动将测试结果发布到管道UI。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

django-xss-fuzzer-0.3.1.tar.gz (12.7 kB 查看哈希)

上传于 源代码

构建分发

django_xss_fuzzer-0.3.1-py3-none-any.whl (10.2 kB 查看哈希值)

上传于 Python 3

由以下支持