Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL инжекция - Използвайте заявка SELECT за АКТУАЛИЗИРАНЕ/ИЗТРИВАНЕ

Преди да отговорите директно на въпроса, си струва да се отбележи, че дори ако нападателят може да направи, е четене данни, които той не би трябвало да може, това е обикновено все още много лошо. Имайте предвид това, като използвате JOIN s и SELECT извеждане от системни таблици (като mysql.innodb_table_stats ), нападател, който започва с SELECT инжектиране и без други познания за вашата база данни може да картографира вашата схема и след това да ексфилтрира цялата информация, която имате в MySQL. За по-голямата част от бази данни и приложения, това вече представлява катастрофална дупка в сигурността.

Но за да отговоря директно на въпроса:има няколко начина, които знам за кое инжектиране в MySQL SELECT може да се използва за промяна на данни. За щастие всички те изискват разумно необичайни обстоятелства да са възможни. Всички примерни инжекции по-долу са дадени спрямо примерната заявка за инжектиране от въпроса:

SELECT id, name, message FROM messages WHERE id = $_GET['q']

1. „Натрупани“ или „групирани“ заявки.

Класическата техника на инжектиране на просто поставяне на цяло друго изявление след това, в което се инжектира. Както е предложено в друг отговор тук , можете да зададете $_GET['q'] до 1; DELETE FROM users; -- така че заявката формира два оператора, които се изпълняват последователно, вторият от които изтрива всичко в users таблица.

За смекчаване

Повечето MySQL конектори - по-специално включително PHP (оттеглени) mysql_* и (неостарял) mysqli_* функции - изобщо не поддържат подредени или групирани заявки, така че този вид атака просто не работи. Някои обаче правят - по-специално включващ PDO конектора на PHP (въпреки че поддръжката може да бъде деактивирана за повишаване на сигурността ).

2. Използване на дефинирани от потребителя функции

Функциите могат да бъдат извиквани от SELECT , и може да променя данните. Ако в базата данни е създадена функция за промяна на данни, можете да направите SELECT извикайте го, например чрез подаване на 0 OR SOME_FUNCTION_NAME() като стойността на $_GET['q'] .

За смекчаване

Повечето бази данни не съдържат никакви дефинирани от потребителя функции – да не говорим за такива за промяна на данни – и затова не предлагат изобщо възможност за извършване на подобен вид експлоатиране.

3. Писане във файлове

Както е описано в статията на Мухаймин Дзулфакар (донякъде самонадеяно назована) Разширена експлоатация на MySQL , можете да използвате INTO OUTFILE или INTO DUMPFILE клаузи на MySQL изберете за изхвърляне на резултата във файл. Тъй като с помощта на UNION , всеки произволен резултат може да бъде SELECT ed, това позволява писане на нови файлове с произволно съдържание на всяко място, на което потребителят изпълнява mysqld може да има достъп. Вероятно това може да се използва не само за модифициране на данни в базата данни MySQL, но и за получаване на достъп до обвивката до сървъра, на който се изпълнява – например чрез написване на PHP скрипт в уеб корена и след това отправяне на заявка към него, ако MySQL сървърът се хоства съвместно с PHP сървър.

За смекчаване

Много фактори намаляват практическата приложимост на тази иначе впечатляващо звучаща атака:

  • MySQL никога ви позволяват да използвате INTO OUTFILE или INTO DUMPFILE за да презапишете съществуващ файл, нито да запишете в папка, която не съществува. Това предотвратява атаки като създаване на .ssh папка с частен ключ в mysql домашната директория на потребителя и след това SSH влизане или презаписване на mysqld сам двоичен файл със злонамерена версия и чака рестартиране на сървъра.
  • Всеки полуприличен инсталационен пакет ще настрои специален потребител (обикновено с име mysql ), за да стартирате mysqld , и дайте на този потребител само много ограничени разрешения. Като такъв, той не би трябвало да може да пише в повечето местоположения във файловата система – и със сигурност не би трябвало да може да прави неща като запис в уеб корена на уеб приложение.
  • Модерните инсталации на MySQL идват с --secure-file-priv зададено по подразбиране, предотвратявайки записа на MySQL на друго място освен в определена директория за импортиране/експортиране на данни и по този начин прави тази атака почти напълно импотентна... освен ако собственикът на сървъра умишлено не я е деактивирал. За щастие, никой никога не би деактивирал напълно функция за защита като тази, тъй като това очевидно би било - о чакайте няма значение .

4. Извикване на sys_exec() функция от lib_mysqludf_sys за изпълнение на произволни команди на обвивката

Има разширение MySQL, наречено lib_mysqludf_sys това - съдейки по неговите звезди в GitHub и бързо търсене на Stack Overflow - има поне няколкостотин потребители. Той добавя функция, наречена sys_exec който изпълнява команди на обвивката. Както е отбелязано в #2, функциите могат да бъдат извиквани от SELECT; надявам се последствията са очевидни. За да цитирам от източника , тази функция "може да представлява опасност за сигурността" .

За смекчаване

Повечето системи нямат инсталирано това разширение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Presto еквивалент на MySQL group_concat

  2. Как да съхранявате повтарящи се дати, като имате предвид лятното часово време

  3. Намерете безплатна стая (система за резервации)

  4. Cronjob всяка минута

  5. не мога да запиша данни от 1 таблица в друга таблица