PDA

Просмотр полной версии : Принимать Set-Cookie средствами пхп


beerbear
17.04.2007, 23:35
Отправляю POST запрос на сервер. Он мне пытается вставить куки:

Set-Cookie:блаблабла1
Set-Cookie:блаблабла2
Set-Cookie:блаблабла3


Каким образом при помощи пхп перехватить эти куки , чтобы потом их юзать при следующем запросе?

Сорри, если вопрос ламерский - я в пхп нуб пока.

Спасибо!

beerbear
17.04.2007, 23:55
Короче, попытаюсь написать поподробнее...

При помощи Inetcrack отправляю:


POST http://site.com/login HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://site.com
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: site.com
Content-Length: 47
Pragma: no-cache
Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3

username=usver&password=123456&processlogin=1



Получаю ответ:


HTTP/1.0 302 Found
Date: Tue, 17 Apr 2007 18:23:23 GMT
Server: Apache
X-Powered-By: PHP/5.2.0-8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private
Pragma: no-cache
Set-Cookie: PHPSESSID=dbad9cfe26fa3aa839312951e7053c4d; path=/; domain=.site.com
Set-Cookie: loginname=usver; path=/; domain=.site.com
Set-Cookie: id_hash=bca49e192dce15ec725dce475e59d1a0; path=/; domain=.site.com
location: http://site.com/authloggedin
Content-Length: 0
nnCoection: close
Content-Type: text/html; charset=UTF-8
RemovedHdr: Keep-Alive



И потом снова отправляю:


GET http://site.com/ HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://site.com/login
Accept-Language: ru
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: site.com
Pragma: no-cache
Cookie: PHPSESSID=dbad9cfe26fa3aa839312951e7053c4d; loginname=usver; id_hash=bca49e192dce15ec725dce475e59d1a0



И все...

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

nc.STRIEM
17.04.2007, 23:55
открываеш сокет, отправляеш http заголовок, потом читаеш ответ,в нем будут твои куки! Ты их просто выдираеш оттуда и юзаеш!

beerbear
17.04.2007, 23:58
открываеш сокет, отправляеш http заголовок, потом читаеш ответ,в нем будут твои куки! Ты их просто выдираеш оттуда и юзаеш!

Необходимо, чтобы скрипт самостоятельно выдирал куки, а потом юзал их при Get запросе.

AkyHa_MaTaTa
18.04.2007, 00:12
Необходимо, чтобы скрипт самостоятельно выдирал куки, а потом юзал их при Get запросе.
сохраняешшь состояние сокета в переменую, потом парсишь эту переменую например с помощью регулярки(регулярного выражения) Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3 потом вставляешь в переменую и опять отсылаещь.
Как я понял ты хочешь че то брутануть, зделай все в цикле, условием остановки которого будет удачный ответ.

mR_LiNK[deface_0nl
18.04.2007, 01:45
2beerbear
вот примерный вариант шаблона, который тебе нужен. Если че-то не понятно, тогда помочь могут только маны пХп (работа с сокетами, http протокол, ессии, ну и парсинг строковыми функциями)
<?
//соединяемся с сервером
$fp = fsockopen($hostname, 80, $errno, $errstr, 30);
if(!$fp)
{ //проверяем успешность соединения
echo "$errstr ($errno)<br />\n";
} else {
//пишешь заголовки, к примеру
$header = 'POST http://site.com/login HTTP/1.0';
$header .= //подставляешь нужные заголовки...

for(){ //кол-во вложенных циклов зависит от кол-ва переменных для брута
// если логин и пароль, то 2-а цикла
$header .= //дописываешь нужные переменные
//отправляем запрос
fputs($fp, $header);
//построчно считываешь соединение
//и парсишь
for($i=0;$i<count($answer);$i++) {
$answer[]=fgets($socket);
if(strpos($answer[$i], 'базис сравнения')!==false) //... даллее действие при совпадении
fclose($sock);
}
}
?>

beerbear
18.04.2007, 03:38
Спасибо, конечно, за ответы всем.. Вот только вы меня не так поняли.. =) Брутить я никого не собираюсь..
Просто мне надо повторить описанные выше запросы при помощи скрипта на пхп.

Т.е. скрипт должен отправлять POST запрос на site.com/login, чтобы получить куки:

Set-Cookie: PHPSESSID=dbad9cfe26fa3aa839312951e7053c4d; path=/; domain=.site.com
Set-Cookie: loginname=usver; path=/; domain=.site.com
Set-Cookie: id_hash=bca49e192dce15ec725dce475e59d1a0; path=/; domain=.site.com

сохранить эти куки в переменную, а потом в GET запросе выставить эти куки.

Я просто не знаю, как это реализовать.

Получается скрипт после ответа сервера получает куки и идентификатор сессии и GET запросом переходит на нужную мне страницу www.site.com/dir/dir2.

Список логинов.паролей юзеров у меня есть.
Основная трудность, как подставить куки, полученные в ответе сервера в GET запрос?

Спасибо!

_Great_
18.04.2007, 09:21
Т.е. скрипт должен отправлять POST запрос на site.com/login, чтобы получить куки:

Set-Cookie: PHPSESSID=dbad9cfe26fa3aa839312951e7053c4d; path=/; domain=.site.com
Set-Cookie: loginname=usver; path=/; domain=.site.com
Set-Cookie: id_hash=bca49e192dce15ec725dce475e59d1a0; path=/; domain=.site.com

сохранить эти куки в переменную, а потом в GET запросе выставить эти куки.

Я просто не знаю, как это реализовать.
Получаешь весь хидер в буфер, а потом выдираешь все Set-Cookie регуляркой, например, preg_match( )

AkyHa_MaTaTa
18.04.2007, 12:08
вот скриптик, рег флудер, немного переделаешь регулярку и добавишь login:pass в отправку из файлика.

http://slil.ru/24253456

hidden
18.04.2007, 22:51
МДА, ещё с первого поста можно было понять, что сокетом он уже умеет пользовапться и ему не нужно учиться им пользоваться второй раз, ему нужно пропарсить куки.<?

$a_cookie = array();

ParseCookie('HTTP/1.0 302 Found
Date: Tue, 17 Apr 2007 18:23:23 GMT
Server: Apache
X-Powered-By: PHP/5.2.0-8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private
Pragma: no-cache
Set-Cookie: PHPSESSID=dbad9cfe26fa3aa839312951e7053c4d; path=/; domain=.site.com
Set-Cookie: loginname=usver; path=/; domain=.site.com
Set-Cookie: id_hash=bca49e192dce15ec725dce475e59d1a0; path=/; domain=.site.com
location: http://site.com/authloggedin
Content-Length: 0
nnCoection: close
Content-Type: text/html; charset=UTF-8
RemovedHdr: Keep-Alive', $a_cookie);

ParseCookie('HTTP/1.0 302 Found
Date: Tue, 17 Apr 2007 18:23:23 GMT
Server: Apache
X-Powered-By: PHP/5.2.0-8
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private
Pragma: no-cache
Set-Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3
Content-Length: 0
nnCoection: close
Content-Type: text/html; charset=UTF-8
RemovedHdr: Keep-Alive', $a_cookie);

$cookie = array();

foreach($a_cookie as $param => $value)
{
$cookie[] = "$param=$value";
}

echo '<pre>Cookie: '.implode('; ', $cookie).'</pre>';


# *************************************************
function ParseCookie($text, &$cookie)
{
preg_match_all('/Set-Cookie:\s*(\S[^\r\n]*)\s*[\r\n]/sU', $text, $matches, PREG_SET_ORDER);
foreach($matches as $cur)
{
$elements = preg_split('/\s*;\s*/', $cur[1]);
foreach($elements as $element)
{
list($param, $value) = preg_split('/\s*=\s*/', $element);
$cookie[$param] = $value;
}
}
}

?>Эту функцию можно вызывать после получения каждой страници, так как они могут добавлять новые переменные или заменять старые.


[Great:] ОМФГ, Ну и форматирование=\\\

beerbear
19.04.2007, 01:21
Всем огромное спасибо за ответы! Хидден - мегареспект! =)

В принципе я с самого начала шел в правильном направлении, но меня смущала ошибка, от которой я так и не избавился..

Вот пхп код пост запроса на сервак:


<?php

$hostname = "site.com";
$path = "/login";
$page="";
$data="username=usver&password=123456&processlogin=1";


$fp = fsockopen($hostname, 80, $errno, $errstr, 30);

if (!$fp) echo "$errstr ($errno)<br />\n";
else
{
$hd = "POST $path HTTP/1.1\r\n";
$hd .="Host: $host\r\n";
$hd .="Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\r\n";
$hd .="Referer: http://site.com/login\r\n";
$hd .="Accept-Language: ru\r\n";
$hd .="Content-Type: application/x-www-form-urlencoded\r\n";
$hd .="Proxy-Connection: Keep-Alive\r\n";
$hd .="User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)\r\n";
$hd .= "Content-Length: ".strlen($data)."\r\n";
$hd .= "Pragma: no-cache\r\n";
$hd .= "Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3\r\n";
$hd .= "Connection: close\r\n\r\n";
$hd .= $data;

fwrite($fp, $hd);

while (!feof($fp))
{
$page .= fgets($fp, 1024);
}
fclose($fp);
}

echo $page;


?>




На денвере скрипт выдавал ошибку "Fatal error: Maximum execution time of.." на хосте работал, но оооочень медленно. Поставил set_time_limit(0); - стал работать и на денвере, но также медленно.
Я просто не понимаю одного: если отправляешь тот же самый пост запрос при помощи Inetcrack'a, то через секунду приходит ответ сервера, а если скриптом - приходится ждать 5-10 минут...

Что я делаю не так?

mR_LiNK[deface_0nl
19.04.2007, 01:38
используй http/1.0 вместо http/1.1
т.е.:
//в место этого::
$hd = "POST $path HTTP/1.1\r\n";
//это::
$hd = "POST $path HTTP/1.0\r\n";
это поможет увеличить скорость в несколько раз.

beerbear
19.04.2007, 01:40
Все. Вопрос снимается. Сам нашел.
$hd .="Proxy-Connection: Keep-Alive\r\n"; - не нужна.

2mR_LiNK[deface_0nl:
Ок. Ща попробую!

beerbear
19.04.2007, 02:22
Млин...

Или я добью этот скрипт, или он меня...

В ответе сервера, если отправлять через инеткрэк присутствуют:
Set-Cookie: PHPSESSID=dbad9cfe26fa3aa839312951e7053c4d; path=/; domain=.site.com
Set-Cookie: loginname=usver; path=/; domain=.site.com
Set-Cookie: id_hash=bca49e192dce15ec725dce475e59d1a0; path=/; domain=.site.com


а если отправлять через скрипт, то только
Set-Cookie: loginname=usver; path=/; domain=.site.com
Set-Cookie: id_hash=bca49e192dce15ec725dce475e59d1a0; path=/; domain=.site.com

А без идентефикатора сессии PHPSESSID ничего сделать не получится..

Что это может быть за фигня?

hidden
19.04.2007, 02:27
Возможно что ты сессию получаешь ещё до логина, потом передаёшь её во время логина, и только тогда получаешь другую сессию.

Helios
19.04.2007, 08:23
Это потому, что ты при первом же запросе передаешь идентификатор сессии, который ты, можно сказать, от балды выдумал, а доверчивый ПХП ведется...

И ведется, кстати не просто так, а потому, что этот PHPSESSID был им уже выдан некоторое время назад инеткрэку, запущенному с твоей машины.

Поэтому, чтобы тебе выдало новый PHPSESSID, закомментируй строчку:

$hd .= "Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3\r\n";


// зы: сиреневенький фон меня когда-нибудь убьет%(

beerbear
19.04.2007, 12:00
Это потому, что ты при первом же запросе передаешь идентификатор сессии, который ты, можно сказать, от балды выдумал, а доверчивый ПХП ведется...

И ведется, кстати не просто так, а потому, что этот PHPSESSID был им уже выдан некоторое время назад инеткрэку, запущенному с твоей машины.

Поэтому, чтобы тебе выдало новый PHPSESSID, закомментируй строчку:

$hd .= "Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3\r\n";


// зы: сиреневенький фон меня когда-нибудь убьет%(


неа.. я ее закомментил сразу же после первой неудачи.. не в этом дело..
даже не знаю, что еще можно предпринять..

GreenBear
19.04.2007, 13:14
нарики

$mda = get_headers('http://mail.ru');
foreach($mda as $v){
if(stristr($v, 'Set-Cookie')){
$s .= $v."\n";
}
}
echo $s;