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

Discussion in 'PHP' started by beerbear, 17 Apr 2007.

  1. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Отправляю POST запрос на сервер. Он мне пытается вставить куки:

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


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

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

    Спасибо!
     
  2. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Короче, попытаюсь написать поподробнее...

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

    Code:
    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
    

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

    Code:
    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
    

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

    Code:
    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
    

    И все...

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

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    открываеш сокет, отправляеш http заголовок, потом читаеш ответ,в нем будут твои куки! Ты их просто выдираеш оттуда и юзаеш!
     
  4. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Необходимо, чтобы скрипт самостоятельно выдирал куки, а потом юзал их при Get запросе.
     
  5. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    557
    Likes Received:
    306
    Reputations:
    27
    сохраняешшь состояние сокета в переменую, потом парсишь эту переменую например с помощью регулярки(регулярного выражения) Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3 потом вставляешь в переменую и опять отсылаещь.
    Как я понял ты хочешь че то брутануть, зделай все в цикле, условием остановки которого будет удачный ответ.
     
    #5 AkyHa_MaTaTa, 18 Apr 2007
    Last edited: 18 Apr 2007
  6. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    2beerbear
    вот примерный вариант шаблона, который тебе нужен. Если че-то не понятно, тогда помочь могут только маны пХп (работа с сокетами, http протокол, ессии, ну и парсинг строковыми функциями)
    PHP:
    <?
    //соединяемся с сервером
    $fp fsockopen($hostname80$errno$errstr30);
    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);
                                             }
                   }
    ?>
     
    #6 mR_LiNK[deface_0nl, 18 Apr 2007
    Last edited: 18 Apr 2007
  7. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Спасибо, конечно, за ответы всем.. Вот только вы меня не так поняли.. =) Брутить я никого не собираюсь..
    Просто мне надо повторить описанные выше запросы при помощи скрипта на пхп.

    Т.е. скрипт должен отправлять 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 запрос?

    Спасибо!
     
  8. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Получаешь весь хидер в буфер, а потом выдираешь все Set-Cookie регуляркой, например, preg_match( )
     
  9. AkyHa_MaTaTa

    AkyHa_MaTaTa Elder - Старейшина

    Joined:
    19 Mar 2007
    Messages:
    557
    Likes Received:
    306
    Reputations:
    27
    вот скриптик, рег флудер, немного переделаешь регулярку и добавишь login:pass в отправку из файлика.

    http://slil.ru/24253456
     
  10. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    МДА, ещё с первого поста можно было понять, что сокетом он уже умеет пользовапться и ему не нужно учиться им пользоваться второй раз, ему нужно пропарсить куки.
    Code:
    [color=#00AA00][color=#0000FF]<?[/COLOR]
    
    $a_cookie [color=#0000FF]=[/COLOR] [color=#00FF00]array[/COLOR][color=#0000FF]()[/COLOR][color=#FF0000];[/COLOR]
    
    ParseCookie[color=#0000FF]([/COLOR][/COLOR][color=#FFFF00]'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'[/COLOR][color=#00AA00][color=#0000FF],[/COLOR] $a_cookie[color=#0000FF])[/COLOR][color=#FF0000];[/COLOR]
    
    ParseCookie[color=#0000FF]([/COLOR][/COLOR][color=#FFFF00]'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'[/COLOR][color=#00AA00][color=#0000FF],[/COLOR] $a_cookie[color=#0000FF])[/COLOR][color=#FF0000];[/COLOR]
    
    $cookie [color=#0000FF]=[/COLOR] [color=#00FF00]array[/COLOR][color=#0000FF]()[/COLOR][color=#FF0000];[/COLOR]
    
    [color=#00FF00]foreach[/COLOR][color=#0000FF]([/COLOR]$a_cookie [color=#00FF00]as[/COLOR] $param [color=#0000FF]=>[/COLOR] $value[color=#0000FF])[/COLOR]
    [color=#FF0000]{[/COLOR] 
      $cookie[color=#0000FF][] =[/COLOR] [/COLOR][color=#FFFF00]"[color=#00AA00]$param[/COLOR]=[color=#00AA00]$value[/COLOR]"[/COLOR][color=#00AA00][color=#FF0000];
    }[/COLOR]
    
    [color=#00FF00]echo[/COLOR] [/COLOR][color=#FFFF00]'<pre>Cookie: '[/COLOR][color=#00AA00][color=#0000FF].[/COLOR][color=#00FF00]implode[/COLOR][color=#0000FF]([/COLOR][/COLOR][color=#FFFF00]'; '[/COLOR][color=#00AA00][color=#0000FF],[/COLOR] $cookie[color=#0000FF]).[/COLOR][/COLOR][color=#FFFF00]'</pre>'[/COLOR][color=#00AA00][color=#FF0000];[/COLOR]
    
    
    [/COLOR][color=#888888]# *************************************************
    [/COLOR][color=#00AA00][color=#00FF00]function[/COLOR] ParseCookie[color=#0000FF]([/COLOR]$text[color=#0000FF],[/COLOR] [color=#FF0000]&[/COLOR]$cookie[color=#0000FF])[/COLOR]
    [color=#FF0000]{[/COLOR]
      [color=#00FF00]preg_match_all[/COLOR][color=#0000FF]([/COLOR][/COLOR][color=#FFFF00]'[color=#FF0000]/[/COLOR]Set[color=#00FF00]-[/COLOR]Cookie:[color=#FFFFFF]\s[/COLOR][color=#00FF00]*([/COLOR][color=#FFFFFF]\S[/COLOR][color=#00FF00][[/COLOR]^[color=#FFFFFF]\r\n[/COLOR][color=#00FF00]]*[/COLOR][color=#00FF00])[/COLOR][color=#FFFFFF]\s[/COLOR][color=#00FF00]*[[/COLOR][color=#FFFFFF]\r\n[/COLOR][color=#00FF00]][/COLOR][color=#FF0000]/sU[/COLOR]'[/COLOR][color=#00AA00][color=#0000FF],[/COLOR] $text[color=#0000FF],[/COLOR] $matches[color=#0000FF],[/COLOR] PREG_SET_ORDER[color=#0000FF])[/COLOR][color=#FF0000];[/COLOR]
      [color=#00FF00]foreach[/COLOR][color=#0000FF]([/COLOR]$matches [color=#00FF00]as[/COLOR] $cur[color=#0000FF])[/COLOR]
      [color=#FF0000]{[/COLOR]
        $elements [color=#0000FF]=[/COLOR] [color=#00FF00]preg_split[/COLOR][color=#0000FF]([/COLOR][/COLOR][color=#FFFF00]'[color=#FF0000]/[/COLOR][color=#FFFFFF]\s[/COLOR][color=#00FF00]*[/COLOR];[color=#FFFFFF]\s[/COLOR][color=#00FF00]*[/COLOR][color=#FF0000]/[/COLOR]'[/COLOR][color=#00AA00][color=#0000FF],[/COLOR] $cur[color=#0000FF][[/COLOR][color=#00FF00]1[/COLOR][color=#0000FF]])[/COLOR][color=#FF0000];[/COLOR]
        [color=#00FF00]foreach[/COLOR][color=#0000FF]([/COLOR]$elements [color=#00FF00]as[/COLOR] $element[color=#0000FF])[/COLOR]
        [color=#FF0000]{[/COLOR]
          [color=#00FF00]list[/COLOR][color=#0000FF]([/COLOR]$param[color=#0000FF],[/COLOR] $value[color=#0000FF]) =[/COLOR] [color=#00FF00]preg_split[/COLOR][color=#0000FF]([/COLOR][/COLOR][color=#FFFF00]'[color=#FF0000]/[/COLOR][color=#FFFFFF]\s[/COLOR][color=#00FF00]*[/COLOR]=[color=#FFFFFF]\s[/COLOR][color=#00FF00]*[/COLOR][color=#FF0000]/[/COLOR]'[/COLOR][color=#00AA00][color=#0000FF],[/COLOR] $element[color=#0000FF])[/COLOR][color=#FF0000];[/COLOR]      
          $cookie[color=#0000FF][[/COLOR]$param[color=#0000FF]] =[/COLOR] $value[color=#FF0000];
        }[/COLOR]
      [color=#FF0000]}
    }[/COLOR]
    
    [color=#0000FF]?>[/COLOR][/COLOR]
    Эту функцию можно вызывать после получения каждой страници, так как они могут добавлять новые переменные или заменять старые.


    [Great:] ОМФГ, Ну и форматирование=\\\
     
    #10 hidden, 18 Apr 2007
    Last edited by a moderator: 18 Apr 2007
    1 person likes this.
  11. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Всем огромное спасибо за ответы! Хидден - мегареспект! =)

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

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

    PHP:
    <?php

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


      
    $fp fsockopen($hostname80$errno$errstr30); 

      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($fp1024); 
        }  
        
    fclose($fp);
    }

    echo 
    $page;


    ?>


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

    Что я делаю не так?
     
  12. mR_LiNK[deface_0nl

    mR_LiNK[deface_0nl Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    147
    Likes Received:
    27
    Reputations:
    13
    используй http/1.0 вместо http/1.1
    т.е.:
    PHP:
    //в место этого::
    $hd "POST $path HTTP/1.1\r\n";
    //это::
    $hd "POST $path HTTP/1.0\r\n";
    это поможет увеличить скорость в несколько раз.
     
  13. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Все. Вопрос снимается. Сам нашел.
    $hd .="Proxy-Connection: Keep-Alive\r\n"; - не нужна.

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

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2
    Млин...

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

    В ответе сервера, если отправлять через инеткрэк присутствуют:
    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 ничего сделать не получится..

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

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Возможно что ты сессию получаешь ещё до логина, потом передаёшь её во время логина, и только тогда получаешь другую сессию.
     
  16. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Это потому, что ты при первом же запросе передаешь идентификатор сессии, который ты, можно сказать, от балды выдумал, а доверчивый ПХП ведется...

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

    Поэтому, чтобы тебе выдало новый PHPSESSID, закомментируй строчку:
    PHP:
    $hd .= "Cookie: PHPSESSID=2f83a67a61ef83594528c117c25a7da3\r\n";
    // зы: сиреневенький фон меня когда-нибудь убьет%(
     
    #16 Helios, 19 Apr 2007
    Last edited: 19 Apr 2007
  17. beerbear

    beerbear New Member

    Joined:
    15 Apr 2007
    Messages:
    24
    Likes Received:
    2
    Reputations:
    2

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

    GreenBear наркоман с медалью

    Joined:
    7 May 2005
    Messages:
    2,547
    Likes Received:
    1,398
    Reputations:
    612
    нарики
    PHP:
    $mda get_headers('http://mail.ru');
    foreach(
    $mda as $v){
        if(
    stristr($v'Set-Cookie')){
            
    $s .= $v."\n";
        }
    }
    echo 
    $s;