Python Pyramid 捕获空字节攻击

Posted

技术标签:

【中文标题】Python Pyramid 捕获空字节攻击【英文标题】:Python Pyramid capturing null byte attacks 【发布时间】:2021-08-26 06:35:17 【问题描述】:

我有一个带有 fail2ban 的 Pyramid Web 应用程序,设置了连续十个 404 状态(即探测漏洞的机器人)、Sentry 错误日志记录,据我所知,没有安全漏洞。但是,每隔几天我就会收到由空字节攻击引起的 502 通知。这是无害的,但它变得非常烦人,因此我忽略了一个奇怪但合法的人类用户生成的 502 状态。

在我的设置中,Pyramid 中的空字节攻击会在 url 调度级别引发 URLDecodeError ('utf-8' codec can't decode byte 0xc0 in position 16: invalid start byte),因此不会路由到 notfound_view_config 装饰视图。

有什么方法可以在 Pyramid 的请求中捕获 %EF/%BF 还是应该在 Apache 中阻止它们?

【问题讨论】:

A search in the Pyramid issue tracker yields several related results。 first hit 提供了一种处理方式。 【参考方案1】:

Steve Piercy 的评论转化为答案: A search in the Pyramid issue tracker yields several related results。 first hit 提供了一种处理方式。

简而言之,视图构造器类 exception_view_config(ExceptionClass, renderer) 捕获它的行为类似于 notfound_view_configforbidden_view_config(与 view_config 相比,它们没有传递声明的路由)。

因此 404 视图可能如下所示:

from pyramid.view import notfound_view_config
from pyramid.exceptions import URLDecodeError
from pyramid.view import exception_view_config

@exception_view_config(context=URLDecodeError, renderer='json')
@notfound_view_config(renderer='json')
def notfound_view(request):
    request.response.status = 404
    return "status": "error"

这可以通过访问浏览器http://0.0.0.0:??/%EF%BF 进行测试(其中??是服务的端口)。

但是,还有两个额外的考虑因素。

它不能很好地与调试工具栏配合使用(本地配置ini文件中的pyramid.includes = pyramid_debugtoolbar)。 此外,如果访问任何动态属性(如 request.path_info),则会引发错误。因此,在视图中的任何操作(例如使用数据等)之前,要么响应是最小格式的,要么为 request.environ['PATH_INFO'] 分配一个新值。 然而,视图调用发生在调试工具栏错误引发之后,因此即使使用request.environ['PATH_INFO'] = 'hacked',第一点仍然有效。

奖金

由于这无疑是一种攻击,因此可以对其进行自定义以与 fail2ban 配合使用,以在第一次出现时使用 unique status code(例如 418)来阻止黑客 IP 为 described here。

【讨论】:

以上是关于Python Pyramid 捕获空字节攻击的主要内容,如果未能解决你的问题,请参考以下文章

python 一个简单的Pyramid插件的例子

如何从 Python Pyramid 为 AngularJS 应用程序提供 index.html 文件?

Python Web框架:Django vs Flask vs Pyramid

使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节

Python 从字符设备读取空字节数组

python中的ID3v1空字节解析