【发布时间】:2012-09-01 19:30:19
【问题描述】:
在尝试针对 null byte poisoning 强化 PHP Web 应用程序时,我注意到我实际上在请求中发送了一个空字节。
使用 cURL,我终于能够找到一种在我的请求中发送空字节的方法,但我注意到一些非常奇怪的事情:没有任何包含空字节的请求参数到达我的 PHP 应用程序。
作为概念证明,我在我的服务器上创建了一个名为 test.php 的文件:
<?php echo json_encode($_GET), PHP_EOL;
这是对该脚本的一些请求的结果:
> curl 'http://localhost/test.php?foo=bar&baz=nu%00ll' {"foo":"bar"} > curl 'http://localhost/test.php?foo=bar&b%00az=null' {"foo":"bar","b":"null"}似乎键在空字节处被截断,如果值包含空字节,则该参数将从请求数组中完全删除。
使用print_r() 会产生类似的结果:
<?php print_r($_GET);
> curl 'http://localhost/test.php?foo=bar&baz=nu%00ll'
大批
(
[foo] => 酒吧
)
> curl 'http://localhost/test.php?foo=bar&b%00az=null'
大批
(
[foo] => 酒吧
[b] => 空
)
如果我修改我的脚本和 cURL 请求以使用 $_POST,也会发生同样的事情。
我不是在抱怨,但我确实需要知道为什么会这样,这样我才能确保每个网络服务器都配置正确。
是什么导致了这种行为?
> php -v PHP 5.3.3 (cli)(构建:2012 年 7 月 3 日 16:40:30) 版权所有 (c) 1997-2010 PHP 集团 Zend Engine v2.3.0,版权所有 (c) 1998-2010 Zend Technologies 与 Suhosin v0.9.29,版权所有 (c) 2007,SektionEins GmbH【问题讨论】:
-
您可能应该使用 var_dump 或 print_r 来显示 get/post 数组,以确保导致问题的不是 json_encode。
-
这是一个公平的观点;我会在我的问题中说明这一点。
-
首先禁用 Suhosin。它可能已经处理好了。
-
Hakre 指出它禁用了 Suhosin,但您可能想首先考虑 Suhosin 用于硬化,所以只需禁用以测试 Suhosin 是否已经为您执行此操作。
-
@hakre 你是对的。我禁用了 Suhosin,并且能够在传入请求中看到空字节。发布答案,以便我可以奖励您(: