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>
。
将要替换的值
- 任何字符串变量
- 模型实例中的任何字符串属性
- 包含数据模型的查询集中任何字符串属性
当您浏览您网站上的任何页面时,您应该看到Django成功保护并转义字符串。
当您打开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。