Loading:


[PHP, MySQL] SQL Injection w praktyce

1. Wstep
2. SQL Injection
3. Przyklady SQL Injection/ Rozwiazanie problemu
4. Zakonczenie

1. Wstep

Przed przystapieniem do czytania tego tekstu upewnij sie czy w pliku konfiguracyjnym PHP opcja magic_quotes_gpc jest ustawiona na `Off`

Coraz wiecej mlodych programistow PHP/MySQL postanawia tworzyc witryny internetowe oparte na PHP/MySQL nie zdajac sobie sprawy z niebezpieczensta, gdy robi sie to bez zastanowienia, oraz 'na slepo'. Mam na mysli robienie stron typu 'o juz wiem jak pobrac dane i jak zrobic system logowania'. Super, ze juz to potrafisz ale pomyslales ze piszac pierwsza aplikacje
powinienes ja zabezpieczyc ?

2. SQL Injection
SQL Injection (z ang., dosłownie zastrzyk SQL) - Jest to luka/blad powstaly podczas pisania skryptu PHP czy tez innych jezykow typu [ASP,JSP]. Z reguly takie bledy/luki powstaja przez brak doswiadczenia[czyt. wyobrazni] programistow.
Mowa tutaj o tak waznej filtracji danych pobieranych z formularzy, i np. wysylanych do bazy danych.
Dla przykladu, mamy sobie tabele uzytkownicy skad pobieramy potrzebne dane do zalogowania uzytkownika:

<?php
$name = $_POST['name'];
$a = mysql_query("SELECT * FROM uzytkownicy WHERE name = '$name'");
// Dalsza czesc kodu
?>

Taki oto kod, zwroci nam wszystkie dane (dzieki uzyciu * w zapytaniu) z tabeli 'uzytkownicy'. A teraz pomyslmy, jesli by tak odpowiednio spreparowac takie zapytanie, mozna by dostac wiele ciekawsze rezultaty, niz tylko
uzytkownik. Gdyby tak zamiast 'janek' w formularzu wpisac troszke przerobiona nazwe uzytkownika typu hackier' OR '1'='1' , wtedy otrzymamy wszystkie rekordy zamiast jednego wybranego.
Idac dalej, kolejnym powodem aby dobrze zabezpieczac zmienne jest mozliwosc wykonania oto takiego zapytania:
hackier'; DROP TABLE uzytkownicy; Zapewne domyslacie sie juz, ze spowodowalo by to usuniecie tabeli uzytkownicy, przez co moglibyscie stracic wiele cennych danych !

3. Przyklady SQL Injection / Rozwiazanie problemu

Zacznijmy od podstaw, czyli stworzymy baze danych, wgramy przykladowe dane i wykonamy skrypt rejestrujacy/logujacy sie do niej.

/* zapytanie Sql do stworzenia tabeli dla przykladu */

create table uzytkownicy (id int auto_increment primary key,
login varchar(15),haslo varchar(25), poziom varchar(5));
insert into uzytkownicy values (null,'wojtus','superhaslo','admin');
insert into uzytkownicy values (null,'arturek','jeszczelepszehaslo','admin');
insert into uzytkownicy values (null,'ktos','komp','user');


/* plik config.php */

<?php
$connect=mysql_connect('localhost','user','password') or die('Awaria bazy danych...');
mysql_select_db('przyklad');
?>


/* Plik index.php */

<h1>Witaj unknown user!</h1>

<a href="rejestruj.php">Zarejestruj sie!</a><br />
<a href="loguj.php">Zaloguj sie!</a><br />


/* Plik rejestruj.php */

 <?php


include('config.php');

if (isset($_POST['login'])){
  $query=mysql_query('
    insert into uzytkownicy values
               (null,''.$_POST['login'].'',''.$_POST['haslo'].'','user')')
    or die('Bledne zapytanie!');
 }
?>

  <h1>Zarejestruj sie!</h1>
  <form method="post">
  Login:<br>
      <input type="text" name="login"><br>

  Proponowane haslo:<br>
     <input type="text" name="haslo"><br>
      <input type="submit" value="Zarejestruj!">
  </form>



/* Plik loguj.php */

 <?php

 include('config.php');

if (isset($_POST['login'])){
  $query=mysql_query('
  select poziom from uzytkownicy
   where login=''.$_POST['login'].''
   and haslo=''.$_POST['haslo'].'' limit 1')
  or die('Bledne zapytanie!');
  $sql=mysql_fetch_assoc($query);
  if (!isset($sql['poziom']))
      echo('Bledny login lub haslo!
');
     
  elseif ($sql['poziom']=='admin')
    echo('Hello My Master ;-) ');
   
  else echo('Hello Normal User ;-( ');
 }
?>

  <h1>Zaloguj sie!</h1>
  <form method="post">

  Login:<br>
      <input type="text" name="login"><br>
  Proponowane haslo:<br>
     <input type="text" name="haslo"><br>
      <input type="submit" value="Zaloguj!">

  </form>

Ok, teraz przejdzmy do dzialania.
Wiec, najpierw zaloguj sie jako:

user: wojtus
haslo: superhaslo

Pojawi Ci sie mily komunikat: "Hello My Master ;-)";
Teraz zaloguj sie jako:

user: ktos
haslo: komp

Teraz pojawi sie komunikat: "Hello Normal User ;-(";

Jednak nie to jest celem tego artykulu, przejdzmy do sedna. Czyli jak teraz nadac naszemu uzytkownikowi range administratora ? Majac baze postaraj sie sam na to wpasc, jesli jednak nie potrafisz ponizej przedstawiam sposob ;-)
Tak wyglada zapytanie do bazy danych MySQL:
insert into uzytkownicy values(null,'login','haslo','user')
A powinno wygladac o tak:
insert into uzytkownicy values(null,'login','haslo','admin')
Patrzac na te zapytania do bazy danych, musimy zmienic ostatnia a zarazem najwazniejsza rzecz, czyli range jaka chcemy miec ;)
Robimy to w oto taki sposob:

1.Zarejestruj sie jako:
login: Twoj login [w moim przypadku bedzie to 'hakier']
Haslo musi byc odpowiednio spreparowane, czyli:
Haslo: haslo', 'admin')/*

2.Logujemy sie:
Login: hakier [ czy Wasz jaki podaliscie podczas rejestracji ;) ]
Haslo: haslo [ czy Wasze haslo jakie podaliscie podczas rejestracji ;) ]

3. Oto wynik!
Ku Twoim oczom ukazuje sie magiczny tekst: "Hello My Master ;-)".

To dla osob ktore odkryly luke w Twoim systemie bedzie chwila bardzo szczesliwa i radosna, ale dla Ciebie ?
Zapewne zadajesz sobie pytanie, jak sie przed tym teraz zabezpieczyc... i tu przychodza z pomoca:
- addslashes();
- stripslashes();
- htmlentities();
- strip_tags();
- htmlspecialchars();
- mysql_escape_string();

Musimy przefiltrowac dane pobierane z formularza dzieki funkcji addslashes, co spowoduje sie dodanie znakow '' przed danymi pobieranymi z formularzy, co spowoduje zatrzymanie wlasnie tego ataku ;-)
Zapewne zadawales sobie pytanie do czego sluzy magic_quotes_gpc czyz nie ?
Funkcja magic_quotes_gpc odpowiada za dodawanie/usuwanie znakow '' pobieranych z formularzy. Polecam sprawdzic na Waszym serwerze [domyslnie juz funkcja magic_quotes_gpc jest wlaczona] czy wlasnie ta funkcja jest zalaczona, nim ktos sie dobierze do Waszych skryptow :).

4. Zakonczenie
To bedzie na koniec w tym tekscie, i pamietajcie ze SQL Incjection to nie jedyny blad popelniany przez mlodych programistow. Mam nadzieje ze wykorzystacie moj artykul jako przestroge, i zaczniecie zwracac uwage na wieksze bezpieczenstwo aplikacji internetowych :).

Greetz: Blackhat, elwin013, Meal, and others ;)

Contact:
  >sapcik[at]webhat[dot]pl
  >http://webhat.pl



Napisz Artyku³

Listing

niema




Dodano przez: Sapcik Ranga: Poziom 1 Punktów:
Komentarze użytkowników
    • Tre¶æ komentarza
      Kod do komentarza (opcjonalnie)
      PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
      Autor
      Token
      token

       

       








funkcje.net
Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-2020 v.1.5 | design: diviXdesign & rainbowcolors