Внедрение SQL-кода

Внедрение SQL-кода (англ. SQL injection / SQLi) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

Атака типа внедрения SQL может быть возможна из-за некорректной обработки входных данных, используемых в SQL-запросах.

Разработчик прикладных программ, работающих с базами данных, должен знать о таких уязвимостях и принимать меры противодействия внедрению SQL.

Виды атак типа внедрения SQL-кода

Существует три основных класса атак, основанных на внедрении SQL-кода:

  • Классическая SQL инъекция (Classic SQLi)
  • SQL инъекция, основанная на эксплуатации выводимых СУБД сообщений об ошибках (Error-based SQLi)
  • Слепая SQL инъекция (Blind SQLi)

Принцип атаки внедрения SQL

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:

$id = $_REQUEST['id'];
$res = mysqli_query("SELECT * FROM news WHERE id_news = " . $id);

Если на сервер передан параметр id, равный 5 (например так: http://example.org/script.php?id=5), то выполнится следующий SQL-запрос:

SELECT * FROM news WHERE id_news = 5

Но если злоумышленник передаст в качестве параметра id строку "-1 OR 1=1" (например, так: http://example.org/script.php?id=-1+OR+1=1), то выполнится запрос:

SELECT * FROM news WHERE id_news = -1 OR 1=1

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно — вычисления происходят по кратчайшему контуру в схеме).

Внедрение в строковые параметры

Предположим, серверное ПО, получив запрос на поиск данных в новостях параметром search_text, использует его в следующем SQL-запросе (здесь параметры экранируются кавычками):

$search_text = $_REQUEST['search_text'];
$res = mysqli_query("SELECT id_news, news_date, news_caption, news_text, news_id_author
                      FROM news WHERE news_caption LIKE('%$search_text%')");

Сделав запрос вида http://example.org/script.php?search_text=Test мы получим выполнение следующего SQL-запроса:

SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news 
  WHERE news_caption LIKE('%Test%')

Но, внедрив в параметр search_text символ кавычки (который используется в запросе), мы можем кардинально изменить поведение SQL-запроса. Например, передав в качестве параметра search_text значение ')+and+(news_id_author='1, мы вызовем к выполнению запрос:

SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news 
  WHERE news_caption LIKE('%') and (news_id_author='1%')

Использование UNION

Язык SQL позволяет объединять результаты нескольких запросов при помощи оператора UNION. Это предоставляет злоумышленнику возможность получить несанкционированный доступ к данным.

Рассмотрим скрипт отображения новости (идентификатор новости, которую необходимо отобразить, передается в параметре id):

$res = mysqli_query("SELECT id_news, header, body, author FROM news WHERE id_news = " . $_REQUEST['id']);

Если злоумышленник передаст в качестве параметра id конструкцию -1 UNION SELECT 4 username, password,1 FROM admin, это вызовет выполнение SQL-запроса

SELECT id_news, header, body, author FROM news WHERE id_news = -1 UNION SELECT 1,username,password,1 FROM admin

Так как новости с идентификатором −1 заведомо не существует, из таблицы news не будет выбрано ни одной записи, однако в результат попадут записи, несанкционированно отобранные из таблицы admin в результате инъекции SQL.

Использование UNION + group_concat()

В некоторых случаях хакер может провести атаку, но не может видеть более одной колонки. В случае MySQL взломщик может воспользоваться функцией:

group_concat(col, symbol, col)

которая объединяет несколько колонок в одну. Например, для примера данного выше вызов функции будет таким:

-1 UNION SELECT group_concat(username, 0x3a, password) FROM admin

Экранирование хвоста запроса

Зачастую SQL-запрос, подверженный данной уязвимости, имеет структуру, усложняющую или препятствующую использованию union. Например скрипт:

$res = mysqli_query("SELECT author FROM news WHERE id=" . $_REQUEST['id'] . " AND author LIKE ('a%')");

отображает имя автора новости по передаваемому идентификатору id только при условии, что имя начинается с буквы а, и внедрение кода с использованием оператора UNION затруднительно.

В таких случаях злоумышленниками используется метод экранирования части запроса при помощи символов комментария (/* или -- в зависимости от типа СУБД).

В данном примере злоумышленник может передать в скрипт параметр id со значением -1 UNION SELECT password FROM admin/*, выполнив таким образом запрос

SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE ('a%')

в котором часть запроса ( AND author LIKE ('a%')) помечена как комментарий и не влияет на выполнение.

Расщепление SQL-запроса

Для разделения команд в языке SQL используется символ ; (точка с запятой), внедряя этот символ в запрос, злоумышленник получает возможность выполнить несколько команд в одном запросе, однако не все диалекты SQL поддерживают такую возможность.

Например, если в параметры скрипта

$id = $_REQUEST['id'];
$res = mysqli_query("SELECT * FROM news WHERE id_news = $id");

злоумышленником передается конструкция, содержащая точку с запятой, например 12;INSERT INTO admin (username, password) VALUES ('HaCkEr', 'foo'); то в одном запросе будут выполнены 2 команды

SELECT * FROM news WHERE id_news = 12;
INSERT INTO admin (username, password) VALUES ('HaCkEr', 'foo');

и в таблицу admin будет несанкционированно добавлена запись HaCkEr.

Методика атак типа внедрение SQL-кода

Поиск скриптов, уязвимых для атаки

На данном этапе злоумышленник изучает поведение скриптов сервера при манипуляции входными параметрами с целью обнаружения их аномального поведения. Манипуляция происходит всеми возможными параметрами:

  • Данными, передаваемыми через методы POST и GET
  • Значениями [HTTP-Cookie]
  • HTTP_REFERER (для скриптов)
  • AUTH_USER и AUTH_PASSWORD (при использовании аутентификации)

Как правило, манипуляция сводится к подстановке в параметры символа одинарной (реже двойной или обратной) кавычки.

Аномальным поведением считается любое поведение, при котором страницы, получаемые до и после подстановки кавычек, различаются (и при этом не выведена страница о неверном формате параметров).

Наиболее частые примеры аномального поведения:

  • выводится сообщение о различных ошибках;
  • при запросе данных (например, новости или списка продукции) запрашиваемые данные не выводятся вообще, хотя страница отображается

и т. д. Следует учитывать, что известны случаи, когда сообщения об ошибках, в силу специфики разметки страницы, не видны в браузере, хотя и присутствуют в её HTML-коде.

Конструкция Комментирование остатка строки Получение версии Конкатенация строк
MySQL -- ..., /* ..., или # ... version() concat (string1string2)
MS SQL -- ... @@version string1 + string2
Oracle -- ... или /* ... select banner
from v$version
string1 || string2
или concat (string1string2)
MS Access Внедрение в запрос NULL‑байта: %00...
PostgreSQL -- ... SELECT version() string1 || string2, CONCAT('a','b')
Sybase -- ... @@version string1 + string2
IBM DB2 -- ... select versionnumber from sysibm.sysversions string1 || string2 или string1 concat string2
Ingres -- ... dbmsinfo('_version') string1 || string2

Защита от атак типа внедрение SQL-кода

Для защиты от данного типа атак необходимо тщательно фильтровать входные параметры, значения которых будут использованы для построения SQL-запроса.

Фильтрация строковых параметров

Предположим, что код, генерирующий запрос (на языке программирования Паскаль), выглядит так:

statement := 'SELECT * FROM users WHERE name = "' + userName + '";';

Чтобы внедрение кода (закрытие строки, начинающейся с кавычки, другой кавычкой до её завершения текущей закрывающей кавычкой для разделения запроса на две части) было невозможно, для некоторых СУБД, в том числе, для MySQL, требуется брать в кавычки все строковые параметры. В само́м параметре заменяют кавычки на \", апостроф - на \', обратную косую черту - на \\ (это называется «экранировать спецсимволы»). Это можно делать таким кодом:

statement := 'SELECT * FROM users WHERE name = ' + QuoteParam(userName) + ';';
function QuoteParam(s : string) : string;
{ на входе — строка; на выходе — строка в кавычках и с заменёнными спецсимволами }
var
  i : integer;
  Dest : string;
begin
  Dest := '"';
  for i:=1 to length(s) do
    case s[i] of
      '''' : Dest := Dest + '\''';
      '"' : Dest := Dest + '\"';
      '\' : Dest := Dest + '\\';
    else Dest := Dest + s[i];
    end; 
  QuoteParam := Dest + '"';
end;

Для PHP фильтрация может быть такой:

$query = "SELECT * FROM users WHERE user='" . mysqli_real_escape_string($user) . "';";

Фильтрация целочисленных параметров

Возьмём другой запрос:

statement := 'SELECT * FROM users WHERE id = ' + id + ';';

В данном случае поле id имеет числовой тип, и его чаще всего не берут в кавычки. Поэтому «закавычивание» и замена спецсимволов на escape-последовательности не проходит. В таком случае помогает проверка типа; если переменная id не является числом, запрос вообще не должен выполняться.

Например, на Delphi для противодействия таким инъекциям помогает код:

if TryStrToInt(id, id_int) then
  statement := Format('SELECT * FROM users WHERE id =%0:d;', [id_int]);

Для PHP этот метод будет выглядеть так:

 $query = 'SELECT * FROM users WHERE id = ' . (int)$id;

Усечение входных параметров

Для внесения изменений в логику выполнения SQL-запроса требуется внедрение достаточно длинных строк. Так, минимальная длина внедряемой строки в вышеприведённых примерах составляет 8 символов («1 OR 1=1»). Если максимальная длина корректного значения параметра невелика, то одним из методов защиты может быть максимальное усечение значений входных параметров.

Например, если известно, что поле id в вышеприведённых примерах может принимать значения не более 9999, можно «отрезать лишние» символы, оставив не более четырёх:

statement := 'SELECT * FROM users WHERE id = ' + LeftStr(id, 4) + ';';

Использование параметризованных запросов

Многие серверы баз данных поддерживают возможность отправки параметризованных запросов (подготовленные выражения). При этом параметры внешнего происхождения отправляются на сервер отдельно от самого запроса либо автоматически экранируются клиентской библиотекой. Для этого используются

  • на Delphi — свойство TQuery.Params;

Например

var
  sql, param : string
  
begin
  sql := 'select :text as value from dual';
  param := 'alpha';  
  Query1.Sql.Text := sql;
  Query1.ParamByName('text').AsString := param;
  Query1.Open;
  ShowMessage(Query1['value']);  
end;
  • на Perl — через DBI::quote или DBI::prepare;
  • на Java — через класс PreparedStatement;
  • на C# — свойство SqlCommand.Parameters;
  • на PHP — MySQLi (при работе с MySQL), PDO.

См. также

Ссылки

Read other articles:

Sungai NyabarongoPertemuan Nyawarungu (kanan atas) dan Ruvuvu (kiri atas) untuk membentuk Sungai Kagera (depan).Peta Rwanda, menunjukkan lokasi Sungai Nyabarongo, yang mengalir pertama ke utara, kemudian tenggara melewati Kigali, lalu ke timur di sepanjang perbatasan tenggara RwandaLokasiNegaraRwanda, Burundi, TanzaniaCiri-ciri fisikHulu sungai  - koordinat2°12′13″S 29°34′04″E / 2.203503°S 29.567728°E / -2.203503; 29.567728 - elevas...

 

Artikel ini tidak memiliki referensi atau sumber tepercaya sehingga isinya tidak bisa dipastikan. Tolong bantu perbaiki artikel ini dengan menambahkan referensi yang layak. Tulisan tanpa sumber dapat dipertanyakan dan dihapus sewaktu-waktu.Cari sumber: Sungai Bug Selatan – berita · surat kabar · buku · cendekiawan · JSTOR Sungai Buh Selatan, Sungai Bug, atau Sungai Boh (Ukrainian: Південний Бугcode: uk is deprecated , Pivdennyi Buh; Ru...

 

Artikel ini perlu diwikifikasi agar memenuhi standar kualitas Wikipedia. Anda dapat memberikan bantuan berupa penambahan pranala dalam, atau dengan merapikan tata letak dari artikel ini. Untuk keterangan lebih lanjut, klik [tampil] di bagian kanan. Mengganti markah HTML dengan markah wiki bila dimungkinkan. Tambahkan pranala wiki. Bila dirasa perlu, buatlah pautan ke artikel wiki lainnya dengan cara menambahkan [[ dan ]] pada kata yang bersangkutan (lihat WP:LINK untuk keterangan lebih lanjut...

Vous lisez un « bon article » labellisé en 2011. Programme SurveyorSondes spatiales ( Lune ) Une maquette terrestre d'une sonde Surveyor.Données générales Organisation NASA Constructeur Hughes Aircraft Programme Surveyor Domaine Étude in situ de la Lune Type de mission Atterrisseur Nombre d'exemplaires 7 Statut Missions terminées Lancement 1966-1968 Lanceur Atlas-Centaur Protection planétaire Catégorie II[1] Caractéristiques techniques Masse au lancement 995-1 036&#...

 

Lokasi kotamadya Ikast-Brande Ikast-Brande adalah sebuah kotamadya (bahasa Denmark, kommune) di Region Midtjylland, Denmark. Luas wilayahnya 768 km² dan berpenduduk sekitar 39.893 jiwa (2008). Pada tanggal 1 Januari 2007, kotamadya Ikast-Brande diciptakan sebagai akibat Kommunalreformen (Reformasi Kotamadya 2007), terdiri atas bekas kotamadya Brande, Ikast, dan Nørre-Snede. Rujukan Statistik kotamadya: NetBorger Kommunefakta Diarsipkan 2007-08-12 di Wayback Machine., dari KMD alias Kommuned...

 

この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)出典検索?: コルク – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL(2017年4月) コルクを打ち抜いて作った瓶の栓 コルク(木栓、�...

Brigate MatteottiDescrizione generaleAttivadicembre 1943 - maggio 1945 Nazione Italia ServizioPartito Socialista Italiano di Unità ProletariaComitato di Liberazione Nazionale TipoBrigate partigiane ObiettivoSconfitta dei paesi dell'Asse e dei nazifascistiCacciata dei tedeschi nazionalsocialisti dall'Italia Battaglie/guerreSeconda guerra mondialeResistenza italiana Parte diCorpo Volontari della LibertàComitato di Liberazione Nazionale Voci su unità militari presenti su Wikipedia Le Bri...

 

2015 film by Rob Cohen The Boy Next DoorTheatrical release posterDirected byRob CohenWritten byBarbara CurryProduced by Jason Blum John Jacobs Elaine Goldsmith-Thomas Benny Medina Jennifer Lopez Starring Jennifer Lopez Ryan Guzman John Corbett Ian Nelson Kristin Chenoweth CinematographyDave McFarlandEdited byMichel AllerMusic byRandy EdelmanNathan BarrProductioncompanies Smart Entertainment[1] Blumhouse Productions[1] Nuyorican Productions[1] Distributed byUniversal Pi...

 

Навчально-науковий інститут інноваційних освітніх технологій Західноукраїнського національного університету Герб навчально-наукового інституту інноваційних освітніх технологій ЗУНУ Скорочена назва ННІІОТ ЗУНУ Основні дані Засновано 2013 Заклад Західноукраїнський �...

Minority language of Germany, spoken mostly by people in North Frisia North FrisianSylt: NuurđfriiskFöhr/Amrum: nuurdfreskHeligoland: NoorfriiskWiedingharde/Halligen: nordfreeskMooring: nordfraschKarrharde: nordfräischCentral Goesharde: noordfreeschBilingual sign in German and North Frisian, respectively, in Husum, GermanyNative toGermanyRegionNorth FrisiaEthnicityNorth FrisiansNative speakers(10,000 cited 1976)[1]Language familyIndo-European GermanicWest GermanicNorth Sea Ger...

 

This article uses bare URLs, which are uninformative and vulnerable to link rot. Please consider converting them to full citations to ensure the article remains verifiable and maintains a consistent citation style. Several templates and tools are available to assist in formatting, such as reFill (documentation) and Citation bot (documentation). (August 2022) (Learn how and when to remove this message) Emigration from Colombia is a migratory phenomenon that started in the early 20th century.&#...

 

Organ central to the nervous system This article is about the brains of all types of animals. For information specific to humans, see human brain. For other uses, see brain (disambiguation) and brains (disambiguation). Not to be confused with Brian, braine, or brane. BrainBrain of a chimpanzeeDetailsPart ofNervous systemIdentifiersLatincerebrumGreekencephalonMeSHD001921NeuroNames21TA98A14.1.03.001TA25415Anatomical terminology[edit on Wikidata] The brain is an organ that serves as the cent...

Church on the Isle of Cumbrae, Scotland ChurchCathedral of the IslesCathedral of the Isles, CumbraeDenominationScottish Episcopal ChurchChurchmanshipBroad ChurchWebsiteCathedral of the IslesHistoryDedicationThe Holy SpiritAdministrationDioceseArgyll & the IslesClergyProvostThe BishopLaityDirector of musicMr Alastair Chisholm The Cathedral of the Isles and Collegiate Church of the Holy Spirit is a Category A listed cathedral of the Scottish Episcopal Church[1] in the town of Millpo...

 

Questa voce sull'argomento calciatori danesi è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Jess ThorupNazionalità Danimarca Altezza190 cm Calcio RuoloAllenatore (ex attaccante) Squadra Augusta Termine carriera2007 - giocatore CarrieraSquadre di club1 1989-1996 Odense134 (29)1996-1998 Uerdingen 0539 (3)1998 Tirol Innsbruck13 (1)1998-2005 Esbjerg210 (60)2005 HamKam11...

 

College men's tennis team For information on all San Diego State University sports, see San Diego State Aztecs. San Diego State Aztecsmen's tennisUniversitySan Diego State UniversityHead coachGene Carswell (since 2004 season)ConferenceMountain WestLocationSan Diego, CAHome CourtAztec Tennis CenterNicknameAztecsColorsScarlet and black[1]   NCAA Tournament appearances1998, 1999, 2000, 2002, 2003, 2005, 2015Conference Tournament championshipsMountain West 2002, 2...

Town in SlovakiaPodolínecTownA church in Podolínec Coat of armsPodolínecLocation of Podolínec in SlovakiaCoordinates: 49°15′26″N 20°31′51″E / 49.25722°N 20.53083°E / 49.25722; 20.53083CountrySlovakiaRegionPrešovDistrictStará ĽubovňaFirst mentioned1235Government • MayorMichal Marhefka[1]Area[2] • Total33.76 km2 (13.03 sq mi) (2022)Elevation565[3] m (1,854[3] ft)Popu...

 

Roman conquest of Italy from 588 BC to 7 BC This article is about the unification of Italy by the Roman Republic. For Justinian's Italian campaign, see Gothic War (535–554). Roman expansion in Italy from 500 BC to 218 BC through the Latin War (light red), Samnite Wars (pink/orange), Pyrrhic War (beige), and First and Second Punic War (yellow and green). Cisalpine Gaul (238–146 BC) and Alpine valleys (16–7 BC) were later added. The Roman Republic in 500 BC is marked with dark red. Part o...

 

この項目では、リーグそのものについて説明しています。運営組織については「ジャパン・プロフェッショナル・バスケットボールリーグ (法人)」をご覧ください。 前身のひとつ bjリーグ「日本プロバスケットボールリーグ」とは異なります。 BリーグB.LEAGUE最新シーズン・大会:Bリーグ 2024-25前身NBLNBDLbjリーグ(TKbjリーグ)競技バスケットボール創立2015年4月1日代表島...

فورت أتكينسون     الإحداثيات 43°08′39″N 91°56′05″W / 43.144166666667°N 91.934722222222°W / 43.144166666667; -91.934722222222   [1] تقسيم إداري  البلد الولايات المتحدة[2][3]  التقسيم الأعلى مقاطعة وينيشيك  خصائص جغرافية  المساحة 802896 متر مربع0.810863 كيلومتر مربع (1 أبريل 2010)&#...

 

The topic of this article may not meet Wikipedia's general notability guideline. Please help to demonstrate the notability of the topic by citing reliable secondary sources that are independent of the topic and provide significant coverage of it beyond a mere trivial mention. If notability cannot be shown, the article is likely to be merged, redirected, or deleted.Find sources: Equb – news · newspapers · books · scholar · JSTOR (October 2022) (Learn ho...