Python金字塔捕获空字节攻击
Python Pyramid capturing null byte attacks
我有一个带有 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 中阻止它们?
Comment by Steve Piercy converted into an Answer:
A search in the Pyramid issue tracker yields several related results. The first hit provides one way to deal with it.
简而言之,视图构造函数 class exception_view_config(ExceptionClass, renderer)
捕获它的行为类似于 notfound_view_config
或 forbidden_view_config
(与 [=14 相比,它们未通过声明的路由=]).
因此 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']
被分配了一个新值。
然而,视图调用发生在引发 debugtoolbar 错误之后,因此即使 request.environ['PATH_INFO'] = 'hacked'
. 第一点仍然成立
奖金
由于这无疑是一次攻击,因此可以对其进行自定义以与 fail2ban 配合使用以在第一次出现时将黑客 IP 阻止为 described here by using a unique status code,比如 418。
我有一个带有 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 中阻止它们?
Comment by Steve Piercy converted into an Answer: A search in the Pyramid issue tracker yields several related results. The first hit provides one way to deal with it.
简而言之,视图构造函数 class exception_view_config(ExceptionClass, renderer)
捕获它的行为类似于 notfound_view_config
或 forbidden_view_config
(与 [=14 相比,它们未通过声明的路由=]).
因此 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']
被分配了一个新值。 然而,视图调用发生在引发 debugtoolbar 错误之后,因此即使request.environ['PATH_INFO'] = 'hacked'
. 第一点仍然成立
奖金
由于这无疑是一次攻击,因此可以对其进行自定义以与 fail2ban 配合使用以在第一次出现时将黑客 IP 阻止为 described here by using a unique status code,比如 418。