2010-11-22 10 views
32

Ktoś zhakował moją bazę danych i upuścił tabelę.Ktoś włamał się do mojej bazy danych - jak?

W mojej strony PHP istnieje jeden zapytanie gdzie używam mysql_real_escape_string:

$db_host="sql2.netsons.com"; 
$db_name="xxx"; 
$username="xxx"; 
$password="xxx";  

$db_con=mysql_connect($db_host,$username,$password);  

$connection_string=mysql_select_db($db_name); 
mysql_connect($db_host,$username,$password);  
mysql_set_charset('utf8',$db_con); 

$email= mysql_real_escape_string($_POST['email']); 
$name= mysql_real_escape_string($_POST['name']); 
$sex= mysql_real_escape_string($_POST['sex']);  

if($_POST['M']!=""){ $sim = 1; }else { $sim = 0; } 

$query = "INSERT INTO `users` (`email`, `name`, `sex`, `M`) VALUES 
('".$email."', '".ucwords(strtolower($name))."', '".$sex."','".$sim."')";  

$res = mysql_query($query) or die("Query fail: " . mysql_error()); 

mysql_close($db_con); 

I register_globals jest niepełnosprawnych.

Jak moja baza danych została zhackowana?

+7

http://stackoverflow.com/questions/1220182 –

+1

Jakiego zestawu znaków używa twoje połączenie? – cdhowie

+5

Spójrz na PDO i jej przygotowane oświadczenia. To zaoszczędziłoby Ci wiele czasu i bólów głowy. – jwueller

Odpowiedz

66

mysql_real_escape_string

Połączenie MySQL. Jeżeli identyfikator połączenia nie został podany, ostatnie ogniwo Otwarty przez mysql_connect() jest przyjęty.Jeśli takiego odnośnika nie zostanie znaleziony, spróbuje utworzyć taki, jakby mysql_connect() został wywołany bez argumentów.Jeśli nie znaleziono ani nie ustanowiono połączenia, generowany jest błąd poziomu E_WARNING.

Jak wyjaśniono tutaj: Does mysql_real_escape_string() FULLY protect against SQL injection?

Na podstawie fragmentu kodu połączenie dwukrotnie zostało połączone z bazą danych.

$db_con=mysql_connect($db_host,$username,$password);  

$connection_string=mysql_select_db($db_name); 
mysql_connect($db_host,$username,$password);  
mysql_set_charset('utf8',$db_con); 

I nie dostarczy identyfikator połączenia do bazy danych:

$email= mysql_real_escape_string($_POST['email']); 
$name= mysql_real_escape_string($_POST['name']); 
$sex= mysql_real_escape_string($_POST['sex']); 

Dlatego mysql_set_charset nie ma wpływu na prawdziwej ucieczki dostarczonego $_POST dla znaków multi-bajtów.

Sugestia

  • usunięcia drugiej mysql_connect($db_host,$username,$password);
  • wyraźnie dodać $db_con robiąc mysql_real_escape_string
+2

dude bardzo +1 dla objaśnień i linków –

+1

Aktualizacja październik 2013: mysql_real_escape_string został wycofany Użyj mysqli_real_escape_string() lub PDO :: quote() – pablofiumara

+0

Notatka dla potencjalnych czytelników. "Odpowiedź" nie wyjaśnia, w jaki sposób baza danych została zhackowana, ponieważ dla kodu podanego w OP nie można niczego wstrzyknąć.Żadne z kodowań wymienionych w połączonym poście nie są używane, a zatem używany jest domyślny latin1, oznacza to, że ten kod jest niewrażliwy na ataki. –

1

Na pierwszy rzut oka nie zostały żadne otwory do ataku sql injection. Czy ten fragment kodu jest bez wątpienia tym, w którym ma miejsce intruzja?

Jedyne co mogę podkręcić ten jest dwuznaczny zawiadomienie od dostawcy hostingu około ucwords: http://2by2host.com/articles/php-errors-faq/disabled_ucwords/

G

+0

Tak, właśnie dodałem cały powyższy kod PHP :) – xRobot

3

Może masz użytkownika MySQL ze słabym hasłem. Chciałbym zmienić wszystkie hasła i sprawdzić, kto jest uprawniony do połączenia się z bazą danych MySQL. Zablokować zaporę tak, że tylko niezbędne porty są otwarte (80,443?)

Oto kilka artykułów na temat blokowania kodu php http://www.addedbytes.com/writing-secure-php/

poważaniem. Asbjørn Morell

+2

Teraz dni, zdalny dostęp do MySQL jest domyślnie wyłączony, i zazwyczaj biały jest również wymieniony, chyba że masz nieczystego hosta. –

+0

'zdalny dostęp do MySQL jest domyślnie wyłączony' - czy może to usprawiedliwić? lub dostarczyć więcej informacji na ten temat? – ajreal

+0

Po zainstalowaniu serwera MySQL zdalny dostęp, tj. Logowanie z komputera innego niż serwer, na którym działa demon MySQL, zostanie wyłączony; oznacza to, że musisz to wyraźnie wyrazić. Więc nawet jeśli dana osoba ma nazwę użytkownika/hasło MySQL, nie będzie mogła z niej skorzystać i zalogować się, chyba że będzie w stanie wykonać kod na zdalnej maszynie; w takim przypadku bezpieczeństwo całego serwera jest całkowicie zagrożone ... Ponownie użyte hasła do MySQL, FTP i SSH są zupełnie inne, choć bardzo bliskie, ale nie mają nic wspólnego z bezpieczeństwem samego MySQL. –

2

Fakt, że baza danych została naruszona, nie oznacza, że ​​wystąpił iniekcję sql. Jeśli chcesz, możesz udostępnić dziennik dostępu, który powinien dostarczyć wystarczających wskazówek, jak miejsce, w którym wszedł atakujący. Domyślam się, że jest to lokalne włączanie plików, w którym zawarł plik konfiguracyjny lub może jakaś luka umożliwiająca wykonanie kodu. Bez większej ilości informacji to tylko zgadywanie, ale równie dobrze może to być dobra robota socjotechniczna lub atak phishingowy ...

+0

gdzie mogę zobaczyć logi dostępu? Mam Cpanel i współdzielony hosting :) – xRobot

+0

To bardzo zależy od wersji hosta i cpanela niestety. Często zdarza się, że znajdują się one w katalogu "logs" w twoim katalogu głównym; i zwykle dostęp przez cpanel jest również możliwy, poszukaj "informacji/dzienników serwera" itp. Jeśli nie możesz ich znaleźć, proponuję zapytać twojego dostawcę usług hostingowych. –

+0

Właśnie znajduję katalog logów dostępu i jest on pusty :( – xRobot

6

Nie wygląda na to, że wklejony kod zapewnia odpowiedni atak. Sposób, w jaki bym to zbadał, skanuje logi binarne MySQL dla odpowiedniej instrukcji DROP TABLE, aby podać mi znacznik czasu. Następnie możesz użyć tego znacznika czasu, aby wyszukać żądania Apache, które możesz z nim skorelować.

Wtedy to tylko przypadek starannie badanie kodu w każdej życzenie kandydata aż Nail go :(

0

myślę, odbywa się to poprzez php shell (backdoor). Czy to jest host udostępniania? jeśli tak, sprawdź, czy zaatakowana jest też inna witryna na tym samym serwerze, dzięki czemu możesz sprawdzić, czy napastnik trafia do Twojej witryny z Twojej okolicy. Aby zobaczyć strony internetowe na twoim serwerze, potrzebujesz odwrotnego skanowania IP.

Powiązane problemy