Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] SQL Injection
-MPC User-
post 11.06.2012, 19:05:25
Post #1





Goście







Jakiś user udostępnił skrypt na pewnym forum i część użytkowników twierdzi, że jest on podatny na SQLi.

Nie znam się na php, ale chciałbym wtłoczyć ten skrypt do pewnej strony, ale nie wiem czy jest on bezpieczny.

  1. <?php
  2. // by Smudzas-Design
  3.  
  4. $host = '';
  5. $user = '';
  6. $pass = '';
  7. $cena = 62; // cena pierwszego pierscionka
  8. $czas = 7; // dlugosc pierwszego pierscionka
  9.  
  10. mysql_connect($host, $user, $pass);
  11. mysql_select_db('account');
  12.  
  13. echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
  14.  
  15. $zap = "SELECT `cash` FROM `account` WHERE `id`='".$_SESSION['id']."' LIMIT 1";
  16.  
  17. if($_GET['akcja'] == 'pd'){
  18. if($_GET['dni'] == $czas){
  19. if($tab['cash'] < $cena){
  20. echo 'Masz zbyt mało Smoczych Monet<br>';
  21. }
  22. else{
  23. $data = date("Y-m-d H:i:s");
  24. $time = strtotime($data);
  25. $czasTrwania = 3600 * 24 * $czas;
  26. $nowaData = $time + $czasTrwania;
  27. $doKiedy = date("Y-m-d H:i:s", $nowaData);
  28.  
  29. $pd = mysql_query("UPDATE `account` SET `cash`=`cash`-".$cena.", `silver_expire`='".$doKiedy."' WHERE `id`='".$_SESSION['id']."'");
  30.  
  31. if($pd){
  32. echo 'Pomyślnie kupiłeś PD';
  33. }
  34. else{
  35. echo 'Błąd. Spróbuj ponownie';
  36. }
  37. }
  38. }
  39. elseif($_GET['dni'] == $czas*2){
  40. if($tab['cash'] < $cena*2){
  41. echo 'Masz zbyt mało Smoczych Monet';
  42. }
  43. else{
  44. $data = date("Y-m-d H:i:s");
  45. $time = strtotime($data);
  46. $czasTrwania = 3600 * 24 * $czas *2;
  47. $nowaData = $time + $czasTrwania;
  48. $doKiedy = date("Y-m-d H:i:s", $nowaData);
  49.  
  50. $pd = mysql_query("UPDATE `account` SET `cash`=`cash`-".$cena*2 .", `silver_expire`='".$doKiedy."' WHERE `id`='".$_SESSION['id']."'");
  51.  
  52. if($pd){
  53. echo 'Pomyślnie kupiłeś PD';
  54. }
  55. else{
  56. echo 'Błąd. Spróbuj ponownie';
  57. }
  58. }
  59. }
  60. elseif($_GET['dni'] == $czas*4){
  61. if($tab['cash'] < $cena*4){
  62. echo 'Masz zbyt mało Smoczych Monet';
  63. }
  64. else{
  65. $data = date("Y-m-d H:i:s");
  66. $time = strtotime($data);
  67. $czasTrwania = 3600 * 24 * $czas *4;
  68. $nowaData = $time + $czasTrwania;
  69. $doKiedy = date("Y-m-d H:i:s", $nowaData);
  70.  
  71. $pd = mysql_query("UPDATE `account` SET `cash`=`cash`-".$cena*4 .", `silver_expire`='".$doKiedy."' WHERE `id`='".$_SESSION['id']."'");
  72.  
  73. if($pd){
  74. echo 'Pomyślnie kupiłeś PD';
  75. }
  76. else{
  77. echo 'Błąd. Spróbuj ponownie';
  78. }
  79. }
  80. }
  81. else{
  82. echo '<a href="index.php?akcja=pd&dni='.$czas.'"><h1 style="text-align:center;">'.$czas.' dni ('.$cena.' SM)</h1></a>';
  83. echo '<a href="index.php?akcja=pd&dni='.$czas*2 .'"><h1 style="text-align:center;">'.$czas*2 .' dni ('.$cena*2 .' SM)</h1></a>';
  84. echo '<a href="index.php?akcja=pd&dni='.$czas*4 .'"><h1 style="text-align:center;">'.$czas*4 .' dni ('.$cena*4 .' SM)</h1></a>';
  85. }
  86. }
  87. else{
  88. echo '<a href="index.php?akcja=pd"><h1 style="text-align:center;">Kup pierścień expa</h1></a>';
  89. }
  90.  
  91. ?>
Go to the top of the page
+Quote Post
IProSoft
post 11.06.2012, 19:08:15
Post #2





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Zwróć uwagę na to zapytanie:
  1. $zap = "SELECT `cash` FROM `account` WHERE `id`='".$_SESSION['id']."' LIMIT 1";

A co jeśli potrafię spreparować $_SESSION['id'] ? Mogę wrzucić dowolny tekst, który nie zostanie wyczyszczony np mysql_escape_string


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
-MPC User-
post 11.06.2012, 19:13:11
Post #3





Goście







  1. $zap = "SELECT `cash` FROM `account` WHERE `id`='".(int)$_SESSION['id']."' LIMIT 1";


Może być?
Go to the top of the page
+Quote Post
greycoffey
post 11.06.2012, 19:57:01
Post #4





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Cytat(IProSoft @ 11.06.2012, 20:08:15 ) *
Zwróć uwagę na to zapytanie:
  1. $zap = "SELECT `cash` FROM `account` WHERE `id`='".$_SESSION['id']."' LIMIT 1";

A co jeśli potrafię spreparować $_SESSION['id'] ? Mogę wrzucić dowolny tekst, który nie zostanie wyczyszczony np mysql_escape_string

Proszę Cię, nie pogrążaj się.
Czy ludzie naprawdę nie mają pojęcia jak działają sesje?
Spreparowanie danych to atak typu Session Poisoning - ale ten atak może wystąpić tylko wtedy, kiedy programista pisze idiotyczny kod jak:
  1. $_SESSION[$_GET['key']]=$_GET['value'];


Co do skryptu (zakładam, że $cena może być zmieniona):
  1. UPDATE `account` SET `cash`=`cash`-".$cena.", `silver_expire`='".$doKiedy."' WHERE `id`='".$_SESSION['id']."'

Zagrożeniem jest cena, zobacz co się stanie gdy damy ujemną:
Kod
mysql> insert into abc values (5);
Query OK, 1 row affected (0.00 sec)

mysql> select * from abc;
+------+
| cena |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

mysql> update abc set cena=cena--5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from abc;
+------+
| cena |
+------+
|   10 |
+------+
1 row in set (0.00 sec)


Jeśli $czas można zmienić też, pewnie efektem niepożądanym byłby fakt, że silver_expire jest zmienione na inną wartośc niż zakładana.

Opisz dokładniej które dane są zmienne.
Go to the top of the page
+Quote Post
IProSoft
post 11.06.2012, 20:27:06
Post #5





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


@UP
a skąd pewnośc, że w ten sposób nie jest Tworzone ID? Może zaufać użytkownikowi...
To pierwszy błąd jaki rzucił mi się w oczy więc go o nim informuję, więc nie rzucaj odrazu miesem...


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
-MPC User-
post 11.06.2012, 20:46:28
Post #6





Goście







Cytat(greycoffey @ 11.06.2012, 19:57:01 ) *
Proszę Cię, nie pogrążaj się.
Czy ludzie naprawdę nie mają pojęcia jak działają sesje?
Spreparowanie danych to atak typu Session Poisoning - ale ten atak może wystąpić tylko wtedy, kiedy programista pisze idiotyczny kod jak:
  1. $_SESSION[$_GET['key']]=$_GET['value'];


Co do skryptu (zakładam, że $cena może być zmieniona):
  1. UPDATE `account` SET `cash`=`cash`-".$cena.", `silver_expire`='".$doKiedy."' WHERE `id`='".$_SESSION['id']."'

Zagrożeniem jest cena, zobacz co się stanie gdy damy ujemną:
Kod
mysql> insert into abc values (5);
Query OK, 1 row affected (0.00 sec)

mysql> select * from abc;
+------+
| cena |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

mysql> update abc set cena=cena--5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from abc;
+------+
| cena |
+------+
|   10 |
+------+
1 row in set (0.00 sec)


Jeśli $czas można zmienić też, pewnie efektem niepożądanym byłby fakt, że silver_expire jest zmienione na inną wartośc niż zakładana.

Opisz dokładniej które dane są zmienne.


Zadne dane nie są wprowadzane przez użytkownika i nie ma on do nich dostępu. Więc jak cena może być minusowa?
Go to the top of the page
+Quote Post
Rysh
post 11.06.2012, 20:48:40
Post #7





Grupa: Zarejestrowani
Postów: 821
Pomógł: 111
Dołączył: 11.09.2006
Skąd: Biała Podlaska

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


Cytat(MPC User @ 11.06.2012, 21:46:28 ) *
Zadne dane nie są wprowadzane przez użytkownika i nie ma on do nich dostępu. Więc jak cena może być minusowa?

Ja podchodzę do takiego wniosku, że dane powinny być zabezpieczone "na wszelki wypadek" przed zmianami. Czasem nam się wydaje, że czegoś użytkownik i tka nie może zmodyfikować, a przychodzi taki delikwent i to robi (świadomie lub nie). Zabezpieczenie skryptów PHP to podstawa!


--------------------
Go to the top of the page
+Quote Post
-MPC User-
post 11.06.2012, 21:31:33
Post #8





Goście







Jak może zmienić zmienną która jest zdeklarowana wewnątrz skryptu?

Nawet jak dla mnie to dziwne ohno-smiley.gif
Go to the top of the page
+Quote Post
greycoffey
post 12.06.2012, 15:34:08
Post #9





Grupa: Zarejestrowani
Postów: 320
Pomógł: 29
Dołączył: 3.04.2010

Ostrzeżenie: (20%)
X----


Cytat(IProSoft @ 11.06.2012, 21:27:06 ) *
@UP
a skąd pewnośc, że w ten sposób nie jest Tworzone ID? Może zaufać użytkownikowi...
To pierwszy błąd jaki rzucił mi się w oczy więc go o nim informuję, więc nie rzucaj odrazu miesem...

Co tutaj jest do ufania użytkownikowi? Zatrucie sesji jest możliwe tylko wtedy, kiedy programiasta pisze idiotyczny kod. Równie dobrze mozna powiedzieć "co *jeśli* potrafię uzyskać dostęp do serwera?".
Dane sesyjne nie są (tfu, nie powinny być) ustawiane wprost od użytkownika.

Jeśli ceny ani casu nie da się zmienić, to ten kawałek kodu jest w 100% bezpieczny.
Go to the top of the page
+Quote Post
d3ut3r
post 13.06.2012, 05:19:55
Post #10





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

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


można poczytać ciekawe rzeczy smile.gif

http://ha.xxor.se/2011/09/local-session-po...php-part-1.html

czyli generalnie i tak wszystko zależy, od konfiguracji serwera. Zatrucie sesji jest możliwe tylko gdy serwer nie jest odpowiednio skonfigurowany wówczas skrypt taki jaki przedstawił autor może sprawić problemy. Osobiście nie ufam żadnym zmiennym (to że teraz atak jest nie możliwy nie znaczy, że za 3 dni nie będzie nowej luki) tym bardziej jeżeli potrzebuje inta to zwykłe rzutowanie w zupełności wystarcza.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post

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 Aktualny czas: 18.08.2025 - 23:51