Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] SQL Injection
Forum PHP.pl > Forum > Przedszkole
MPC User
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. ?>
IProSoft
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
MPC User
  1. $zap = "SELECT `cash` FROM `account` WHERE `id`='".(int)$_SESSION['id']."' LIMIT 1";


Może być?
greycoffey
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.
IProSoft
@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...
MPC User
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?
Rysh
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!
MPC User
Jak może zmienić zmienną która jest zdeklarowana wewnątrz skryptu?

Nawet jak dla mnie to dziwne ohno-smiley.gif
greycoffey
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.
d3ut3r
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.
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.