【问题标题】:How can I remove null byte in my Query String URLs with Php?如何使用 PHP 删除查询字符串 URL 中的空字节?
【发布时间】:2021-03-24 23:37:55
【问题描述】:

我想知道如何删除 URL 中的空字节 (\0)。我知道,从 PHP 5.3.4 开始,这个安全漏洞已经得到修复,但也许可以从运行 php 5.3 或更低版本的其他服务器上的恶意用户传递一些东西。使用查询字符串可能会发生这种情况,我想了解如何保护我的 URL 以释放我的脚本,而不会对这个错误产生安全隐患。

示例:http://www.example.com/download.php?text=\0

我有两个假设:

A)$text = str_replace("\0", "", $text);

B)$text = str_replace('\0', '', $text);

什么版本是安全正确的?甲还是乙?谢谢。

PS:我在 CentOS 上运行 php 5.6.17... 使用 Apache 2.4。

【问题讨论】:

    标签: php null byte query-string str-replace


    【解决方案1】:

    这与安全无关,而与 php 中处理字符串的方式有关:

    • 计算双引号字符串
    • 不计算单引号字符串

    \是转义字符,所以后面的字符被转义了。

    要在双引号字符串中匹配它,您必须在前面附加一个反斜杠:\\0

    编辑:

    你说“在 php 中删除空字节”,然后“如果我把 $text = str_replace('\0', '', $text); \0 将被删除”。

    这意味着在您的字符串中没有空字节,而是一个反斜杠后跟一个零(≈空字节的表示)。

    例子:

    echo strlen( 'http://www.example.com/download.php?text=' );     // output: 41
    echo strlen( "http://www.example.com/download.php?text=\0" );   // output: 42 (Null)
    echo strlen( 'http://www.example.com/download.php?text=\0' );   // output: 43
    
    echo strlen( '\0' );                                            // output: 2
    echo strlen( "\0" );                                            // output: 1  (Null)
    

    还有:

    echo strlen(trim( "http://www.example.com/download.php?text=\0" ));
    

    将输出,41,因为trim 删除了 Null 字节

    echo strlen(trim( 'http://www.example.com/download.php?text=\0' ));
    

    将输出 43,因为 trim 不会删除 \0

    【讨论】:

    • 喜欢这个? $text = str_replace("\\0", "", $text); 但这实际上是一个空字节? \\0 谢谢!我想将字节 null 与 str_replace 匹配并将其从字符串中删除...
    • @Alessandro 您在标题问题中这么说,但在示例中,如果您说如果使用单引号则替换成功,因此在您的字符串中没有NULL,而是反斜杠后跟零.自己试试:echo (strlen ("\0")); echo (strlen ('\0'));单引号中字符串的len是2
    • 所以你说\0不是空字节? $text = str_replace('\0', '', $text); 不匹配空字节?在使用$text = str_replace("\0", "", $text); 时匹配一个空字节?如果我错了,请告诉我……谢谢……
    • 是的,没错!不计算单引号中的反斜杠
    • 我不是任何攻击问题的专家,但是是的,要替换空值,您必须使用 str_replace("\0", "", $text)
    【解决方案2】:

    解决此特定问题的更简单方法是使用chr() 函数:

    $text = str_replace(chr(0), '', $text);
    

    【讨论】:

    • 谢谢,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2018-12-08
    • 2019-01-14
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多