Показать сообщение отдельно
Старый 15.01.2011, 20:39   #1
tipsy
 
Аватар для tipsy
 
Регистрация: 11.07.2010
Сообщений: 415
Репутация: 311
По умолчанию LFI через phpinfo

В продолжение темы Универсальный LFI для Windows+PHP
Потестил вот это
Цитата:
Сообщение от tipsy Посмотреть сообщение
...

То есть этапы примерно такие (могу ошибаться)
1) устанавливается соединение
2) начинают передаваться данные
3) сразу после получения заголовков апач определяет, что php файл существует и подгружает php. Отсюда разные для всех размеры "минимального файла" - дело в буферизации.
4) php создаёт файл, на этом этапе код скрипта не имеет значения
4.1) файл наполняется данными
5) передача данных заканчивается
6) исполняется php код (в нашем случае phpinfo)
7) php отправляет вывод скрипта апачу
8) php делает cleanup
, удаляя файл, и завершает работу
9) апач отсылает вывод скрипта юзеру.

Жирным выделил этапы, на которых файл существует.
В этом сценарии файл придётся брутить, но есть немалая вероятность, что пункты 8 и 9 в реальности стоят в обратном порядке, то есть до тех пор, пока данные не будут отправлены юзеру и запрос не завершится, php не сделает cleanup.

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



Проверить возможность создания такого сплойта можно так:

<? phpinfo();
system("touch /tmp/lastline");
?>

и зажать через mod_bwlimit траф до байта в секунду. Если tmp файл удалится сразу после создания lastline, значит уязвимости нет.


сработало



Код:
<?php 
phpinfo();
var_dump($_FILES);
system('touch /tmp/lastline');
?>
PHP Version 5.1.6 не раскрывает массив $_FILES и показывает Array вместо имени файла, на пхп поновее всё будет ок.

Через 30 секунд файл удалился.

В чём суть: я поставил mod_cbandwidth, он говно, на php не действует, снёс.

Поставил mod_bw, зажал траф до 256 bps, всё остальное по-умолчанию. Апач отдаёт данные пакетами по 8кб, соответственно, между пакетами с моими настройками проходит 32 секунды.

phpinfo выполняется несколько минут, возвращая управление ближе к концу.
php завершается, когда остаётся два неотправленных буффера.
php делает cleanup, когда остаётся 1 буффер.

Имя файла находится в самом низу, но дополнительными хидерами удалось приделать хвост в два буфера.

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

Да, по хвосту.
Заголовок апача по-умолчанию ограничен 8кб, вроде бы много хидеров не напихаешь, но
z6=z в заголовке превращается в
Код HTML:
<tr><td class="e">HTTP_Z6 </td><td class="v">z6 </td></tr>
в phpinfo, что аж целых 60 байт.

Последний раз редактировалось tipsy; 07.09.2011 в 20:59..
tipsy вне форума   Ответить с цитированием