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_configforbidden_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。