Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] SQL Injection
-MPC User-
post
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
 
Start new topic
Odpowiedzi
IProSoft
post
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
Go to the top of the page
+Quote Post
greycoffey
post
Post #3





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
-MPC User-
post
Post #4





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
Post #5





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

Posty w temacie


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

 



RSS Aktualny czas: 25.12.2025 - 10:25