Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - Внедрение SQL-кода23 января 2011Оглавление: 1. Внедрение SQL-кода 2. Методика атак типа внедрение SQL-кода 3. Защита от атак типа внедрение SQL-кода Внедрение SQL-кода один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода. Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных, получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере. Атака типа внедрения SQL может быть возможна из-за некорректной обработки входных данных, используемых в SQL-запросах. Разработчик прикладных программ, работающих с базами данных, должен знать о таких уязвимостях и принимать меры противодействия внедрению SQL. Принцип атаки внедрения SQLДопустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт: # Предыдущий код скрипта... $id = $_REQUEST; $res = mysql_query; # Следующий код скрипта... Если на сервер передан параметр id, равный 5, то выполнится следующий SQL-запрос: SELECT * FROM news WHERE id_news = 5 Но если злоумышленник передаст в качестве параметра id строку -1 OR 1=1, то выполнится запрос: SELECT * FROM news WHERE id_news = -1 OR 1=1 Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса. Внедрение в строковые параметрыПредположим, серверное ПО, получив запрос на поиск данных в новостях параметром search_text, использует его в следующем SQL-запросе: … $search_text = $_REQUEST; $res = mysql_query("SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news WHERE news_caption LIKE"); Сделав запрос вида 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 Но, внедрив в параметр 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 Использование UNIONЯзык SQL позволяет объединять результаты нескольких запросов при помощи оператора UNION. Это предоставляет злоумышленнику возможность получить несанкционированный доступ к данным. Рассмотрим скрипт отображения новости: $res = mysql_query; Если злоумышленник передаст в качестве параметра id конструкцию -1 UNION SELECT 1,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 которая объединяет несколько колонок в одну. Например, для примера данного выше вызов функции будет таким: -1 UNION SELECT group_concat FROM admin Экранирование хвоста запросаЗачастую, SQL-запрос, подверженный данной уязвимости, имеет структуру, усложняющую или препятствующую использованию union. Например скрипт $res = mysql_query; отображает имя автора новости по передаваемому идентификатору id только при условии, что имя начинается с буквы а, и внедрение кода с использованием оператора UNION затруднительно. В таких случаях, злоумышленниками используется метод экранирования части запроса при помощи символов комментария. В данном примере, злоумышленник может передать в скрипт параметр id со значением -1 UNION SELECT password FROM admin/*, выполнив таким образом запрос SELECT author FROM news WHERE id=-1 UNION SELECT password FROM admin/* AND author LIKE в котором часть запроса) помечена как комментарий и не влияет на выполнение. Расщепление SQL-запросаДля разделения команд в языке SQL используется символ ;, внедряя этот символ в запрос, злоумышленник получает возможность выполнить несколько команд в одном запросе, однако не все диалекты SQL поддерживают такую возможность. MySQL, например, не поддерживает. Например, если в параметры скрипта $id = $_REQUEST; $res = mysql_query; злоумышленником передается конструкция, содержащая точку с запятой, например 12;INSERT INTO admin VALUES; то в одном запросе будут выполнены 2 команды SELECT * FROM news WHERE id_news = 12; INSERT INTO admin VALUES ; и в таблицу admin будет несанкционированно добавлена запись HaCkEr. Просмотров: 3827
|