Преди да отговорите директно на въпроса, си струва да се отбележи, че дори ако нападателят може да направи, е четене данни, които той не би трябвало да може, това е обикновено все още много лошо. Имайте предвид това, като използвате 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
; надявам се последствията са очевидни. За да цитирам от източника
, тази функция "може да представлява опасност за сигурността" .
За смекчаване
Повечето системи нямат инсталирано това разширение.