PHP PHP cURL -> POST

Albymaster

Utente Emerald
18 Giugno 2010
719
171
94
497
Ultima modifica:
Ciao a tutti ragazzi, sto facendo un progetto nella quale l'utilizzatore deve fornire un url di una determinata pagina e il mio codice dovrà fare la POST o la GET della form presente all'interno della pagina( se presente ovviamente). Per quanto riguarda la get non ho alcun problema infatti funziona bene il mio codice. Per quanto riguarda la POST, in sostanza utilizzando un parser vado a selezionare tutti gli elementi presenti all'interno del tag form e li completo in modo random per poi rimandarli attraverso la cURL alla pagina specificata.
Il problema è che il mio codice in molte pagine funziona e in altre no, mi sono imbattuto in una pagina dove non capisco perchè non funziona.

Codice CURL
PHP:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_post);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dati_post);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

Per quanto riguarda la variabile $url_post = (host url fornito all'inizio ) + (form action) . Nel mio caso sto provando questo sito
$dati_post :
  • 'qs' => 'qualsiasi cosa'
  • 'Submit2' => 'Cerca'
Se provo ad utilizzare https://www.codepunker.com/tools/http-requests , inserendo gli stessi dati che vi ho specificato sopra la POST funziona perfettamente, se lo faccio con la mia cURL non funziona e non riesco a capire perchè considerando che dovrebbero fare la medesima cosa.

PS : Ho modificato i dati perchè l'url che avevo scritto prima è andato offline non so perchè.
 
Su che ambiente esegui PHP? Non hai trovato messaggi d'errore nei log?
Si può avere poi uno snapshot della variabile $dati_post nel passo precedente a "$ch = curl_init()"?
(i.e. "var_dump($dati_post)")

Nota che se $url_post è static string allora bisogna passarla come primo argomento al costruttore visto che curl_setopt() riscontra problemi con questo tipo di dati.


Poi non credo sia questo l'"errore fatale", ma non ha molto senso che un URI abbia allegate variabili GET se è un identificatore di uno script a cui si vogliono mandare richieste POST.
 
Ultima modifica:
Su che ambiente esegui PHP? Non hai trovato messaggi d'errore nei log?
Si può avere poi uno snapshot della variabile $dati_post nel passo precedente a "$ch = curl_init()"?
(i.e. "var_dump($dati_post)")

Nota che se $url_post è static string allora bisogna passarla come primo argomento al costruttore visto che curl_setopt() riscontra problemi con questo tipo di dati.



Poi non credo sia questo l'"errore fatale", ma non ha molto senso che un URI abbia allegate variabili GET se è un identificatore di uno script a cui si vogliono mandare richieste POST.
Scusami che vedo solo ora la risposta.
Per il PHP uso XAMPP e non mi da nessun errore
Ti metto il codice di come è composta la mia funzione da cui ottengo dati post :
PHP:
if (($html->find('form[method=post],form[method=POST]'))!=NULL) {
     foreach ($html->find('form[method=post],form[method=POST]') as $forms_post) {
      $n_formPOST++;
      $formPOST_action = $forms_post->action;
       foreach ($forms_post->find('input') as $input) {
         if ($input->type == 'text') {
           $dati_testo[$input->name] = "script";
         } else if ($input->type == 'email' || $input->name == 'email') {
           $dati_random[$input->name] = "[email protected]";
         } else if ($input->type == 'hidden') {
           $dati_random[$input->name] = $input->value;
         } else {
           $dati_random[$input->name] = "random";
         }
       }
       foreach ($forms_post->find('textarea') as $textarea) {
         if ($textarea->disabled != true) {
           $dati_testo[$textarea->name] = "script";
         }
       }
       foreach ($forms_post->find('button') as $bottone) {
         if ($bottone->type == 'submit') {
           $dati_random[$bottone->name] = "random";
         }
       }
       $url_post = $url_nopath.$formPOST_action;
       if (!empty($dati_testo)) {
         //foreach ($scripts as $script => $valore_script) {
         foreach ($dati_testo as $dato_testo => $value) {
           if ($attacco_riuscito_post == false) {
             $input_script[$dato_testo] = $scripts;
             //In base a ogni script faccio un tentativo di POST
             $dati_p = array_merge($input_script, $dati_random);
             foreach($dati_p as $key => $value){
               $dati_post[] = $key."=".$value;
             }
             $dati_post_string = implode ('&', $dati_post);

Premetto che ho provato anche senza fare l'ultimo foreach e l'implode, nel senso ho provato solo a fare il merge di due array e non funzionava lo stesso.

Io allego le variabili GET solo per il fatto che su questi siti se non aggiungevo anche quella parte nell'URI non mi funzionava la POST, ovvero non completava la form come se mancassero dei dati..

PS : quella parte che aggiungo nell'URI è solo la action della form
 
Scusami che vedo solo ora la risposta.
Per il PHP uso XAMPP e non mi da nessun errore
Ti metto il codice di come è composta la mia funzione da cui ottengo dati post :
PHP:
if (($html->find('form[method=post],form[method=POST]'))!=NULL) {
     foreach ($html->find('form[method=post],form[method=POST]') as $forms_post) {
      $n_formPOST++;
      $formPOST_action = $forms_post->action;
       foreach ($forms_post->find('input') as $input) {
         if ($input->type == 'text') {
           $dati_testo[$input->name] = "script";
         } else if ($input->type == 'email' || $input->name == 'email') {
           $dati_random[$input->name] = "[email protected]";
         } else if ($input->type == 'hidden') {
           $dati_random[$input->name] = $input->value;
         } else {
           $dati_random[$input->name] = "random";
         }
       }
       foreach ($forms_post->find('textarea') as $textarea) {
         if ($textarea->disabled != true) {
           $dati_testo[$textarea->name] = "script";
         }
       }
       foreach ($forms_post->find('button') as $bottone) {
         if ($bottone->type == 'submit') {
           $dati_random[$bottone->name] = "random";
         }
       }
       $url_post = $url_nopath.$formPOST_action;
       if (!empty($dati_testo)) {
         //foreach ($scripts as $script => $valore_script) {
         foreach ($dati_testo as $dato_testo => $value) {
           if ($attacco_riuscito_post == false) {
             $input_script[$dato_testo] = $scripts;
             //In base a ogni script faccio un tentativo di POST
             $dati_p = array_merge($input_script, $dati_random);
             foreach($dati_p as $key => $value){
               $dati_post[] = $key."=".$value;
             }
             $dati_post_string = implode ('&', $dati_post);

Premetto che ho provato anche senza fare l'ultimo foreach e l'implode, nel senso ho provato solo a fare il merge di due array e non funzionava lo stesso.

Io allego le variabili GET solo per il fatto che su questi siti se non aggiungevo anche quella parte nell'URI non mi funzionava la POST, ovvero non completava la form come se mancassero dei dati..

PS : quella parte che aggiungo nell'URI è solo la action della form

Aggiungerei un paio di righe per orientarci nel debug:

PHP:
#[...]
curl_setopt($ch, CURLOPT_POSTFIELDS, $dati_post);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if( curl_errno($ch) ) 
{ 
      var_dump($dati_post); 
      echo '<br />Curl error n.' .curl_errno($ch). ': ' .curl_error($ch); 
}
curl_close($ch);
#[...]
Referenze:

Dopo aver aggiunto le righe tra `$result =curl_exec($ch)` e `curl_close($ch)` prova lo script con richiesta POST su quella pagina - dove non si capisce perché non funziona, per intenderci - e magari posta uno screenshot dell'output.
 
Aggiungerei un paio di righe per orientarci nel debug:

PHP:
#[...]
curl_setopt($ch, CURLOPT_POSTFIELDS, $dati_post);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if( curl_errno($ch) )
{
      var_dump($dati_post);
      echo '<br />Curl error n.' .curl_errno($ch). ': ' .curl_error($ch);
}
curl_close($ch);
#[...]
Referenze:

Dopo aver aggiunto le righe tra `$result =curl_exec($ch)` e `curl_close($ch)` prova lo script con richiesta POST su quella pagina - dove non si capisce perché non funziona, per intenderci - e magari posta uno screenshot dell'output.

Se vuoi https://github.com/AlbysProject/XSS-BruteForce questo è il mio progetto.
curl_exec e curl_close ovviamente ci sono, ma non nello spezzone di codice che vi avevo incollato.

Come output mi ritorna la stessa pagina che gli ho passato, ovvero quella dove c'è la form. Come se non fosse riuscito a fare il submit della form.
Il punto è che con i vari "print_r" e "echo" ho stampato i valori più volte per controllarli. Una volta ho persino preso i miei dati e li ho provati su
https://www.codepunker.com/tools/http-requests e la richiesta POST è andata a buon fine ritornando la pagina che vorrei ritornasse a me