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

0xbro

Moderatore
24 Febbraio 2017
3,538
137
2,201
1,360
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
Reactions: Riky.exe

FabioC

Utente Iron
13 Settembre 2021
4
1
8
7
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

Moderatore
24 Febbraio 2017
3,538
137
2,201
1,360
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!
 
Aquarifoundation.com: Investi in un oceano pulito
Shiro is a big metin2 community server, 17.12.21