WP_SANITIZE_REDIRECT去掉了@符号(甚至从参数中)--为什么?

时间:2012-09-11 作者:PapaFreud

在我的Wordpress站点中,我有一个黑客,它查看uri并重定向到子域。问题是wp_redirect 呼叫wp_sanitize_redirect 这将使@ 签名,因此当用户尝试加载以下内容时

[email protected]
加载的页面应为

[email protected]
但事实上

prefix.oursite.com?email=foobar.com (i.e. - no @ sign)
这个问题很容易解决-我只是在调用之前手动将@符号编码为%40wp_redirect.

问题:为什么wp_sanitize_redirect 去除@ 迹象,没错?任何人都可以尝试加载带有@ 登录-是否有我没有想过的安全问题?

编辑:我说的功能是wp_sanitize_redirect

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

Question 为什么wp_sanitize_redirect 去除@ 迹象,没错?任何人都可以尝试加载带有@ 登录-是否有我没有想过的安全问题?

请看一下来源:

function wp_sanitize_redirect($location) {
    $location = preg_replace(\'|[^a-z0-9-~+_.?#=&;,/:%!]|i\', \'\', $location);
    $location = wp_kses_no_null($location);

    // remove %0d and %0a from location
    $strip = array(\'%0d\', \'%0a\', \'%0D\', \'%0A\');
    $location = _deep_replace($strip, $location);
    return $location;
}
所以唯一的角色preg_replace 允许是

小写a-z~+_.?#=&;,/:%!.php函数urlencode() 替换all 无字母数字字符,except -_. 使用% (百分比)字符后跟两个十六进制值和带+. 如果您使用rawurlencode(), 它还剥离了+. 正如您从preg_replace(), 它允许所有URL编码/准备的字符,因此将这些编码字符/URL部分扔到游戏中是安全的。

SO网友:user3242786

只是想跟进我自己的发现。如果我遗漏了URL中的最后一个/的话,这种情况就会发生在我身上。这样做导致WP调用func:redirect\\u canonical,去掉了@符号。当我添加最后一个/时,它没有调用此函数,@符号仍然存在。

调试重定向的一个好插件是:Debug WP Redirect

Example 1 which fails:

原始URL:www.domain。com/somepage?电子邮件[email protected]

最终URL:www.domain。com/somepage/?电子邮件=meme。com公司

Example 2 which works:

原始URL:www.domain。com/somepage/?电子邮件[email protected]

最终URL:www.domain。com/somepage/?电子邮件[email protected]

结束

相关推荐