Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Новые уязвимости доступа к файлам в PHP.docx
Скачиваний:
3
Добавлен:
08.07.2019
Размер:
108.52 Кб
Скачать

Играем в считалочку

Поверить китайскому в подписи под фаззингом о том, что уязвимость касается только file_get_contents, я просто не мог, хотя бы потому, что немного помнил исходники PHP. Недолго думая, я проверил все функции, которые вспомнил касательно работы с файлами. Результаты оказались более чем положительные. Уязвимость присутствует в функциях:

fopen

file_get_contents

copy

parse_ini_file

readfile

file_put_contents

mkdir

tempnam

touch

move_uploaded_file

include(_once)

require(_once)

ZipArchive::open()

Не присутствует в:

rename

unlink

rmdir

Есть где разгуляться, не правда ли? Но это еще полбеды.

PoC: идеи использования

Очевидно, что данную уязвимость можно использовать для обхода все возможных фильтров и ограничений. Например, для файла .htaccess, альтернативное имя будет h<< (см. п.4, п.1). Двухсимвольные файлы вообще можно читать без имени (см. п.9.). Ну и так далее. Есть и другое, не менее интересное применение — определение имен папок и файлов. Рассмотрим пример:

<?php

file_get_contents("/images/".$_GET['a'].".jpg");

?>

С помощью такого кода можно очень просто получить список директорий веб-сервера. Посылаем запрос test.php?a=../a<%00 и получаем ответ вида

Warning: include(/images/../a<) [function.include]: failed to open stream: Invalid argument in ...

или

Warning: include(/images/../a<) [function.include]: failed to open stream: Permission denied ...

В первом случае сервер не нашел ни одной директории начинающейся с буквы «а» в корне, во втором — нашел. Далее можно запустить подбор второй буквы и так далее. Для ускорения можно воспользоваться фонетикой (см. статью «Быстрее, выше и снова быстрее. Революционные подходы к эксплуатации SQL-инъекций»). Работает старая добрая техника эксплуатации слепых SQL инъекций. В ходе проведения опытов было замечено, что иногда сервер сразу выдает найденный путь в сообщении об ошибке. Тогда подбирать придется только в случае, если директории начинаются с одного и того же символа. От чего зависит вывод ошибки, я так и не успел разобраться и оставляю на суд общественности.

Лирическое отступление

Отрадно заметить, что репорт у китайцев нашел и Маг, который опубликовал ее в числе прочих в статье «Малоизвестные способы атак на web-приложения» еще 19 апреля, но пояснения и акцента на этой уязвимости там не было, был только китайский пример, с которого я и начинал.

Мораль

Честно говоря, очень хотелось найти альтернативу нуль-байту, но тщетно. Зато данная уязвимость открывает простор для других, не менее интересных атак. По сути, предоставляя возможности поиска директории и файлов через функции работы с файлами. Это само по себе уникальное явление. Как бы там ни было, респект китайцам с их фаззингом, но призываю и их, и всех остальных исследовать сырые данные, получаемые таким образом. Фаззинг фаззингом, а думать надо головой.