СКЛ Ињецтион је безбедносни недостатак у веб апликацијама где нападачи убацују штетан СКЛ код путем корисничког уноса. Ово им може омогућити да приступе садржају базе података о промени осетљивих података или чак да преузму контролу над системом. Важно је знати о СКЛ ињекцији да би веб апликације биле безбедне.
СКЛ Ињецтион (СКЛи) је безбедносна рањивост која се јавља када нападач може да манипулише упитима базе података веб апликације уметањем злонамерног СКЛ кода у поља за унос корисника. Ови убачени упити могу да манипулишу основном базом података да би преузели модификоване или обрисане осетљиве податке. У неким случајевима нападачи могу чак да ескалирају привилегије и добију пуну контролу над базом података или сервером.

Пример из стварног света:
У 2019. дошло је до повреде података Цапитал Оне због погрешно конфигурисане веб апликације која је омогућила нападачу да искористи рањивост СКЛ ињекције. Ово је резултирало цурењем личних података преко 100 милиона купаца, укључујући имена адреса и кредитне резултате.
Ниво безбедности СКЛ ињекције
ДВВА обезбеђује четири безбедносна нивоа за СКЛ Ињецтион како би помогао ученицима да виде како различите заштите утичу на нападе:
1. Ниска сигурност
Апликација узима ваш унос и директно га ставља у СКЛ упит без филтрирања.
$id = $_GET['id'];$query = 'SELECT first_name last_name FROM users WHERE user_id = '$id';';- Улазак
':Разбија упит и чини да база података избаци грешку откривајући да је рањива. - Улазак
1' OR '1'='1:Превари упит да увек буде истинит тако да се сви корисници враћају. - Улазак
1' UNION SELECT user password FROM users--:Придружује се другом упиту за преузимање скривених података као што су корисничка имена и лозинке.
2. Средње обезбеђење
Апликација примењује основну дезинфекцију уноса користећи функције као што суaddslashes()да побегне'.
$id = addslashes($_GET['id']);$query = 'SELECT first_name last_name FROM users WHERE user_id = '$id';';Како може бити напад:
Једноставна'ињекција више неће радити (јер постаје').
Али нападачи и даље могу да заобиђу коришћењем нумеричке ињекције (пошто бројевима нису потребни наводници).
Пример:
миливецрицкет.ин
1 OR 1=1Ово и даље враћа све записе.
3. Висока безбедност
Апликација користи припремљене изјаве (параметризоване упите) за безбедно руковање корисничким уносом.
$stmt = $pdo->prepare('SELECT first_name last_name FROM users WHERE user_id = ?');$stmt->execute([$id]);напад:
Покушаји као' OR 1=1илиUNION SELECTвише не раде.
Упит третира сав унос као податке, а не као СКЛ код.
Врсте СКЛ ињекције
Постоје различите врсте СКЛ ињекције
1. СКЛ ињекција заснована на грешци
СКЛ ињекција заснована на грешци је врста унутарпојасне СКЛ ињекције где нападач намерно изазива да база података генерише поруку о грешци. Нападач затим анализира ову поруку о грешци да би добио драгоцене информације о структури базе података, као што су имена табела и колона, које се могу користити за даље прецизније нападе.
Како то ради
Овај напад циља на апликације које откривају сирове грешке базе података уместо да приказују генеричке поруке. Убацивањем злонамерног уноса који крши СКЛ синтаксу, нападачи покрећу ове грешке и добијају драгоцене назнаке о структури базе података.
спринг инитиализр
- Идентификујте рањив унос: Нападач проналази поље за унос као што је трака за претрагу или УРЛ параметар који директно ступа у интеракцију са базом података без одговарајуће санације уноса.
- Убаците злонамерно оптерећење: Нападач убацује посебан знак (попут једног наводника
') или функција за коју се зна да узрокује грешку у бази података. - Анализирајте грешку: База података која не може да обради неисправан упит враћа детаљну поруку о грешци. Ова порука може открити кључне информације као што су:
- Систем базе података (нпр. МиСКЛ Орацле СКЛ Сервер).
- Верзија базе података.
- Комплетан СКЛ упит се извршава.
- Специфичне синтаксичке грешке које се могу користити за разумевање имена табела или колона.
- Прецизирајте напад: Користећи информације прикупљене из поруке о грешци, нападач може прецизирати свој терет како би извукао више података као што су корисничка имена и лозинке.
Пример:
Корак 1: Подесите своје окружење
- Покрените ДВВА. Обично му се приступа навигацијом до УРЛ-а као што је
http://localhost/dvwaу вашем претраживачу.
- Пријавите се на ДВВА са подразумеваним акредитивима:
admin/password.
- Идите на картицу ДВВА Сецурити и подесите ниво безбедности на низак. Ово ће осигурати да се рањивости лако искоришћавају.
Корак 2: Идентификујте рањивост
Страница СКЛ Ињецтион има једноставан оквир за унос у који можете да унесете кориснички ИД. Позадински упит је вероватно нешто попутSELECT * FROM users WHERE id = 'user_input'
- Унесите важећи ИД као
1у поље за унос и кликните на „Пошаљи“. Требало би да видите детаље за корисника са ИД-ом 1.
Извор СКЛ ињекције
PHP $id = $_REQUEST[ 'id' ]; switch ($_DVWA['SQLI_DB']) { case MYSQL: // Check database $query = 'SELECT first_name last_name FROM users WHERE user_id = '$id';'; $result = mysqli_query($GLOBALS['___mysqli_ston'] $query ) or die( ''
. ((is_object($GLOBALS['___mysqli_ston'])) ? mysqli_error($GLOBALS['___mysqli_ston']) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row['first_name']; $last = $row['last_name']; // Feedback for end user echo 'ID:
{$id}
First name: {$first}
Surname: {$last}'; } mysqli_close($GLOBALS['___mysqli_ston']); break; case SQLITE: global $sqlite_db_connection; #$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']); #$sqlite_db_connection->enableExceptions(true); $query = 'SELECT first_name last_name FROM users WHERE user_id = '$id';'; #print $query; try { $results = $sqlite_db_connection->query($query); } catch (Exception $e) { echo 'Caught exception: ' . $e->getMessage(); exit(); } if ($results) { while ($row = $results->fetchArray()) { // Get values $first = $row['first_name']; $last = $row['last_name']; // Feedback for end user echo 'ID:
{$id}
First name: {$first}
Surname: {$last}'; } } else { echo 'Error in fetch '.$sqlite_db->lastErrorMsg(); } break; } } ode ?> - Сада покушајте да разбијете упит. Унесите један цитат
'у поље за унос и пошаљите.
Упит постаје:
SELECT * FROM users WHERE id = ''';Овде база података види додатни цитат и не зна како да доврши упит.
алгоритам за бинарно претраживање
Уместо да вам покаже корисничке детаље, апликација ће вратити СКЛ грешку (нешто попут „Имате грешку у вашој СКЛ синтакси…“)
Ово се зове СКЛ ињекција заснована на грешци јер:
- Нападач шаље неважећи унос (
') - База података даје грешку
- Та грешка пропушта корисне информације о бази података (попут типа структуре броја ДБ колона итд.)
2. СКЛ ињекција заснована на синдикату
СКЛ Ињекција заснована на синдикату је техника у којој нападачи користеUNIONоператор за комбиновање резултата два или вишеSELECTисказе у један скуп резултата. Ово им може омогућити да извуку информације из других табела у бази података. ТхеUNIONоператор се може користити само ако:
- Оба упита имају исти број колона
- Колоне имају сличне типове података
- Колоне су у истом редоследу
УНИОН Оператор : ТхеUNIONоператор се користи за комбиновање скупа резултата од два или вишеSELECTизјаве.
- Сваки
SELECTизјава унутарUNIONмора имати исти број колона - Колоне морају имати сличне типове података
- Колоне морају бити у истом редоследу
SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2Пример:
1. корак: Прво морамо да пронађемо број колона постојеће табеле на веб локацији да бисмо убацили СКЛ ињекцију засновану на УНИОН:
Страница СКЛ Ињецтион има једноставан оквир за унос у који можете да унесете кориснички ИД. Позадински упит је вероватно нешто попут
SELECT * FROM users WHERE id = 'user_input'Сада покушајте да разбијете упит. Унесите један цитат'у поље за унос и пошаљите.
Ако је апликација рањива, добићете детаљну поруку о грешци. Могло би изгледати отприлике овако:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
2. корак: КориститеUNIONКључна реч за откривање броја колона
Да бисте користилиUNIONкључну реч (уобичајени следећи корак) потребно је да знате број колона у оригиналном упиту. Ово можете сазнати користећиORDER BYклаузула
име града у САД
- Покушајте да сортирате резултате по колонама
1:1 ORDER BY 1.
- Субмит. Требало би да ради.
Извор СКЛ ињекције
PHP if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; switch ($_DVWA['SQLI_DB']) { case MYSQL: // Check database $query = 'SELECT first_name last_name FROM users WHERE user_id = '$id';'; $result = mysqli_query($GLOBALS['___mysqli_ston'] $query ) or die( ''
. ((is_object($GLOBALS['___mysqli_ston'])) ? mysqli_error($GLOBALS['___mysqli_ston']) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row['first_name']; $last = $row['last_name']; // Feedback for end user echo 'ID:
{$id}
First name: {$first}
Surname: {$last}'; } mysqli_close($GLOBALS['___mysqli_ston']); break; case SQLITE: global $sqlite_db_connection; #$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']); #$sqlite_db_connection->enableExceptions(true); $query = 'SELECT first_name last_name FROM users WHERE user_id = '$id';'; #print $query; try { $results = $sqlite_db_connection->query($query); } catch (Exception $e) { echo 'Caught exception: ' . $e->getMessage(); exit(); } if ($results) { while ($row = $results->fetchArray()) { // Get values $first = $row['first_name']; $last = $row['last_name']; // Feedback for end user echo 'ID:
{$id}
First name: {$first}
Surname: {$last}'; } } else { echo 'Error in fetch '.$sqlite_db->lastErrorMsg(); } break; } } ?> - Повећајте број:
1 ORDER BY 2. Субмит. Требало би да ради.
- Наставите да повећавате док не добијете грешку. На пример
1 ORDER BY 4може вам дати:Unknown column '4' in 'order clause' - То значи да упит има 3 колоне.
3. Слепо-базирана СКЛ ињекција
Слепа СКЛ ињекција се дешава када нападачи не могу да виде резултате упита директно на веб страници. Уместо тога, они закључују информације из суптилних промена у понашању апликације или времену одговора. Иако спорији и досаднији од класичног СКЛи-а, може бити подједнако ефикасан.
Уместо да поврати податке, нападач закључује информације посматрајући понашање веб странице. Ово се обично ради на један од два начина:
- Слепи СКЛи базиран на Боолеан: Нападач убацује СКЛ упит који враћа а истина или лажно резултат. Одговор веб апликације се мења у зависности од тога да ли је упит тачан или нетачан. На пример, страница може приказати другачију поруку или приказати другачији изглед.
- Слепи СКЛи заснован на времену: Нападач убацује СКЛ упит који узрокује да база података изврши радњу која одузима много времена (нпр.
SLEEP()функција) ако је испуњен услов. Нападач посматра време које је потребно да се страница учита да би утврдио да ли је убачени услов био истинит или нетачан.
Пример:
Замислите страницу за пријаву на којој уносите корисничко име и лозинку. Апликација конструише СКЛ упит овако:
SELECT * FROM users WHERE username = 'user_input' AND password = 'password_input'Слепа СКЛ ињекција би укључивала манипулацијуuser_inputпоље за постављање питања бази података.
Уместо да добије директан одговор, нападач би могао да покуша нешто овако:
user_input = 'admin' AND 1=1; --Ако се страница нормално учитава, нападач то зна1=1је а истина изјава.
user_input = 'admin' AND 1=2; --Ако страница показује грешку или се понаша другачије, нападач то зна1=2је а лажно изјава.
Користећи низ ових тачних/нетачних питања, нападач може систематски да погађа и извлачи информације један по један знак. Процес се може аутоматизовати да погоди све, од имена табела до корисничких лозинки.
Утицај напада СКЛ ињекцијом
- Неовлашћен приступ осетљивим подацима : Нападачи могу да поврате личне финансијске или поверљиве информације ускладиштене у бази података.
- Проблеми са интегритетом података : Нападачи могу изменити брисање или покварити критичне податке што утиче на функционалност апликације.
- Ескалација привилегија : Нападачи могу заобићи механизме аутентификације и добити административне привилегије.
- Застоји у сервису : СКЛ ињекција може преоптеретити сервер узрокујући деградацију перформанси или пад система.
- Оштећење угледа : Успешан напад може озбиљно да нашкоди репутацији организације што доводи до губитка поверења купаца.
Спречавање напада СКЛ ињекцијом
Постоји неколико најбољих пракси за спречавање напада СКЛ ињекцијом:
1. Користите припремљене изјаве и параметризоване упите
Припремљени изрази и параметризовани упити обезбеђују да се кориснички улази третирају као подаци, а не као део СКЛ упита. Овај приступ елиминише ризик од СКЛ ињекције.
Пример у ПХП-у (користећи МиСКЛи):
$stmt = $conn->prepare('SELECT * FROM users WHERE username = ? AND password = ?'); $stmt->bind_param('ss' $username $password); $stmt->execute();2. Запослите ускладиштене процедуре
Складиштене процедуре су унапред дефинисани СКЛ упити ускладиштени у бази података. Ове процедуре могу помоћи у спречавању СКЛ ињекције јер не конструишу динамички СКЛ упите.
ридхима тивари
Пример:
CREATE PROCEDURE GetUserByUsername (IN username VARCHAR(50)) BEGIN SELECT * FROM users WHERE username = username; END;3. Провера уноса на белу листу
Уверите се да су уноси корисника проверени пре употребе у СКЛ упитима. Дозволите само одређене знакове и обрасце као што је алфанумерички унос за поља као што су корисничка имена или адресе е-поште.
4. Користите ОРМ Фрамеворкс
Оквири објектно-релационог мапирања (ОРМ) попут Хибернате или Ентитетски оквир може помоћи у спречавању СКЛ ињекције аутоматским руковањем генерисањем упита спречавајући динамичку конструкцију упита.
5. Ограничите привилегије базе података
Дајте корисницима минималне потребне дозволе за базу података. Уверите се да апликације могу да обављају само неопходне радње (нпр. СЕЛЕЦТ ИНСЕРТ) и ограничите дозволе као што су ДРОП ТАБЛЕ или АЛТЕР.
6. Руковање грешкама
Конфигуришите базу података и апликацију тако да кориснику не приказују детаљне поруке о грешци. Уместо тога, интерно евидентирајте грешке и прикажите генеричке поруке о грешкама крајњим корисницима.