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_config
或 forbidden_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 为 AngularJS 应用程序提供 index.html 文件?
Python Web框架:Django vs Flask vs Pyramid