2011-07-13 13 views
9

Surfowałem w te dni i dowiedziałem się o SQL INJECTION ATTACK. Próbowałem do wdrożenia na moim komputerze lokalnym, aby wiedzieć, w jaki sposób można to zrobić tak, że można temu zapobiec w moim systemie ...wstrzyknięcie php sql

Pisałem kod jak Kodeksu

PHP:

if(count($_POST) > 0){ 

     $con = mysql_connect("localhost","root","") or die(mysql_error()); 
    mysql_select_db('acelera',$con) or die(mysql_error()); // 
    echo $sql = 'SELECT * FROM acl_user WHERE user_email = "'.$_POST['email'].'" AND user_password = "'.$_POST['pass'].'"'; 
    $res_src = mysql_query($sql); 
    while($row = mysql_fetch_array($res_src)){ 
     echo "<pre>";print_r($row);echo "</pre>"; 
    } 
} 

kod HTML:

<html> 
<head></head> 
<body> 

EMAIL : <input type="text" name="email" id="email" /><br /> 
    PASWD : <input type="text" name="pass" id="pass" /><br /> 
    <input type="submit" name="btn_submit" value="submit email pass" /> 
     </body> 
</html> 

przez ten kod jeśli dam wejście jako " OR ""=" następnie sQL Injection powinna zrobić. , ale to nie działa poprawnie. w danych post mam dodatkowe ukośniki, jeśli daję powyższe dane wejściowe w polu hasła.

może ktoś mi pokazać jak faktycznie SQL Injection atak może być zrobione? (Kod będzie bardziej odczuwalny)

+0

> w danych pocztowych mam dodatkowe ukośniki. Spróbuj ustawić magic_qoutes_qpc na wyłączony – RiaD

Odpowiedz

9

Prawdopodobnie masz magiczne cytaty włączona. Sprawdź wartość zwracaną get_magic_quotes_gpc.

„Magiczne cytaty” jest antyk próba z PHP do auto-magicznie zapobiec SQL injection, ale w obecnej wersji została ona przestarzała i są zachęcani do korzystania prepared statements uniknąć SQL injection.

Zobacz here jak je wyłączyć, abyś mógł eksperymentować z iniekcją SQL.

-1

zastosowanie:

mysql_real_escape_string($_POST['thing']) 

Chciałbym również zasugerować używając PDO lub mysqli połączyć/zapytań do bazy danych. stare komendy mysql_ są throback'em do PHP3.

Oto dobre (ale uproszczone) wprowadzenie do jak SQL Injection działa poprzez PHP/MySQL: http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php

+0

Nie chce uniknąć zastrzyku, chce wiedzieć, jak wstrzyknąć swój system. – Vache

+0

Próbuje symulować iniekcję SQL, a nie jej zapobiegać;) – Jacob

+0

To jak zrobić zastrzyk, a nie jak temu zapobiec. – SynerCoder

1

Proponuję patrząc na Acunetix, lub coś podobnego i wolny jak to dodatek do Firefoksa:

https://addons.mozilla.org/en-US/firefox/addon/sql-injection/

To szybciej do testowania przeciwko SQL Zastrzyki, a także skanuje wszystkie formularze/być może metody SQLi, których nie byłeś świadomy. Acunetix rozszerza to i testuje RFI, XSS itp.

Używanie kodu nie jest wydajne.

1

SQL staramy się tworzyć powinna wyglądać następująco:

SELECT * FROM acl_user WHERE user_email = "[email protected]" Or 1=1; --" AND user_password = "" 

spróbuj wpisać:

[email protected]" Or 1=1; -- 

jak adres e-mail i hasło ignorować.

The - powoduje, że reszta instrukcji zostaje zignorowana.

Oto kilka dobrych informacji na ten temat: http://php.net/manual/en/security.database.sql-injection.php

+0

Co zrobisz z escaped quote char? :] – WASD42

+0

@DaveShaw Dlaczego 'Lub 1 = 1'? 'OR 1' miałby dokładnie taki sam efekt. –

2

Jak każdy już powiedział - prawdopodobnie masz magic quotes on. Chociaż jest tu pewna sztuczka: ta funkcja sprawia, że ​​SQL Injection jest trudniejszy w wykonaniu, ale nie jest całkowicie niemożliwy.

Ponadto nawet addslashes() nie może Ci w tym pomóc. Potencjalny napastnik może wypróbować wielobajtowe zestawy znaków i kilka innych sztuczek.

Oto dobry artykuł o tym: http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

Utrzymanie skrócie: jeśli używasz wielobajtowe znaki w środowisku jednobajtowych niektóre z nich staną się dwa single-bajtowych znaków - ukośniki, cytaty itp

1

go zmienić na: NOE jeśli wejście hasło jak coś lub 1 = 1 następnie spowoduje to zastrzyk

<?PHP if(count($_POST) > 0){ 

    $con = mysql_connect("localhost","root","") or die(mysql_error()); 
    mysql_select_db('acelera',$con) or die(mysql_error()); // 
    echo $sql = "SELECT * FROM acl_user WHERE user_email = ".$_POST['email']." AND user_password = ".$_POST['pass']; 
    $res_src = mysql_query($sql); 
    while($row = mysql_fetch_array($res_src)){ 
    echo "<pre>";print_r($row);echo "</pre>"; 
    } 
    } 
    ?> 


    <html> 
    <head></head> 
    <body> 
    <form action="" method="post"> 
    EMAIL : <input type="text" name="email" id="email" /><br /> 
    PASWD : <input type="text" name="pass" id="pass" /><br /> 
    <input type="submit" name="btn_submit" value="submit email pass" /> 
    </form> 
    </body> 
    </html> 
0

jak zapobiec SQL injection

1) Filtr wejściowy - przestań wierzyć użytkownikom: największe zagrożenie dla aplikacji pochodzi od użytkowników. Użytkownicy nie muszą być dobrze wychowani i posłuszni zgodnie z oczekiwaniami. Niektórzy użytkownicy mają naprawdę złe intencje, a niektórzy po prostu próbują sprawdzić swoje umiejętności hakerskie. Bez względu na to, jaki kod napiszesz, napisz go, korzystając z najlepszych praktyk i rozważ aspekty bezpieczeństwa. Sprawdź wszystkie pola w formularzu:

2) Użyj klas pakowania baz danych lub PDO - Pakowarka baz danych lub PDO (w PHP) może zmniejszyć ryzyko bezpośredniego dostępu wartości wejściowych do bazy danych. Gotowe wyciągi mogą być używane wraz z ChNP, jak pokazano poniżej.

http://www.itechnicalblog.com/what-is-a-sql-injection-and-how-to-fix-it/

Powiązane problemy