通过GET变量绕过受密码保护的POST

时间:2016-06-15 作者:Xaver

我喜欢使用GET变量绕过受保护帖子的密码表单,该变量具有以下要求:

核心没有更改,密码没有明确泄露(散列)

  • 没有安全漏洞

    No changes to the core

    这是一个无需思考的问题,因为功能应该在插件中,并且可以开箱即用。我found 一些methods 这会更改核心文件。

    No clear exposure of the password

    而不是http://example.com/post?pwd=mypassword URL应该类似于http://example.com/post?pwd=%25P%25BaxfPUloy8YdOFi2F9F2xAcCg8OLGP

    No possible security leaks

    当然,这不应该以某种方式被“黑客”攻击。他们只是受保护的职位,但这是不可能的。

    What I need:

    获取附加到URL的哈希的方法:

    $url = add_query_arg(array(
        \'pwd\' => get_my_hash();
    ), get_permalink($post_id));
    
    页面模板上的代码:

    if(post_password_required()){
        if(isset($_GET[\'pwd\'])){
            if(check_pwd_with_hash($_GET[\'pwd\'])){
            //unlock content
            }
        }
    }
    
    the_content();
    
    没有办法钩住post_password_required() 方法或简单设置全局$post->post_password 到空字符串。

  • 1 个回复
    最合适的回答,由SO网友:kaiser 整理而成

    检查post密码(出于某种原因)发生在get_the_content(), 这似乎是合法的,但实际上把两个不同的问题混在了一起。你说得对,没有办法解决get_the_content() 显示密码表单。下面是core中密码检查的详细操作:

    if ( empty( $post->post_password ) )
         return false;
    
    if ( ! isset( $_COOKIE[\'wp-postpass_\' . COOKIEHASH] ) )
         return true;
    
    require_once ABSPATH . WPINC . \'/class-phpass.php\';
    $hasher = new PasswordHash( 8, true );
    $hash = wp_unslash( $_COOKIE[ \'wp-postpass_\' . COOKIEHASH ] );
    if ( 0 !== strpos( $hash, \'$P$B\' ) )
         return true;
    return ! $hasher->CheckPassword( $post->post_password, $hash );
    
    如您所见,密码将根据存储在用户计算机上的Cookie进行检查。

    要绕过post密码,您实际上必须通过设置此cookie来授予用户显式权限。Core采用以下方式:

    setcookie(
        \'wp-postpass_\' . COOKIEHASH,
        $hasher->HashPassword( wp_unslash( $_POST[\'post_password\'] ) ),
        $expire,
        COOKIEPATH
    );
    
    当你看到the_post_password(), 它用于检索(纯文本密码),然后您会发现它除了逃避用户安全的论点外,什么都不做:

    esc_attr( $post->post_password )
    
    现在,您可以将其组合起来,在显示模板中的内容之前设置Cookie:

    // Your custom check for the `$_GET` content
    // …also check if there in fact is a password
    // …and if the user is a repeated visitor, do not set the Cookie again
    if (
            isset( $_GET[\'circumvent\'] ) 
            and \'disable-pass\' === $_GET[\'circumvent\'] 
            and isset( $post->post_password )
            and ! isset( \'wp-postpass_\'.COOKIEHASH )
        ) {
        // Finally we use the plain text password to set the Cookie
        // as if the user would have entered it into the password form
        setcookie(
            \'wp-postpass_\'.COOKIEHASH,
            $hasher->HashPassword( wp_unslash( esc_attr( $post->post_password ) ) ),
            $expire,
            COOKIEPATH
        );
    }
    // Now display the content:
    the_content();
    
    附加information 关于这篇文章中的Post密码,我写了很多关于这一概念的文章,但我们知之甚少,您可能想了解其中的一些细节

    相关推荐

    是否有必要清理wp_set_password用户输入?

    我正在尝试向WP注册表添加密码表单。请参见下面的代码。我想知道是否需要清理这个特定的用户输入?(如果是,怎么做?)如果我理解正确,WP为某些东西内置了净化功能,密码可能就是其中之一。对吗?WP会在将其添加到数据库之前自动对其进行清理吗?add_action( \'register_new_user\', \'registration_change_pass\', 10, 99 ); function registration_change_pass( $user_id ) { &