Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][PHP] Ataki SQL
Forum PHP.pl > Forum > Przedszkole
Xart
Witam tak się ostatnio zastanawiam bo mam pewien niby przestarzały, banalny skrypt do logowania w którym nie ma filtrowania danych ale itak wydaje mi się że nie dałoby się zalogować na admina bez hasła biggrin.gif

Wygląda on tak:

  1. <?
  2. include("config.php");
  3.  
  4. $login=$_POST['USRlogin'];
  5. $haslo=$_POST['USRhaslo'];
  6.  
  7. $wynik = mysql_query("SELECT * FROM users WHERE login='".$login."'") or die("<center>błąd w pytaniu</center>");
  8. $rekord = mysql_fetch_assoc($wynik);
  9. if(md5($haslo)==$rekord['haslo']){
  10. $log=md5("zalogowanyOKzalogowany");
  11. $news=$rekord['news'];
  12. $page=$rekord['page'];
  13. $zmiany=$rekord['zmiany'];
  14. session_register('zmiany');
  15. $user=$rekord['user'];
  16. $galeria=$rekord['galeria'];
  17. session_register('galeria');
  18. ?>
  19. <frameset cols="175px,*">
  20. <frame src="menu.php"/>
  21. <frame src="pusty.html" name='okno'/>
  22. </frameset>
  23. <?
  24. }else{
  25. header("Location: index.php");
  26. };
  27. ?>


Atak na zmiane zapytania odpada bo nic nie wniesie.
union select nic nie zrobi bo dane nie są nigdzie wyświetlane
zakomentować w kodzie nie ma zbytnio czego bo tylko pobiera użytkownika
wyświetlenia niczego też nie ma jak dokleić...
za hasło nie można podać żadnego kodu bo if(md5($haslo)==$rekord['haslo']) zakoduje go na md5

Ogólnie chyba nic się z tym nie da zrobić... Nie ma żadnego sposobu obejścia. Czyżby to if(md5($haslo)==$rekord['haslo']) było lepszym rozwiązaniem od filtrowania ITP ?
Macie jakieś pomysły na obejście tego mhm ?
Turson
Wpisz jako login
Cytat
admin'
Xart
A co to ma niby dać hehe ?
Pobierze Ci dane z admina ale nigdzie ich nie wyświetla smile.gif
Wtedy zapytanie będzie takie:

  1. $wynik = mysql_query("SELECT * FROM users WHERE login='admin''") or die("<center>błąd w pytaniu</center>");


co zresztą wyświetli błąd bo się zrobiło ''" ....

wyświetla błąd w pytaniu czyli die
by_ikar
A da to dokładnie całą możliwość wpisania innego zapytania, np update, gdzie w pole loginu wpisujesz:

Kod
admin'; UPDATE uzytkownicy SET haslo=md5("nowehaslo") WHERE login='admin


Jeżeli wywali błąd, znaczy ze niepoprawna nazwa tabeli, lub kolumny hasło, wystarczy próbować aż się trafi na nazwę tabeli i nazwę kolumny. W ten sposób mogę podmienić twoje hasło i się zalogować jako administrator.

O wszelkiego rodzaju drop table czy innych możliwościach nie wspomnę, bo tutaj ogranicza nas tylko nasza wiedza albo uprawnienia usera który łączy się do mysql. Bo jest to klasyczny błąd.

Tutaj możesz poczytać jak się przed tym chronić: Temat: SQL Injection Insertion

PS. jeżeli przy logowaniu masz takiego babola, podejrzewam że cała strona jest dziurawa jak sito, i lepiej nie podawaj linku, i zrób sobie kopię zapasową póki jeszcze możesz i jak najszybciej popraw te błędy.
Xart
@UP
No i myliłeś się zrobiłem test i zgodnie ze strukturą bazy wpisałem zapytanie

i wywala die czyli błąd w pytaniu...

myślę, że w postgreSQL by przeszło ale mysql nie dopuści takiego kodu

  1. mysql_query("SELECT * FROM users WHERE login='admin'; UPDATE `users` SET `haslo`='test' WHERE login='admin'")


trzeba by było zakomentować pierwszą część zapytania smile.gif
ZaXaZ
Cytat(Xart @ 27.04.2014, 11:12:47 ) *
trzeba by było zakomentować pierwszą część zapytania smile.gif

nie koniecznie, ale za to w jakimś dziurawym update już jest injection ;p, może z (UNION by się coś dało)
Xart
@UP

Nie union tu nic nie pomoże bo nie ma gdzie wyświetlić tego wink.gif
ZaXaZ
Cytat(Xart @ 27.04.2014, 11:31:04 ) *
Nie union tu nic nie pomoże bo nie ma gdzie wyświetlić tego wink.gif

Cytat
login='admin'; UPDATE

a jak z tym średnikiem? bo to kończy zapytanie SQL
kr5
mysql_query() nie wspiera wykonywania wielu zapytań na raz, zatem trik ze średnikiem nie zadziała.

http://pl1.php.net/manual/en/function.mysql-query.php
Cytat(php.net)
mysql_query() sends a unique query (multiple queries are not supported) (...)
by_ikar
Kod
admin' AND (UPDATE users SET haslo=md5("nowehaslo") WHERE login="admin") > '0


DIE może wywalać w momencie kiedy nazwa tabeli (uzytkownicy) jest niepoprawna, lub nazwa kolumny (haslo) jest niepoprawna (o czym wcześniej napisałem). Podmień na takie które masz u siebie w bazie danych.

http://forum.php.pl/index.php?showtopic=226103 BTW ty tak na serio?
Kshyhoo
Po co odkrywać koło na nowo? Temat raz poruszyłeś a teraz wykopujesz na nowo. MySQL jest podatne, więc należy przesiąść się na coś bezpieczniejszego. Zresztą, będzie wymagała tego samo PHP, które nie będzie współpracować w nowych wersjach.
Ponownie piszę: jest przyklejony wątek o SQL-Injection.

No i ten kod na ramkach...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.