Web - Amazon

We provide Linux to the World


We support WINRAR [What is this] - [Download .exe file(s) for Windows]

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
SQL injection - Wikipedia, wolna encyklopedia

SQL injection

Z Wikipedii

SQL Injection (z ang., dosłownie zastrzyk SQL) - luka w zabezpieczeniach polegająca na nieodpowiednim filtrowaniu lub niedostatecznym typowaniu i późniejszym wykonaniu danych przesyłanych w postaci zapytań SQL do bazy danych. Podatne są na niego systemy złożone z warstwy programistycznej (przykładowo skrypt w PHP, ASP, JSP itp.) dynamicznie generującej zapytania do bazy danych (MySQL, PostgreSQL itp.). Wynika on zwykle z braku doświadczenia lub wyobraźni programisty.

Spis treści

[edytuj] Formy ataku SQL Injection

[edytuj] Niedostateczne filtrowanie danych

Ten typ ataków opiera się na nieodpowiednim filtrowaniu znaków ucieczki z danych wejściowych, co pozwala na przekazanie dodatkowych parametrów do zapytania.

Poniższy kod prezentuje ten problem (PHP):

$q = mysql_query("SELECT * FROM uzytkownicy WHERE uzytkownik = '$uzytkownik'");

Gdy użytkownik przekaże jako $uzytkownik wartość "kowalski", całe zapytanie przyjmie postać:

SELECT * FROM uzytkownicy WHERE uzytkownik = 'kowalski'

i będzie spełniało swoją funkcję. Jednak gdy złośliwy użytkownik przekaże wartość "x' OR '1'='1" to całe zapytanie będzie wyglądało:

SELECT * FROM uzytkownicy WHERE uzytkownik = 'x' OR '1'='1'

przez co pobierze z bazy danych wszystkie rekordy zamiast jednego wybranego.

Teoretycznie w ten sposób można przekazać każde zapytanie SQL, włącznie z wykonaniem kilku zapytań naraz. Jeżeli w powyższym przykładzie użytkownik przekaże

x';DROP TABLE uzytkownicy; SELECT * FROM data WHERE nazwa LIKE '%

to całe zapytanie przybierze postać

SELECT * FROM uzytkownicy WHERE uzytkownik = 'x';DROP TABLE uzytkownicy; SELECT * FROM dane WHERE nazwa LIKE '%'

co zaowocuje usunięciem tabeli "uzytkownicy" i pobraniem wszystkich danych z tabeli "dane".

Korzystając z ataku typu SQL Injection można również przeprowadzić atak typu DoS (odmowy usługi):

x' AND BENCHMARK(9999999,BENCHMARK(999999,BENCHMARK(999999,MD5(NOW())))=0 OR '1'='1

W tym przypadku serwer spróbuje obliczyć skrót MD5 dla aktualnego czasu 9999993 = 999997000002999999 (w zaokrągleniu trylion) razy .

[edytuj] "Ślepy" atak

O "ślepym" ataku (ang. Blind SQL Injection) mówi się w przypadku wykonywania ataku typu SQL Injection na stronie, która nie wyświetla komunikatów błędów. W tym przypadku badać można zmiany na stronie, przykładowo:

SELECT * FROM uzytkownicy WHERE uzytkownik='x' AND 1=2;

Powyższe zapytanie powinno nic nie zwrócić. Inaczej w przypadku wykonania poniższego zapytania:

SELECT * FROM uzytkownicy WHERE uzytkownik='x' AND 1=1;

Powyższe zapytanie powinno zawsze zwrócić jakikolwiek wynik, bowiem 1 jest równe 1. Badając zmiany zachodzące na stronie można stwierdzić czy w danym miejscu można dokonać ataku.

[edytuj] Błędy w serwerze SQL

Czasami błędy umożliwiające atak występują w samym serwerze SQL, jak było w przypadku funkcji real_escape_chars() z MySQL.

[edytuj] Zabezpieczanie przed atakiem

[edytuj] Zabezpieczanie na poziomie aplikacji

Podstawowym sposobem zabezpieczania przed SQL injection jest niedopuszczenie do nieuprawnionej zmiany wykonywanego zapytania.

W PHP można to zrobić, poprzez wykonanie na każdym tekstowym parametrze wykorzystywanym do budowy zapytania wbudowanej funkcji addslashes(), która dodaje backslash przed znakami, takimi jak ', " czy \, dzięki czemu znaki te nie są traktowane jak znaki specjalne. Dostępne są również funkcje specyficzne dla poszczególnych silników, takie jak np. oferowana przez serwer MySQL mysql_real_escape_string().

Analogiczną rolę w perlowym DBI pełni metoda DBI::quote, która, podobnie jak addslashes() z PHP dodaje znaki backslash przed potencjalnie niebezpiecznymi znakami. Przykład (zakładając, że $sql jest referencją do obiektu DBI):

$query = $sql->prepare("SELECT * FROM uzytkownicy where name = " . $sql->quote($uzytkownik));

Bezpieczniejszą techniką, niż wyżej wymienione odpowiednie przygotowanie parametrow jest użycie mechanizmu tzw. "zaślepek", gdzie zmienne nie są używane bezpośrednio do tworzenia zapytania, a odpowiednie dane dołączane są do zapytania w momencie jego wykonania (czy to poprzez wykorzystanie API danego silnika, czy też w ramach warstwy aplikacji poprzez odpowiednie zacytowanie wszystkich parametrów). Przykład w Perl DBI:

$query = $sql->prepare("select * from users where name = ?");
 $query->execute($user_name);

Jeżeli parametr zapytania ma być wartością liczbową można go po prostu rzutować na typ liczbowy lub użyć funkcji konwertujących z ciągu znaków na wartość liczbową.

Techniką utrudniającą wykorzystanie istniejących luk jest wyłączenie wyświetlania komunikatów o błedach. Nie uniemożliwi to ataku, lecz może spowodować, że trudniejsze będzie wykrycie i późniejsze wykorzystanie luki.

[edytuj] Zabezpieczenie na poziomie bazy danych

Istnieją również metody zabezpieczenia przed skutkami wykonania błędnych zapytań, które mimo wszystko dostaną się do bazy.

Udostępnienie użytkownikowi bazy tylko niezbędnych uprawnień nie da całkowitej ochrony, jednak pozwoli na minimalizację szkód. Przykładowo - niewiele aplikacji potrzebuje uprawnienia do kasowania tabel z bazy danych. Podobny efekt - czyli zmniejszenie możliwości atakującego - uzyskać można wyłączając niepotrzebną funkcjonalność na poziomie samego silnika.

Pomocą mogą służyć również procedury składowane, dzięki którym zapytanie budowane jest po stronie bazy danych i aplikacja nie ma bezpośredniego wpływu na jego postać. Chociaż, i w tym przypadku, skonstruowanie ataku nie jest niemożliwe.

Eliminację możliwości wstrzyknięcia kodu SQL, można uzyskać poprzez całkowite wyłączenie możliwości podawania parametrów jako części zapytania. Jest to działanie analogiczne do mechanizmu zaślepek po stronie aplikacji, jednak tym razem zastosowane w samym silniku. Nie jest to jednak ogólnie dostępna cecha systemów zarządzania bazami. W chwili obecnej, możliwość taką daje silnik H2.

[edytuj] Linki zewnętrzne

Our "Network":

Project Gutenberg
https://gutenberg.classicistranieri.com

Encyclopaedia Britannica 1911
https://encyclopaediabritannica.classicistranieri.com

Librivox Audiobooks
https://librivox.classicistranieri.com

Linux Distributions
https://old.classicistranieri.com

Magnatune (MP3 Music)
https://magnatune.classicistranieri.com

Static Wikipedia (June 2008)
https://wikipedia.classicistranieri.com

Static Wikipedia (March 2008)
https://wikipedia2007.classicistranieri.com/mar2008/

Static Wikipedia (2007)
https://wikipedia2007.classicistranieri.com

Static Wikipedia (2006)
https://wikipedia2006.classicistranieri.com

Liber Liber
https://liberliber.classicistranieri.com

ZIM Files for Kiwix
https://zim.classicistranieri.com


Other Websites:

Bach - Goldberg Variations
https://www.goldbergvariations.org

Lazarillo de Tormes
https://www.lazarillodetormes.org

Madame Bovary
https://www.madamebovary.org

Il Fu Mattia Pascal
https://www.mattiapascal.it

The Voice in the Desert
https://www.thevoiceinthedesert.org

Confessione d'un amore fascista
https://www.amorefascista.it

Malinverno
https://www.malinverno.org

Debito formativo
https://www.debitoformativo.it

Adina Spire
https://www.adinaspire.com