Iniezione SQL MySQL senza query impilate - cosa è effettivamente possibile senza influenzare la FS?

5

Sto esplorando una vulnerabilità in un sito Web PHP che è fondamentalmente pieno di iniezioni SQL. Con SQLMap, sono riuscito a scaricare tutte le tabelle e ottenere alcune informazioni di base (nome utente, nome DB, nome host, anche se sembra abbastanza inutile perché il server DB non è disponibile esternamente). Il mio obiettivo è modificare i dati in una tabella specifica, non menzionati nelle query SQL iniettabili. Ho provato l'opzione --db-shell di SQLmap, ma ho scoperto che non posso fare nulla oltre a SELECT perché la combinazione PHP + MySQL non consente query impilate.

Quindi la mia domanda. Dato uno dei seguenti frammenti:

mysql_query("SELECT * FROM sometable WHERE id=".$_GET['id']);
mysql_query("INSERT INTO sometable (id) VALUES (".$_GET['id'].")");
mysql_query("UPDATE sometable SET id= ".$_GET['id']);
mysql_query("DELETE FROM sometable WHERE id=".$_GET['id']);

Posso modificare (eliminare, inserire, aggiornare) dati dall'esterno di qualcosa, senza trucchi LOADFILE / INTO OUTFILE (e simili)? La sintassi MySQL mi consente di farlo in questo caso? Se la risposta è "dipende", come dovrebbe apparire la sintassi della query? Non sono un DBA su questo host. Non ci sono anche stored procedure sul sito web, solo alcune cose molto semplici e amatoriali che potresti imparare da un singolo libro che non menziona nemmeno la sicurezza.

    
posta d33tah 17.09.2013 - 16:18
fonte

3 risposte

1

Prima di tutto: non sono sicuro di aver capito la tua domanda, ma presumo che intendessi: Come posso influire sui dati esterni (la tabella su cui si riferiscono queste query)?

L'attacco più ovvio sarebbe stato l'inserimento di più query, ad es. "; delete from other_table" ma in questo caso sembra che tu non possa farlo.     mysql_query () invia una query univoca (più query non sono supportate)

Il che significa che sei bloccato con effetti collaterali - facendo cose all'interno della query originale. Sembra che per lo meno tu possa essere dirompente con le serrature: link in particolare, dovresti essere in grado di rendere la selezione un 'seleziona ... per l'aggiornamento';

Non riesco ancora a vedere un altro modo per influenzare le query specifiche che hai.

    
risposta data 13.12.2013 - 05:51
fonte
0

Ci ho giocato un po 'e non ho trovato alcun modo per fare ciò di cui stai parlando. È possibile che qualcuno che è più intelligente di me possa trovare un modo per farlo, ma per quanto posso dire che non può essere fatto.

    
risposta data 17.09.2013 - 19:54
fonte
-3

È molto meglio usare PHP Data Objects per le query sul livello di accesso ai dati. Questo eliminerà del tutto l'iniezione SQL; per non parlare del fatto che potresti voler diventare amichevole con il gruppo del sito web noto come OWASP.

Esempio:

// Declare & set variable

list ($db_dbdriver, $db_hostname, $db_database, $db_username, $db_password) = Connection::dbConnect();
// Set default timezone

date_default_timezone_set('America/Los_Angeles'); $my_success = false; $my_message = "";

try {

// Create & set connection

$db_options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'");

$conn = new PDO($db_dbdriver . ":host=" . $db_hostname . ";dbname=" . $db_database, $db_username, $db_password, $db_options);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// Prepare an SQL statement

$my_sql = 'INSERT INTO Message (Message_State, Message_Body, Message_CBy, Message_EBy) VALUES (:Message_State, :Message_Body, :Message_CBy, :Message_EBy)';

$stmt = $conn->prepare($my_sql); // Bind parameters to prevent SQL Injection.

$stmt->bindValue(':Message_State', $message_state);

$stmt->bindValue(':Message_Body', $message_body);

$stmt->bindValue(':Message_CBy', $message_cby);

$stmt->bindValue(':Message_EBy', $message_eby);

// Execute the SQL statement

$stmt->execute();

// Closes the cursor, enabling the statement to be executed again

$stmt->closeCursor();

// Close & unset the connection

$conn = null; unset($conn);

// Set success value to TRUE

$my_success = true; $my_message = "success";

} catch(PDOException $e) {

// Catch error message

$error_message = $e->getMessage();

// Append error message to error log

file_put_contents('../../log/error/php_errors.log', "\r\n" . date("Y-m-d h:i:s A") . ": data_access_layer -> my_class.php (class_name) -> Function_Name : " . $e->getMessage(), FILE_APPEND);

// Set success value to FALSE & return an error message

$my_success = false; $my_message = $error_message;

}

return array($my_success, $my_message);

    
risposta data 17.09.2013 - 20:55
fonte

Leggi altre domande sui tag