Просмотр полной версии : Принимать 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 запрос?
Спасибо!
Т.е. скрипт должен отправлять 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
МДА, ещё с первого поста можно было понять, что сокетом он уже умеет пользовапться и ему не нужно учиться им пользоваться второй раз, ему нужно пропарсить куки.<?
$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 ничего сделать не получится..
Что это может быть за фигня?
Возможно что ты сессию получаешь ещё до логина, потом передаёшь её во время логина, и только тогда получаешь другую сессию.
Это потому, что ты при первом же запросе передаешь идентификатор сессии, который ты, можно сказать, от балды выдумал, а доверчивый ПХП ведется...
И ведется, кстати не просто так, а потому, что этот 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;
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot