A1:Injection OWASP TOP 10
Вернуться назад

В продолжение о тестировании безопасности проектов статейка на основе OWASP TOP 10

Что мы тут имеем? Представьте, что это консоль, через которую мы можем проверять какой-то ресурс. Допустим давайте проверим с помощью lookup этот сайт, который отображен на скриншоте выше. При выполнении такой команды, сервак нам отдаст все его ip.

gallery/выделение_009

По статистике из OWASP TOP 10 взят этот список во все своей красе))) 

И так в этой статье мы рассмотрим первую уязвимость из этого списка "Injection" со всех ее сторон. Ею заражено по статистике 28 % компаний...

 

Эта уязвимость делится на такие векторы для атаки:

   - Инъекции через запросы SQL, LDAP, XPath

   - Инъекции через команды в Операционных системах

   - Инъекции через синтаксических анализах XML

   - Инъекции через заголовки SMTP

 

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

1) Запросы SQL, LDAP, XPath

Давайте рассмотрим быстрый пример, использующий запрос для страницы авторизации. Если у вас в приложении такова есть, то проверьте ее, чтоб с ней не было таких проблем, которые я вам покажу. При входе в систему через эту страницу, мы будем искать запись пользователя в нашей базе данных SQL, на основе введенного имени и пароля пользователя. Если мы получим какой-то результат, то он авторизует этого человека. Все довольно просто, на самом деле существуют такие страницы входа, которые работают таким же образом, имея такую же уязвимость.

2) Команды в операционных системах

Следующий вектор атаки этой уязвимости это команды с помощью которых мы обращаемся к нашему серверу.

 

Некоторые подумают про себя, про какие команды идет речь. Приведу пример на самой простой команде ping, когда мы пингуем какой-то сайт с консоли операционной системы.

 

1) ping 127.0.0.1

В этом нет никакой уязвимости, так как это стандартная команда ОС, с помощью которой можно получить ответ от сервака под каким ip он находится, про эту команду и другие похожие, вы можите почитать в моей статье по сбору информации о жертве.

 

Давайте теперь заюзаем уже вредоносную команду к нашему проверяемому сайту ;pwd, по которой сервак, не должен был выполнять ответ в таком виде.

Давайте еще рассмотрим одну команду для закрепления понимания ОС команд инжекшин. Этот раз введем UNIX команду ;ls; после названия нашего сайта, которая работает как покажи мне все содержимое в этом каталоге.

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

 

ОС команды можно применять не только в этом случае но и через запрос в урле нашего сайта, добавляя различные спецсимволы либо команды в зависимости от операционной системы на которой размещен сервак. Как один из примеров:

Это обыкновенный запрос, у которого в теле лежит запрос на файл pdf, давайте добавим специальные команды в боди нашего запрос на этот файл, +|+Dir c:\. 

 

Как защитится:

 

- Использование безопасного API, который избегает использования интерпретатора

- Использование «белого списка» на стороне сервера

- Для любых динамических запросов избегайте специальных символов либо используйте фильтрацию введенного

- Использование LIMIT и других элементов управления SQL в запросах

И ПОМНИТЕ ВСЕ ПОКАЗАННОЕ ВЫШЕ, СДЕЛАНО В ЦЕЛЯХ ОБУЧЕНИЯ!!!

МОЖНО ПРИМЕНЯТЬ ТОЛЬКО НА СВОИХ ПРОЕКТАХ, ПОСЛЕ РАЗРЕШЕНИЯ

gallery/выделение_013
gallery/1473921124injection-attack
gallery/выделение_019

И так тут мы видим форму, при заполнении которой, введенные данные будут отправлены в SQL запрос, который вытянет из базы данных нам ответ. Если есть такой юзер в базе данных, то нас авторизует. Если нету то нам скажет сорян зарегайся. То что мы будем вводить в поле User, передается в переменную $username, а то что введут в поле Pass, передается в переменную $password нашего SQL запроса. А теперь ниже рассмотрим то, что будет происходить при вводе значений в эти поля...

gallery/выделение_020

Давайте введем такие данные:

- в поле User мы введем значение Svyat, которое, как мы видим отмечено красной стрелкой, станет на место переменной $username

- в поле Pass мы введем значение 1234, которое, как мы видим отмечено синей стрелкой, станет на место переменной $password

После запуска этого SQL запроса, будет выполнен поиск в базе данных, где будет найден этот пользователь со всей его информацией, соответственно мы получим положительный ответ на странице авторизации и успешно авторизируемся.

 

Давайте теперь рассмотрим, то что может сделать злоумышленник в нашем случаи...

gallery/выделение_021

Тут злоумышленник проделывает ход конем и целится на юзера admin. Давайте разберем подробнее то, что он ввел:

- в поле User он ввел значение admin, которое, как мы видим, отмечено красной стрелкой, станет на место переменной $username

- в поле Pass он ввел значение ' OR 1=1 --, которое, как мы видим, отмечено синей стрелкой, станет на место переменной $password.

 

А теперь давайте разберем, что происходит с переменной $password, когда в нее попадают такие данные. Кавычкой ' из заданного значения ' OR 1=1 --, мы закрываем данную переменную, оставив пароль не заполненным, после оператора AND. Это видно на картинке выше. Затем переходим к слову OR из нашего значения ' OR 1=1 --, оно говорит про то, что мы вызываем оператор OR, который будет выполнять свою уже функцию в SQL запросе, так как, мы предыдущей кавычкой, закрыли нашу переменную. А выражение 1=1 --, говорит о том что верни нам трушное значение, так как 1=1 приравнивается как true.   

 

Давайте посмотрим на картинку ниже, как наш SQL запрос трансформировался после введенного нами значения ' OR 1=1 -- в поле Pass.

gallery/выделение_023

Надеюсь теперь понятно что произошло... Соответственно SQL получил дополнительное условие, которое означает, что этот запрос вернет строку для пользователя с юзером администратор, даже если правильный пароль не был введен. В запрос добавлено значение OR 1=1, которое всегда будет оцениваться как true (так как 1 всегда равно 1). OR true всегда будет true, не имеет значения, что еще введено пользователем, они автоматически получат правильный результат. Теперь этот пользователь будет авторизован как администратор, даже если он не знает пароля. Это не прикольно согласитесь.

 

Но если есть такая уязвимость, то это может дойти и до такого случая как на картинке ниже...

gallery/111111

Если в поле Pass ввести такое значение ‘; DROP TABLE users --, а затем отправить на сервер, то можно вообще лешиться данных наших юзером в нашей базе, но опять же таки это если мы не фильтруем в нашем приложении то что вводит наш пользователь.

 

Можем рассмотреть такой еще случай, когда мы осуществляем поиск чего-то. Давайте возьмем такой пример, ищем какого-то юзера в системе:

gallery/11232423

Как мы видим наш SQL запрос тут ожидает переменную $id, которая скажет какого именно юзера надо вытянуть из таблицы юзеров нашей базы данных. Соответственно отдаст нам по этой айди имя и фамилию найденного пользователя.

 

Давайте попробуем ввести какой-то айди и глянуть, что произойдет:

gallery/уйцйцу

И так после ввода айдихи 1 в наше поле, мы получили юзера admin с фамилией adminovich. Казалось бы что тут может быть не так. 

 

Но если злоумышленник решит ввести спец символы в это поле. И если мы не фильтруем то, что вводит юзер нашей системы, то мы будем иметь большие проблемы. Давайте введем спец символ % и посмотрим, что произойдет:

gallery/фекпфкп

Как вы уже догадались по картинке выше, тут нам показало всех пользователей, так как специальный символ %, который мы ввели показывает все что есть. Если помните знак % употребляется при вызове оператора LIKE, при обращении к SQL запросу.

 

А теперь давайте в следующем примере употребим оператор UNION, который делает объединение строк, с помощью его мы добавим к существующему запросу, который выполняется самим приложением, наш запрос, в котором мы хотим, чтоб помимо юзера имени и фамилии вывелся пароль, вместо последнего, то-есть вместо фамилии. Соответственно мы видим результат на лицо. В таблице после обыкновенного запроса и вывода данных на него, появится и данные относящиеся к запросу после UNION, то-есть Select username, password From users имя и пароли этих юзеров.  

gallery/выделение_038
gallery/выделение_039

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

Пробовали ли вы добавить какие-то спец символы при использовании пинга?

 

Типа таких:

 

2) | ping 127.0.0.1 |

3) & ping 127.0.0.1 &

4) ; ping -i 30 127.0.0.1;

5) % 0a ping 127.0.0.1% 0a

 

Последите, на сколько изменится результат ответа, даже так сказать, время ответа в отличии от оригинального запроса пинг. Если же отличие есть, то значит есть уязвимость. Опять же таки не у всех операционных системах есть эта уязвимость, больше всего ею заражены очень старые ОС.

 

Давайте взглянем на практическом примере через приложение BWapp:

gallery/выделение_044
gallery/выделение_045
gallery/выделение_046
gallery/выделение_047
gallery/выделение_048
gallery/выделение_049
gallery/выделение_051

И если приложение не фильтрует лишние запросы, то мы получим все что находится внутри директории С

gallery/выделение_052

Специальные символы для команд

Немного расскажу про спецсимволы для команд, что они делают |  ; & $ > < ` \ !

 

- команда1|команда2 - использования символа труба | сделает команду 2 выполнимой, в том случаи, если команда 1 будет выполнена или нет.

 

- команда1;команда2 - использование символа точка с запятой ; сделает команду 2 тоже выполнимой, если команда 1 будет выполнена или нет.

 

- команда1||команда2 - в этом случае команда 2 будет выполнена, только в случаи сбоя команды 1.

 

- команда1&&команда2 - команда 2 будет выполнена только при успешном выполнении команды 1.

 

- $(команда) - как пример, echo $(whoami), для выполнения команды

 

- 'команда' - работает только для определенных команд. Как пример 'whoami'

 

- >(команда) - как пример <(ls)

 

- <(команда) - как пример >(ls)

 

 

Санитарная

URL-адреса и данные формы должны быть очищены от недопустимых символов. Для этого «Черный список» символов является опцией, но продумать все символы трудно, которые стоит проверять. Также могут быть символы, которые еще не были обнаружены ранее. Для проверки ввода пользователя должен быть создан «белый список», содержащий только допустимые символы или список команд. 

 

Общий список, который будет включен для ввода команд, может быть таким  |  ; & $ > < ' \  ! >> #

Специальные символы для Windows, ( ) < > & * ‘ | = ? ; [ ] ^ ~ ! . ” % @ / \ : + , ` 
Специальные символов для Linux, { }  ( ) < > & * ‘ | = ? ; [ ]  $ – # ~ ! . ” %  / \ : + , `

 

Права доступа

Веб-приложение и его компоненты должны работать с строгими разрешениями, которые не позволяют выполнять команды операционной системы стороним пользователям. 

3) Синтаксический анализ в XML

Погнали дальше, и следующий вектор это инъекции через XML. Давайте рассмотрим один из вариантов, форму авторизации, в которой для начала мы введем данные как делает это нормальный пользователь:

gallery/illarra
gallery/выделение_053
gallery/выделение_055

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

 

Но давайте теперь рассмотрим, что может сделать злоумышленник. Допустим он добавляет в поле Email, такой тип данных как и используется в разметке страницы abc</mail><role>Admin<role><mail>a@b.com. Что говорит о том, что мы заполняем это поле мылом abc, а тегом </mail> закрываем разметку, далее в теги <role></role> мы передадим нам роль Admin, сделаем вид что этим тегом можно передавать роль, а затем новыми уже тегами <mail></mail> передадим туда мыло. В конечно итоге произойдет такая разметка страницы, которая отправится нами при отправке этих данных на сервак для обработки, и если у сервака нет никаких фильтраций и проверок, то сервак может обрабатывать эти данные как это показано ниже на картинке и мы создадим юзера с ролью админ, у которого будут все полномочия админа сайта.

4) Заголовки SMTP

А теперь последний вектор атаки уязвимости injection.

 

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

 

Как это работает, сначала пользователь чтоб попасть на свой почтовик делает такую последовательность событий, он выходит в интернет -> затем на веб приложение -> а затем с него на сервер, которые отдает запрашиваемые данные. Что в этом случае делает злоумышленник. Он изучив цепочку, просто методом перебора в урле и добавлением спец команд, и символов пытается достучатся напрямую на сервер. Как это показано ниже на картинке.

gallery/luchshiye-zagolovki-v-istorii (4)
gallery/выделение_056

Как мы видим на скрине выше, злоумышленник пытается просто в браузере достучатся на прямую к серваку с помощью уже прописанного пути, туда куда он хочет попасть:

 

http://<webmail>/read_mail.php?message_id=1

 

Может быть еще такой вариант, с параметром in:

http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=46106&startMessage=1

 

С использованием null значением параметра:

http://<webmail>/src/read_body.php?mailbox=&passed_id=46106&startMessage=1

 

С использованием случайного значение в параметре:

http://<webmail>/src/read_body.php?mailbox=NOTEXIST&passed_id=46106&startMessage=1

 

С добавлением спец символов:

http://<webmail>/src/read_body.php?mailbox=INBOX"&passed_id=46106&startMessage=1

 

 

И так можно перечислять еще долго.

 

Эти все векторы можно искать и в автоматическом режиме с помощью приложения SQLmap, о нем я писал в этой статье

Хотите узнать больше о различных уязвимостях и инструментах для поиски этих же уязвимостей, чтоб сделать ваш проект безопасным, для ваших пользователей? 

Мы организовываем тренинги по OWASP TOP 10. 

Буду рад вас видеть на тренинге!

 

Программа тут

 

 

gallery/logo3