Perl CGI程序中的HTML联系表单是否存在缓冲区溢出或脚本漏洞?

4

我的托管公司说,填写HTML表单文本输入字段时只需使用恰好的垃圾字节就可以导致在与Apache/HTTP POST到CGI-Bin Perl脚本(例如NMS FormMail)一起使用时出现缓冲区溢出/资源问题。

他们说会发生核心转储,此时可以运行作为输入字段文本的任意脚本(存储为其一部分),该脚本可以危及站点。他们说这不是他们可以在Apache/Perl配置中保护的事情——它取决于Perl脚本通过限制发布字段中的字符数来防止此类问题。但似乎在脚本限制字段大小之前,核心转储可能会发生。

成千上万的站点正在广泛使用此类联系表单和方法,因此我想知道他们所说的是否属实。你们那里的安全专家能否启迪我——这是真的吗?我还想知道同样的事情是否会发生在PHP脚本中。您对于安全的站点联系脚本/方法有什么建议?

4个回答

3

我不确定缓冲区溢出的情况,但无论如何限制POST大小都是没有坏处的。只需在脚本顶部添加以下内容:

use CGI qw/:standard/;
$CGI::POST_MAX=1024 * 100;  # max 100K posts
$CGI::DISABLE_UPLOADS = 1;  # no uploads 

1

请要求他们提供有关此漏洞的具体参考资料。我确信在某些Apache版本中,可能通过特制的POST请求造成缓冲区溢出,但我不知道任何与NMS FormMail相关的特定版本。


1

你一定要向你的托管公司询问具体细节。里面有很多无关的陈述。

"缓冲区溢出"和"资源问题"是完全不同的事情。缓冲区溢出意味着你将会崩溃perl或mod_perl或httpd本身。如果是这种情况,那么其中一个组件中存在漏洞,他们应该引用相关的漏洞,并提供何时应用安全更新的时间表。这样的漏洞肯定会在Bugtraq上发布。

另一方面,资源问题是完全不同的事情。如果我在我的POST中发送了许多兆字节,那么我可能会占用任意数量的内存。这可以通过在httpd.conf中配置LimitRequestBody指令来解决。默认值为无限制。这必须由托管提供商设置。

他们说发生核心转储时,存储为输入字段文本的任意脚本可以在服务器上运行,从而危及站点。他们说这不是他们的Apache/Perl配置可以防止的——它取决于Perl脚本通过限制发布字段中的字符数来防止这种情况。但似乎在脚本限制字段大小之前,核心转储可能会发生。

如果这在httpd(或mod_perl)中创建了核心转储,那么它代表httpd(或mod_perl)中的一个错误。 Perl的动态和垃圾回收内存管理原则上不会受到缓冲区溢出或错误指针的影响。这并不是说perl本身的错误不能导致这种情况,只是perl语言本身没有导致核心转储的语言特性。

当您的脚本访问数据时,防止描述的任何事情都为时已晚。当然,您的脚本有自己的安全问题,并且有许多方法可以欺骗perl脚本运行任意命令。只是没有太多方法可以使它们以所描述的方式跳转到任意内存位置。


0

Formail过去曾经存在这种漏洞,所以我相信你的ISP是在利用这个来说明问题。任何Perl脚本中的不良实践都可能导致这样的灾难。

我建议尽可能确保Perl脚本验证所有用户输入。否则,请仅使用可信赖的脚本并确保及时更新。


NMS FormMail不同于Matt脚本中的FormMail。 - Alexandr Ciornii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接