[help] Узнать имя сессии и послать пост запрос

Тема в разделе "PHP", создана пользователем Ser Frood, 10 окт 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    Народ подскажите как узнать имя сесиии?
    Имеется пост запрос, но на сайте защита на сессиях вот как узнать имя сессии и модефицировать пост запрос:
    PHP:
    $mess="mes=qqq&log=111";    
    $request "POST http://blablabal.ru/bla.php HTTP/1.0\r\n";
    $request .= "Accept: */*\r\n";
    $request .= "Referer: http://blablabal.ru/\r\n";
    $request .= "Accept-Language: ru\r\n";
    $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $request .= "Cookie: */*\r\n";
    $request .= "Cookie2: */*\r\n";
    $request .= "Proxy-Connection: Keep-Alive\r\n";
    $request .= "User-Agent: Opera/9.51 (Windows NT 5.1; U; ru)\r\n";
    $request .= "Host: blablabal.ru\r\n";
    $request .= "Content-length: ".strlen($mess)."\r\n";
    $request .= "Pragma: no-cache\r\n";
    $request .= "\r\n";
    $request .= $mess."\r\n";

        
    $s fsockopen("blablabal.ru"80$errno$errstr30);
        
    fputs($s$request);
        
    $content '';
        while (!
    feof($s))
        {
        
    $content .= fgets($s4096);
        }
        
    fclose($s);
     
  2. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Эта задача обратная разработке защиты на сессиях, которую мы 3 дня назад решали пока у меня гроза не прошла. Дальше я не в курсе.

    Нужно перед отправкой POST загрузить форму и там уже из хидера либо из ссылок(если в них есть) узнать идентификатор сессии.

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

    Хидер с сервера идет до контента страницы и там есть все что нужно.
     
  3. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    Хм а каким методом открыть и узнать Куки и Сессии? (функции открытия и т д)
     
  4. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    а это зависит от того чем грузишь страницу. Если snoopy то там есть $snoopy->headers. Если fsocksopen, то там хидеры выбираются простым циклом в самом начале.

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

    PHP:
    $snoopy = new Snoopy;

         
    # ### отправляем пароль и получаем куку ####

        
    $submit_url "http://ed.ru/loginmake.asp";
         
    $snoopy -> _submit_type "application/x-www-form-urlencoded";
         
    $submit_vars["username"] = $login;
         
    $submit_vars["password"] = $pass;
         
    $snoopy -> submit($submit_url$submit_vars);

         
    // проверка правильности пароля
        
    if(!strpos($snoopy -> headers[5], "/sprava/default.asp")){
             die(
    "неправильный логин или пароль");
             }

        
    // ищем куку
         
    for($x 0$x count($snoopy -> headers); $x++){
             if(
    preg_match("/^set-cookie:.*?/xi"$snoopy -> headers[$x], $match)){
                 [
    B]$cook_data[/B] = $match[0];
                 }
             }
         
    $snoopy -> rawheaders["Referer:"] = "http://ed.ruz/sprava/Uploadfile.asp?File="//реферер
         
    $snoopy -> rawheaders["Cookie:"] = $cook_data;
         
    $snoopy -> rawheaders["Cookie2:"] = '$Version=1';
    ......
    ....
    ...
    $snoopy->submit("http://ed.ru/sprava/savefile1.asp?file="$submit_vars$submit_file);

    А вот как можно получить хидер сырым пхп
    PHP:
    function get_server_answer($url)
    {
        
    $url trim($url);
        
    $urlp parse_url($url); 
        
    // формирование заголовка
        
    $headers['Referer'] = trim($ref);
        
    $headers['User-Agent'] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        
    $headers['Host'] = $urlp['host'];
        
    $headers['Accept'] = "text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
        
    $headers['Accept-Language'] = "en";
        
    $headers['Accept-Charset'] = "windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1";
        
    $headers['Accept-Encoding'] = "deflate, gzip, x-gzip, identity, *;q=0";
        
    $headers['Connection'] = "Keep-Alive"
        
    // соединяем все в кучу
        
    $cmd "GET " $urlp['path'] . '?' $urlp['query'] . " HTTP/1.1" "\r\n";
        if (
    is_array($headers)) {
            foreach(
    $headers as $k => $v) {
                
    $cmd .= "$k$v"\r\n";
            } 
        } 
        
    // коннект к хосту
        
    if ($socket == false or feof($socket)) {
            if (
    $debug == 1)echo "коннект к хосту...";
            
    $socket fsockopen($urlp['host'], 80, &$reply, &$replyString);
            @
    socket_set_timeout($socket10);
        } 
        
    // отправка заголовка
        
    fputs($socket$cmd "\r\n"); 
        
    //получение ответа
        
    $lastLine "\r\n";
        
    $finished=false;
        
    $headers=array();
        while ((!
    $finished)&&(!feof($socket))){
            
    $str fgets$socket1024 );
            
    $finished = ( $str == $lastLine );
            
    $headers[]=$str;
        }
        return 
    $headers;
    }  

    Тут видна суть. Сделай по аналогии. Кстати кука ведь обычно получается при авторизации. Так что если авторизовался ранее тем же скриптом, то незачем дергать форму.
     
  5. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    То есть нам надо сделать 2-а запроса?
    1-й это всё выдрать 2-й это всё вставить и послать запрос?
    2-м способом неполучается вывести полученый массив
     
  6. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Не нужно так много цитировать.

    Все очень просто - за сессию отвечает сервер. Он генерирует идентификатор и хранит данные сессии. Но скрипт сабмита же не телепат. Вот и надо спросить у сервера какую угодно страницу лишь бы он поставил куку (послал в хидере куку, которую браузер и сохраняет обычно, а мы можем узнать ее и отправить обратно в запросе).
    Если нет авторизации, то дергать надо страницу формы. Вполне возможно, что только в ней и нужна сессия. Но это не такая уж беда потому что мы читаем только хидеры, а это очень быстрый процесс.

    Это раньше лафа была - не загружая формы сразу отправялешь запрос и все проходит. Сейчас это всем порядком надоело и люди защищаются, кто как может.
     
  7. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    Ясненько воспользовался 1-м способом!
    Cannot instantiate non-existent class: snoopy in z:\home\111.ru\www\h.php on line 3
    2-м невыводит функция данные хеадера!
     
  8. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Конечно. Snoopy это такая библиотека на php.
    В ней реализовано в классе то, что ты хочешь писать просто ручками. При этом не требуется curl
    Живет тут Перейти по ссылке

    А по второму просто строчку пропустил. Брал из готового и переделывал на лету.

    PHP:
    function get_server_answer($url)
    {
        
    $url trim($url);
        
    $urlp parse_url($url); 
        
    // формирование заголовка
        
    $headers['Referer'] = trim($ref);
        
    $headers['User-Agent'] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        
    $headers['Host'] = $urlp['host'];
        
    $headers['Accept'] = "text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
        
    $headers['Accept-Language'] = "en";
        
    $headers['Accept-Charset'] = "windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1";
        
    $headers['Accept-Encoding'] = "deflate, gzip, x-gzip, identity, *;q=0";
        
    $headers['Connection'] = "Keep-Alive"
        
    // соединяем все в кучу
        
    $cmd "GET " $urlp['path'] . '?' $urlp['query'] . " HTTP/1.1" "\r\n";
        if (
    is_array($headers)) {
            foreach(
    $headers as $k => $v) {
                
    $cmd .= "$k$v"\r\n";
            } 
        } 
        
    // коннект к хосту
        
    if ($socket == false or feof($socket)) {
            if (
    $debug == 1)echo "коннект к хосту...";
            
    $socket fsockopen($urlp['host'], 80, &$reply, &$replyString);
            @
    socket_set_timeout($socket10);
        } 
        
    // отправка заголовка
        
    fputs($socket$cmd "\r\n"); 
        
    //получение ответа
        
    $lastLine "\r\n";
        
    $finished=false;
        
    $headers=array();
        while ((!
    $finished)&&(!feof($socket))){
            
    $str fgets$socket1024 );
            
    $finished = ( $str == $lastLine );
            
    $headers[]=$str// вот эту
        
    }
        return 
    $headers;
    }  


     
    Ser Frood нравится это.
  9. Ser Frood

    Ser Frood Заблокирован

    Регистр.:
    12 дек 2006
    Сообщения:
    519
    Симпатии:
    384
    Liver, с помощью скрипта выдают ответ в сокетах: Set-Cookie: PHPSESSID=9382613aeaeb8a8211fcdd87c7735997; path=/

    Но при хттп анализаторе:
    Cookie: __utmz=180800934.1223377650.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); PHPSESSID=867a3802e34104c40edd6c26252df414; __utmc=180800934; __utma=180800934.48600593.1223377650.1223653137.1223657198.18; b=b; hotlog=1; __utmb=180800934
    Cookie2: $Version=1
    провесь мож чё нетак:
    PHP:
    <?

    Error_Reporting(E_ALL & ~E_NOTICE);
    function 
    get_server_answer($url)
    {
        
    $url trim($url);
        
    $urlp parse_url($url); 
        
    // формирование заголовка
        
    $headers['Referer'] = trim($ref);
        
    $headers['User-Agent'] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
        
    $headers['Host'] = $urlp['host'];
        
    $headers['Accept'] = "text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
        
    $headers['Accept-Language'] = "en";
        
    $headers['Accept-Charset'] = "windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1";
        
    $headers['Accept-Encoding'] = "deflate, gzip, x-gzip, identity, *;q=0";
        
    $headers['Connection'] = "Keep-Alive"
        
    // соединяем все в кучу
        
    $cmd "GET " $urlp['path'] . '?' $urlp['query'] . " HTTP/1.1" "\r\n";
        if (
    is_array($headers)) {
            foreach(
    $headers as $k => $v) {
                
    $cmd .= "$k$v"\r\n";
            } 
        } 
        
    // коннект к хосту
        
    if ($socket == false or feof($socket)) {
            if (
    $debug == 1)echo "коннект к хосту...";
            
    $socket fsockopen($urlp['host'], 80, &$reply, &$replyString);
            @
    socket_set_timeout($socket10);
        } 
        
    // отправка заголовка
        
    fputs($socket$cmd "\r\n"); 
        
    //получение ответа
        
    $lastLine "\r\n";
        
    $finished=false;
        
    $headers=array();
        while ((!
    $finished)&&(!feof($socket))){
            
    $str fgets$socket1024 );
            
    $finished = ( $str == $lastLine );
            
    $headers[]=$str// вот эту
        
    }
        return 
    $headers;

    $otv=get_server_answer("http://bla.ru");


    $mess="mes=qqq&log=111";     
    $request "POST http://bla.ru/my.php HTTP/1.0\r\n"
    $request .= "Accept: */*\r\n"
    $request .= "Referer: http://bla.ru\r\n"
    $request .= "Accept-Language: ru\r\n"
    $request .= "Content-Type: application/x-www-form-urlencoded\r\n"
    $request .= "Cookie: ".$otv[4]."\r\n"
    $request .= "Cookie2: */*\r\n"
    $request .= "Proxy-Connection: Keep-Alive\r\n"
    $request .= "User-Agent: Opera/9.51 (Windows NT 5.1; U; ru)\r\n"
    $request .= "Host: bla.ru\r\n"

    $request .= "Content-length: ".strlen($mess)."\r\n"
    $request .= "Pragma: no-cache\r\n"
    $request .= "\r\n"
    $request .= $mess."\r\n"

        
    $s fsockopen("bla.ru"80$errno$errstr30); 
        
    fputs($s$request); 
        
    $content ''
        while (!
    feof($s)) 
        { 
        
    $content .= fgets($s4096); 
        } 
        
    fclose($s); 
        
        print 
    $content;

    ?>
     
  10. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Все так. Скрипт отсебятину не гонит. Какой хидер идет с сервера такой и выдает.

    Просто те куки что дает хттп анализатор установились ранее на этот домен. Даже идентификатор сессии разный.

    На самом деле неважно, что за куки поставил сервер на домен (обычно это просто счетчик, да и сильно похоже на счетчик всякие __utmz), а важно то, что сервер ожидает от браузера.

    Это проверить просто. Берем наш супер-мега-комбайн FireFox. Плагин Live HTTP Headers покажет нам какие хидеры туда сюда ходят, а плагин Tamper Data поможет модифицировать запрос на лету.

    Просто открой форму, заполни ее и через перехватку данных он же Tamper Data измени одну цифирь в идентификаторе сессии. По очереди. Если сервер пошлет куда подальше, значит мы нужную ему сессию подменили. Вот и узнаешь какой из идентификаторов кук тебе нужен.

    но судя по всему именно то, что идет в хидере при открытии формы и нужно, если нет авторизации и это не поддомен.
     
Статус темы:
Закрыта.