BezpieczenstwoXD.pl / Archiwum dla Dawid Lis

Dawid Lis

Industrial Remote Access Tool Ewon Cosy+ Narażony na Ataki z Dostępem Root

Cyberprzestępcy zaatakowali około 40 francuskich muzeów, w tym Grand Palais podczas olimpijskiego weekendu.

Czytaj dalej →

Google likwiduje kampanie wpływu związane z Chinami, Indonezją i Rosją

Awaria popularnej sieci komórkowej i wyszukiwarek: Brak połączeń i internetu mobilnego – Co się dzieje?

Czytaj dalej →

Luka w Azure Service Tags

W ostatnich dniach firma Check Point poinformowała o zauważonych przez nich próbach uzyskania nieuprawnionego dostępu do sieci korporacyjnych za pomocą komunikacji VPN, w tym między innymi na klientów tego producenta.

Czytaj dalej →

SQL Injection nie takie banalne jakby się to wydawało!

Praktyczny poradnik SQL Injection

Wstęp

SQL Injection (SQLi) to jedna z najbardziej niebezpiecznych i powszechnych technik ataku na aplikacje webowe, która pozwala atakującemu manipulować zapytaniami SQL do bazy danych. Temat wydawał się dla mnie bardzo łatwy i oczywisty. Trafiłem jednak na sytuację w której moja wiedza na temat tego rodzaju ataku nie była wystarczająca by poradzić sobie z rozwiązaniem pokoju. Zacząłem zgłębiać ten temat odświeżając swoje stare notatki i okazuję się że dowiedziałem się nowych rzeczy. Tak więc zachęcam do dalszej lektury, na pewno nie stracisz czasu a uzupełnisz swoją wiedzę!

Czym jest SQL Injection?

SQL Injection polega na wstrzyknięciu złośliwego kodu SQL do zapytania do bazy danych. Atakujący może to osiągnąć poprzez manipulację parametrami wejściowymi aplikacji webowej, które są następnie wstawiane do zapytań SQL bez odpowiedniego filtrowania lub zabezpieczenia. Skutkiem takiego ataku może być ujawnienie danych, modyfikacja danych, usunięcie danych, a w skrajnych przypadkach nawet pełna kontrola nad serwerem bazy danych.

Jakie są rodzaje SQL Injection? Dokładne omówienie

  • Error-based SQL Injection:
Opis

Error-Based SQL Injection polega na manipulacji zapytaniami SQL w taki sposób, aby powodować błędy w odpowiedziach bazy danych. Te błędy mogą zawierać informacje o strukturze bazy danych, takie jak nazwy tabel i kolumn.

Przykład: Jeśli aplikacja używa następującego zapytania SQL:

SELECT * FROM users WHERE id = $id;

a atakujący wprowadzi wartość 1', zapytanie zmieni się na:

SELECT * FROM users WHERE id = '1'';
  • Union-Based SQL Injection:
Opis

Union-Based SQL Injection polega na użyciu operatora UNION w celu łączenia wyników z wielu zapytań SQL. Atakujący może wykorzystać to do uzyskania dodatkowych informacji z bazy danych, takich jak inne tabele lub kolumny.

Przykład: Jeśli aplikacja używa następującego zapytania SQL:

SELECT name, email FROM users WHERE id = $id;

a atakujący wprowadzi wartość 1 UNION SELECT username, password FROM admin--, zapytanie zmieni się na:

SELECT name, email FROM users WHERE id = 1 UNION SELECT username, password FROM admin--;
  • Bolean-Based Blind SQL Injection
Opis

Blind SQL Injection występuje, gdy aplikacja nie zwraca bezpośrednio wyników zapytania SQL ani błędów. Atakujący muszą więc wnioskować o strukturze bazy danych na podstawie zmian w zachowaniu aplikacji.

a. Boolean-Based Blind SQL Injection

Opis: Polega na wysyłaniu zapytań SQL, które zwracają różne odpowiedzi prawda/fałsz w zależności od warunku. Atakujący może zadawać pytania bazie danych, na które odpowiedź to „tak” lub „nie”.

Przykład: Jeśli aplikacja używa następującego zapytania SQL:

SELECT * FROM users WHERE id = $id;

a atakujący wprowadzi wartość 1 AND 1=1, zapytanie zmieni się na:

SELECT * FROM users WHERE id = 1 AND 1=1;

Co jest zawsze prawdą i zwróci wynik.

Jeśli wprowadzi 1 AND 1=2, zapytanie zmieni się na:

SELECT * FROM users WHERE id = 1 AND 1=2;

Co jest zawsze fałszem i nie zwróci wyniku. Porównując odpowiedzi, atakujący może dowiedzieć się więcej o bazie danych.

b. Time-Based Blind SQL Injection

Opis: Polega na wysyłaniu zapytań SQL, które powodują opóźnienia w odpowiedzi bazy danych w zależności od warunku. Atakujący wnioskować na podstawie czasu odpowiedzi.

Przykład: Jeśli aplikacja używa następującego zapytania SQL:

SELECT * FROM users WHERE id = $id;

a atakujący wprowadzi wartość 1 AND IF(1=1, SLEEP(5), 0), zapytanie zmieni się na:

SELECT * FROM users WHERE id = 1 AND IF(1=1, SLEEP(5), 0);

Co spowoduje opóźnienie o 5 sekund, ponieważ warunek jest prawdziwy.

Jeśli wprowadzi 1 AND IF(1=2, SLEEP(5), 0), zapytanie zmieni się na:

SELECT * FROM users WHERE id = 1 AND IF(1=2, SLEEP(5), 0);

Co nie spowoduje opóźnienia, ponieważ warunek jest fałszywy. Analizując różnice w czasie odpowiedzi, atakujący może uzyskać informacje o bazie danych.

Jak wykryć SQL Injection?

Wykrywanie SQL Injection (SQLi) jest kluczowe dla zapewnienia bezpieczeństwa aplikacji webowych. Oto przystępne wyjaśnienie, jak wykryć SQL Injection, wraz z przykładami logów i wskazówkami, na co zwracać uwagę.

1. Analiza Logów Serwera

Opis: Logi serwera mogą zawierać cenne informacje o podejrzanych działaniach. Szukaj nietypowych wzorców, które mogą wskazywać na próby SQL Injection.

Przykłady Logów:

  1. Podejrzane Znaki i Sekwencje:
    • "SELECT * FROM users WHERE id = '1' OR '1'='1' --"
    • W logach można zauważyć wprowadzone znaki ', --, ;, które mogą wskazywać na próbę wstrzyknięcia SQL.
  2. Długie Zapytania:
    • id=1; DROP TABLE users; --
    • Długie i skomplikowane zapytania, zwłaszcza zawierające słowa kluczowe SQL, takie jak DROP, SELECT, UNION.

Na co zwracać uwagę:

  • Niezwykle długie ciągi znaków w polach wejściowych.
  • Specjalne znaki, takie jak ', --, ;, które są często używane w atakach SQL Injection.
  • Niespodziewane błędy serwera, które mogą wskazywać na błędy SQL.

2. Analiza Błędów Serwera

Opis: Błędy serwera mogą zawierać informacje o nieudanych próbach wstrzyknięcia SQL. Jeśli aplikacja zwraca komunikaty o błędach SQL, może to wskazywać na próbę ataku.

Przykłady Błędów:

  1. Typowy Błąd SQL:
    • 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 '1'' at line 1
    • Tego typu komunikaty mogą wskazywać na próbę wstrzyknięcia SQL.
  2. Błędy Łączenia Zapytania:
    • Unclosed quotation mark after the character string '';
    • Błędy wskazujące na problem z zamykaniem cudzysłowów.

Na co zwracać uwagę:

  • Błędy składni SQL w logach aplikacji.
  • Błędy związane z niezamkniętymi cudzysłowami lub nawiasami.
  • Błędy logiczne wynikające z nieprawidłowego formatu zapytania SQL.

3. Analiza Ruchu Sieciowego

Opis: Analiza ruchu sieciowego może ujawnić podejrzane zapytania wysyłane do serwera. Można to zrobić za pomocą narzędzi takich jak Wireshark, Burp Suite, czy inne narzędzia do analizy ruchu.

Przykłady:

  1. Podejrzane Żądania HTTP:
    • GET /user?id=1 OR 1=1 HTTP/1.1
    • Żądania zawierające SQL Injection payloady.
  2. Post Data:
    • POST /login HTTP/1.1: username=admin’–&password=12345
    • Dane POST zawierające podejrzane ciągi znaków.

Na co zwracać uwagę:

  • Żądania HTTP zawierające podejrzane ciągi znaków, takie jak ', --, ;, OR 1=1.
  • Dane POST zawierające długie lub podejrzane ciągi znaków.

4. Użycie Narzędzi Automatycznych

Opis: Istnieje wiele narzędzi, które mogą automatycznie skanować aplikacje pod kątem podatności na SQL Injection.

Przykłady Narzędzi:

  • SQLMap: Narzędzie do automatycznego testowania SQL Injection.
  • OWASP ZAP: Narzędzie do testowania bezpieczeństwa aplikacji webowych.

Przykład Użycia SQLMap:

sqlmap -u "http://example.com/user?id=1" --batch --dbs

Polecenie to skanuje podaną URL w poszukiwaniu podatności SQL Injection i wylistuje dostępne bazy danych, jeśli jest podatność.

5. Weryfikacja Wniosków

Opis: Testowanie aplikacji w środowisku testowym może pomóc w wykryciu podatności przed wdrożeniem na produkcję.

Przykład:

  1. Testowanie Ręczne:
    • Próbuj wprowadzać różne payloady, takie jak 1' OR '1'='1, aby sprawdzić, czy aplikacja jest podatna.
  2. Automatyczne Testowanie:
    • Użycie skryptów i narzędzi do automatycznego testowania różnych punktów wejścia w aplikacji.

Jak zabezpieczyć się przed SQL Injection?

1. Używaj Parametryzowanych Zapytania (Prepared Statements)

Opis: Parametryzowane zapytania pozwalają oddzielić kod SQL od danych, co uniemożliwia wstrzyknięcie złośliwego kodu.

Przykład w PHP (PDO):

$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $userInput]);
$user = $stmt->fetch();

Przykład w Python (SQLite):

import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_input,))
rows = cursor.fetchall()

2. Używaj ORM (Object-Relational Mapping)

Opis: ORM automatycznie mapuje obiekty w kodzie na rekordy w bazie danych, co redukuje potrzebę pisania surowych zapytań SQL.

Przykład w Django (Python):

from myapp.models import User

user = User.objects.get(id=user_input)

Przykład w Hibernate (Java):

User user = session.get(User.class, userId);

3. Walidacja i Filtrowanie Danych Wejściowych

Opis: Zawsze waliduj i filtruj dane wejściowe. Sprawdzaj, czy dane mają odpowiedni format i typ.

Przykład:

Walidacja numeru identyfikacyjnego:

if (!filter_var($userInput, FILTER_VALIDATE_INT)) {
    // Handle invalid input
}

Używanie bibliotek do walidacji:

from cerberus import Validator

schema = {'id': {'type': 'integer', 'min': 1}}
v = Validator(schema)
if not v.validate({'id': user_input}):
    # Handle invalid input

4. Używaj Praw Dostępu (Least Privilege)

Opis: Baza danych powinna mieć ograniczone prawa dostępu. Użytkownicy aplikacji powinni mieć tylko te uprawnienia, które są absolutnie niezbędne.

Przykład:

  • Użytkownik aplikacji może mieć prawa tylko do odczytu i zapisu, ale nie do usuwania tabel czy bazy danych.

5. Używaj Firewalli Aplikacji Webowych (WAF)

Opis: WAF to narzędzia, które chronią aplikacje webowe przed różnymi rodzajami ataków, w tym SQL Injection.

Przykład:

  • ModSecurity: Popularny WAF dla serwerów Apache.
  • Cloudflare: Dostarcza WAF jako część swojej usługi CDN.

6. Kodowanie Wyjścia (Output Encoding)

Opis: Kodowanie wyjścia pomaga zabezpieczyć aplikację przed atakami typu XSS, ale także może pomóc w unikaniu SQL Injection, zabezpieczając dane przed niechcianymi zmianami.

Przykład w PHP:

echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');

7. Używaj Bezpiecznych Funkcji Bazy Danych

Opis: Niektóre bazy danych oferują wbudowane funkcje bezpieczeństwa, które mogą pomóc w ochronie przed SQL Injection.

Przykład w MySQL:

  • Używaj funkcji mysql_real_escape_string w starszych aplikacjach, jeśli nie możesz użyć PDO lub MySQLi.

8. Regularnie Przeglądaj i Testuj Kod

Opis: Regularne przeglądanie kodu i testowanie aplikacji pod kątem bezpieczeństwa pomaga wykrywać i naprawiać potencjalne podatności.

Przykład:

  • Używaj narzędzi do automatycznego testowania bezpieczeństwa, takich jak OWASP ZAP czy SQLMap.
  • Przeprowadzaj pentesty (testy penetracyjne) regularnie.

9. Szkolenia i Edukacja

Opis: Zadbaj o to, aby zespół deweloperski był dobrze przeszkolony w zakresie najlepszych praktyk zabezpieczania aplikacji przed SQL Injection.

Przykład:

  • Organizuj szkolenia z bezpieczeństwa aplikacji webowych.
  • Udział w konferencjach i warsztatach na temat bezpieczeństwa IT.

10. Stosuj Mechanizmy Monitorowania i Alarmowania

Opis: Implementacja mechanizmów monitorowania i alarmowania pozwala na szybkie wykrywanie i reagowanie na próby ataków.

Przykład:

  • Implementacja logowania i monitorowania podejrzanych działań.
  • Używanie systemów SIEM (Security Information and Event Management) do analizowania logów i generowania alarmów.

Podsumowanie

Jak sami widzicie jest tego bardzo dużo a jeszcze nie jest to koniec! Tych aspektów w SQL Injection jest bardzo dużo ale też nie chciałem tego wszystko władować w jeden artykuł ponieważ nie byłby on czytelny. Moja propozycja jest taka, wy zostawiacie suba na kanale, piszecie do mnie na LI lub bezpieczenstwoxd@advatech.pl o treści „chcemy więcej sql injection”. Zobaczę jak duże będzie zainteresowanie tym tematem i przejdziemy sobie do konkretnych ataków, przeanalizuję dla Was przypadki cięższe!


Nowy film na kanale YouTube! Koniecznie sprawdź go!

Strony zachęcały odwiedzających do pobrania fałszywej aplikacji zawierającej nieznany wcześniej backdoor MaxMxShell reklamowane w Google

Czytaj dalej →

Obywatel Indii przyznał się do winy na kwotę 37 milionów dolarów!!!

Awaria popularnej sieci komórkowej i wyszukiwarek: Brak połączeń i internetu mobilnego – Co się dzieje?

Czytaj dalej →

Podatność PLUGScheduler w systemie Windows 10 umożliwia eskalację uprawnień

Awaria popularnej sieci komórkowej i wyszukiwarek: Brak połączeń i internetu mobilnego – Co się dzieje?

Czytaj dalej →

Google udostępnia szczegóły dotyczące przypadkowego usunięcia plików.

Awaria popularnej sieci komórkowej i wyszukiwarek: Brak połączeń i internetu mobilnego – Co się dzieje?

Czytaj dalej →

Awaria popularnej sieci komórkowej i wyszukiwarek: Brak połączeń i internetu mobilnego – Co się dzieje?

Awaria popularnej sieci komórkowej i wyszukiwarek: Brak połączeń i internetu mobilnego – Co się dzieje?

Czytaj dalej →

Ochrona commitów przed znanymi CVE za pomocą GitGuardian SCA i Git Hooks

Dropbox Inc. poinformował, że jego produkt do cyfrowych podpisów, Dropbox Sign, został naruszony przez hakerów, którzy uzyskali dostęp do informacji użytkowników, takich jak e-maile, nazwy użytkowników i numery telefonów.

Czytaj dalej →