Se Logguer à un site, mémoriser le PHPSSID et envoyer plus..

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Se Logguer à un site, mémoriser le PHPSSID et envoyer plus..

Message par Ar-S »

Bonjour,

Toujours dans mes petits contests, je suis bloqué à plein d'épreuves du fait de la gestion des headers en PB, malgré ce post et un autre que je ne retrouve déjà plus.
J'ai vraiment du mal à comprendre comment en PB on puisse :
- Se connecter à un site nécessitant login et passe sur une page
- Puis charger une nouvelle page du site qui n'apparait que si on est connecté
- Récupérer et traiter les données (ça c'est bon)
- Renvoyer les résultats via un formulaire présent sur une 3eme page.

Voilà les infos du header que je récupère en utilisant "tamperdata" (module firefox) lorsque je me log au site.
Host=www.newbiecontest.org
User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0
Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language=fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding=gzip, deflate
Accept-Charset=ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection=keep-alive
Referer=http://www.newbiecontest.org/index.php
Cookie=admin=0; PHPSESSID=4ce48fe4546497cf1f4f131f278af1ab
Content-Type=application/x-www-form-urlencoded
Content-Length=46
POSTDATA=user=MONNOMUTILISATEUR&passwrd=MONMOTDEPASSE&cookielength=-1
Voilà ensuite le Header lorsque je vais à la page de l'épreuve :
Host=www.newbiecontest.org
User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0
Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language=fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding=gzip, deflate
Accept-Charset=ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection=keep-alive
Referer=http://www.newbiecontest.org/index.php? ... uve&no=218
Cookie=admin=0; PHPSESSID=4ce48fe4546497cf1f4f131f278af1ab; SMFCookie89=ICI_UNE_SUITE_ENCODEE
DNT=1
Je deviens chèvre, si quelqu'un pouvait m'expliquer comment capturer/réutiliser ces infos, je serai heureux comme un kcc devant un gif.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Syntax.error
Messages : 8
Inscription : mer. 13/juil./2011 16:42

Re: Se Logguer à un site, mémoriser le PHPSSID et envoyer pl

Message par Syntax.error »

Bonsoir,

Je m'étais échiné à réaliser un bot pour jeu-par-navigateur il y a quelques mois.. J'ai donc eu à faire à la communication via POST / GET, et la gestion de cookie.

J'aimerais bien te donner des tuyaux, mais je comprends pas trop où tu bloques !

Pour analyser les header, j'utilisais tout simplement la biblio "regularexpression", à la recherche notamment de "Set-cookie"
Je parsais la ligne, enregistrait/rafraichissait les valeurs des cookies sur un .ini ...

Et balançait les cookies dans les dernières lignes de mon protocol :p


Le programme envoyait son protocol, et en fonction du head répondu, construisait un nouveau protocol, selon le "plan" indiqué par le programme ( quels cookies dois-je envoyer ? quel page dois-appeler ? dois envoyer des "arguments" de type GET, POST ? ), plan lui même tiré d'observations préalables sur le "comportement" du site.


Désolé si je manque de clarté :s
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Se Logguer à un site, mémoriser le PHPSSID et envoyer pl

Message par Ar-S »

Bonjour Syntax.error,

C'est bien la mise en œuvre qui me chagrine, si tu avais un exemple, ce serait bien.
Pour mon lien je fais :

Code : Tout sélectionner

InitNetwork()
Connexion = OpenNetworkConnection("www.newbiecontest.org", 80 ,#PB_Network_TCP)
If Connexion
  Header$ = GetHTTPHeader("http://www.newbiecontest.org")
  ;Header2$ = GetHTTPHeader("http://www.newbiecontest.org/epreuves/prog/frok-fichus_nb/prog_1.php")
  Repeat 
    Index+1
    Line$ = StringField(Header$, Index, #LF$)
    Debug Line$
  Until Line$ = "" 
EndIf
Avec Header$ j'obtiens bien l'entête avec un PHPSSID

Code : Tout sélectionner

HTTP/1.1 200 OK
Date: Mon, 25 Jul 2011 22:50:49 GMT
Server: Apache
x-Powered-By: PHP/5.2.6-1+lenny13
Set-Cookie: PHPSESSID=a53528f6939c316f63f2e96ff972f83f; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private
Pragma: no-Cache
Set-Cookie: admin=0; expires=Mon, 25-Jul-2011 23:50:49 GMT
Content-type: text/html
Si j'essaie avec le Header2$, ça ne me donne un header sans info de session.
Comment indiquer à la page prog_1.php que je suis tel membre avec tel PHPSSID

Je suis vraiment novice en connexion entre PB et les sites/serveurs web.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Syntax.error
Messages : 8
Inscription : mer. 13/juil./2011 16:42

Re: Se Logguer à un site, mémoriser le PHPSSID et envoyer pl

Message par Syntax.error »

Ar-S a écrit : Pour mon lien je fais :

Code : Tout sélectionner

InitNetwork()
Connexion = OpenNetworkConnection("www.newbiecontest.org", 80 ,#PB_Network_TCP)
If Connexion
  Header$ = GetHTTPHeader("http://www.newbiecontest.org")
  ;Header2$ = GetHTTPHeader("http://www.newbiecontest.org/epreuves/prog/frok-fichus_nb/prog_1.php")
  Repeat 
    Index+1
    Line$ = StringField(Header$, Index, #LF$)
    Debug Line$
  Until Line$ = "" 
EndIf
Comment indiquer à la page prog_1.php que je suis tel membre avec tel PHPSSID

J'ai fouillé un peu dans mes dossier pour retrouver le bot en question.. Ci joint un extrait qui pourrait te mettre sur la piste.
Je n'ai pas du tout de talent didactique, donc je nous épargne à tout les deux le calvaire d'une explication, mais si tu as des questions précises, n'hésite pas, je serai plus à l'aise pour répondre.

Cette procédure est appelée à la réception d'une page. Elle reçoit le header en argument.
A la fin, Set_Protocol s'occupe simplement d'ajouter les chaines de cookies sur une ligne du protocol.

Je ne sais pas si c'est valable pour tout les serveurs, mais celui avec qui j'ai appris à communiquer nécessitait qu'une dernière ligne, vierge, soit présente dans le protocol.

Et en cas de données POST attendues, il me fallait ajouter, après la ligne de cookies :
Une ligne vierge
"Content-Length: 70" << La taille du POST envoyé
Une ligne vierge
"user=nomuser&password=65cb8c6f48f5c65e451d4c194e8924ebe9f5ea5d" << Les données attendues en POST

Et c'est tout.

Code : Tout sélectionner

Procedure Set_Cookie(content$)
  
             If FindString( content$, "Set-Cookie",0 ) 
                
                  CreateRegularExpression( 0  , "Set-Cookie.+=.+;")
                  NbCook = ExtractRegularExpression( 0  , content$  , Result$()) ; Nombre de cookies.
                  
                    : Debug Str(NbCook-1) + " cookies "
                  
                  
                  
                   For Nb = 0 To NbCook-1 ; Pour chaque cookie, le remplace dans la chaine "Cookie$"
                     
                        Result$(Nb) = Right( Result$(Nb), Len( Result$(Nb))-12 )
                        Result$(Nb) = Left( Result$(Nb), FindString(Result$(Nb),";",0))
                        
                        Field$ = Result$(Nb)
                        
                        Index$ = Left( Field$, FindString( Field$, "=",0 )-1)
                        
                        Select Page
                            Case #Portal : Cookiis(Index$) = Mid( Field$,  FindString( Field$, "=",0 )  ) : Debug Cookiis(Index$)
                            Case #Game   : Cookies(Index$) = Mid( Field$,  FindString( Field$, "=",0 )  ) : Debug Cookies(Index$)
                        EndSelect
                        
                   Next
                   
                   
                   
                   Select Page  
                       
                       Case #Portal
                       Cookii$ = ""                    
                       ForEach Cookiis() : Cookii$ = Cookii$ + " " + MapKey( Cookiis() ) + Cookiis() : Next 
                       Cookii$ = Trim(Cookii$)
                       
                       Case #Game
                       Cookie$ = ""
                       ForEach Cookies() : Cookie$ = Cookie$ +" "+ MapKey( Cookies() ) + Cookies() : Next 
                       Cookie$ = Trim(Cookie$)
                       
                   EndSelect    
                      
             EndIf         
             
             
If OpenPreferences("Cookies.ini") : Debug "Ecriture des cookies sur le disque"
  
    WritePreferenceString ("Cookie", Cookie$ )
    WritePreferenceString ("Cookii", Cookii$ )

  ClosePreferences()
EndIf

Set_Protocol(cookii$+cookie$)
             
EndProcedure

Voilà, j'espère que ça t'aidera à avancer.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: Se Logguer à un site, mémoriser le PHPSSID et envoyer pl

Message par Geo Trouvpatou »

Salut Ar-S.

L'autre post que tu ne retrouves plus est peut-être celui-ci.

Je t"envoi directement sur mon post, où tu trouveras les sources à télécharger pour envoyer un message en devant te loguer auparavant et aller ensuite sur l'interface pour poster.

Cela fonctionne à merveille.

Et voici la solution finale, que je n'aime pas trop parce qu'il y a un petit lag d'une bonne seconde pour extirper le PHPSESSID.
Le post où je t'ai envoyé, on devait mettre le PHPSESSID manuellement (d'ailleurs je vais aller mettre aussi la solution là-bas).

Code : Tout sélectionner

XIncludeFile "__Lib_Post.pb"

InitNetwork()
Global cookieValeur$
Procedure SeLogguer()
      Protected test.HTTP_Query, string.s, readed.i, conn.i, time.i, position.i, string2$
      OpenConsole()
      
      HTTP_createQuery(@test, #HTTP_METHOD_POST, "/post/admin.php", "toto.fr")
      HTTP_addQueryHeader(@test, "User-Agent", "Mozilla/5.0")
      HTTP_addPostData(@test, "pass", "toto") ; On se loggue avec le mdp
      
      conn = HTTP_sendQuery(@test)
      
      
      string.s = Space(2048)
      time = ElapsedMilliseconds()
      Repeat
            If NetworkClientEvent(conn) = #PB_NetworkEvent_Data
                  readed = ReceiveNetworkData(conn, @string, 2048)
                  Print(Left(string, readed))
                  Debug Left(string, readed)
                  string2$ + Left(string, readed)
                  ;Debug string2$
                  time = ElapsedMilliseconds()
            EndIf
            Delay(100)
      Until ElapsedMilliseconds() - time >= 3000
      
      ; On recherche PHPSESSID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx pour passer ça à la procedure "EcrireEnAdmin()"
      position = FindString(string2$, "PHPSESSID=", 1)
      Debug "Position : "+ Str(position)
      
      cookieValeur$ = Mid(string2$, position, 10 + 32) ; 10 = "PHPSESSID=" et il y a toujours 32 caractères alpha/numérique dans 1 session
      Debug cookieValeur$
      
      Input()
EndProcedure


Procedure EcrireEnAdmin()
      Protected test.HTTP_Query, string.s, readed.i, conn.i, time.i
      OpenConsole()
      
      
      HTTP_createQuery(@test, #HTTP_METHOD_POST, "/post/ecrire_admin.php", "toto.fr")
      
      HTTP_addQueryHeader(@test, "User-Agent", "Mozilla/5.0")
      ;HTTP_addQueryHeader(@test, "Cookie", "PHPSESSID=a75b36c04a67a17bcc4cd6a706f94add")
      HTTP_addQueryHeader(@test, "Cookie", cookieValeur$)
      HTTP_addPostData(@test, "poster", "oui")
      HTTP_addPostData(@test, "message", "Un_message_de_France_c_est_super en Admin")
      
      conn = HTTP_sendQuery(@test)
      
      
      string.s = Space(2048)
      time = ElapsedMilliseconds()
      Repeat
            If NetworkClientEvent(conn) = #PB_NetworkEvent_Data
                  readed = ReceiveNetworkData(conn, @string, 2048)
                  Print(Left(string, readed))
                  time = ElapsedMilliseconds()
            EndIf
            Delay(100)
      Until ElapsedMilliseconds() - time >= 3000
      Input()
EndProcedure


SeLogguer()
EcrireEnAdmin()
[EDIT]Par exemple pour te loguer sur ton forum, le code devrait être celui-ci.
Si tu le teste tu verras que le PHPSESSID est bien récupéré.

Code : Tout sélectionner

Procedure SeLogguer()
      Protected test.HTTP_Query, string.s, readed.i, conn.i, time.i, position.i, string2$
      OpenConsole()
      
      HTTP_createQuery(@test, #HTTP_METHOD_POST, "/forums/index.php?action=login2", "www.newbiecontest.org")
      HTTP_addQueryHeader(@test, "User-Agent", "Mozilla/5.0")
      HTTP_addPostData(@test, "user", "xxxx") ; Ton user
      HTTP_addPostData(@test, "passwrd", "xxxx") ; Ton Mdp

      ; Et eventuellement si c'est obligatoire
      HTTP_addPostData(@test, "cookielength", "31536") ;
      HTTP_addPostData(@test, "cookieneverexp", "on") ;
      
      conn = HTTP_sendQuery(@test)

etc...
Et à partir de là, dans "EcrireEnAdmin()", il te suffirait de mettre le lien vers la page pour poster un message.
Mais ne vas pas écrire un bot qui va te permettre de mettre 100 messages par jour vers tes sites pornos préférés et en profiter pour faire de la pub pour tes sites perso, sinon je te balance à MicroSoft et on me donnera de l'argent pour ça :mrgreen:

Et j'allais oublier c'est lepiaf31 et Thyphoon qui ont écrit l'air de rien cette petite lib.
Et quand je pense que tu as posté le 1er, un commentaire, honte sur toi d'avoir perdu le fil de ce post.

Sur ce forum il y a un truc pas mal, c'est le lien en haut de page "Panneau de l’utilisateur" qui te permet de mettre des sujets en favoris et de savoir où tu as posté.
Ça permet de retrouver certains sujets de conversation.

Bye.
Répondre