【问题标题】:How to get around pipe symbol (bitwise OR operator) in PHP eval'ed code如何在 PHP eval 代码中绕过管道符号(按位或运算符)
【发布时间】:2014-10-10 00:03:10
【问题描述】:

在 PHP 中是否有等效的按位 OR 运算符(管道符号 | )?我正在使用 wordpress insert php 插件来允许在帖子和页面上的内容条目中使用 php 代码,并且该插件的工作方式是获取代码并在其上运行 eval 语句,但 eval 函数在某些符号(如按位 OR 或双管 OR 或美元符号 $。我在尝试使用按位 OR 连接的一些标志调用 json_encode 时遇到了这个问题,当然还有运行时的 eval 代码。我的解决方案是将代码放入一个函数(如 json_encode_eval() )并在 functions.php 中定义函数并调用 json_encode 即 return json_encode($str, FLAG | ANOTHER_FLAG); ,但有更好的解决方案吗?提前致谢。

【问题讨论】:

    标签: php wordpress plugins eval


    【解决方案1】:

    检查 wordpress 是否正在编码 |到一个 html 转义代码。 (寻找任何一个

    | | | | |
    

    )

    如果是这样,您必须在评估之前取消转义。

    [我很确定总有比评估用户提交的文本更好的方法 - 你可能有一个巨大的安全漏洞。]

    我试过了,它给出了预期的答案:

    <?php
    eval("\$a = 2|1;");
    $b = 2|1;
    
    var_dump($a);
    var_dump($b);
    

    输出:

    int(3)
    int(3)
    

    【讨论】:

    • 是的,这是一个安全漏洞。例如,我可以使用 insert php 插件在 wordpress 内容中包含 javascript。您的解决方案(未经测试)可能无法正常工作,因为 eval() 不解释 &verbar;作为按位或运算。
    • 我只是说 Wordpress 可能会将您的按位或运算符转换为 &verbar;您可能需要将其解码回 |在调用 eval 之前。完全猜测。
    • 我会尝试 json_encode($str,$anotherstring) 和 $anotherstring = unescape('FLAG &verbar; ANOTHER_FLAG'); ,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2017-08-12
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多