Я прохожу курс по безопасности программного обеспечения, и мне предложили следующий сценарий:
PHP-код работает на сервере:
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=response.txt");
readfile($_GET['file']."/remove/this.txt");
?>
Мне нужно знать, может ли это быть использовано для получения произвольного файла на сервере (кроме * / remove / this.txt).
Я попытался использовать нулевой байт (% 00), но он не работает (сервер apache работает под управлением PHP 5.3 в Ubuntu).
Я также пытался проявить творческий подход с помощью фильтра php: //, ввода php: // и т. Д. И ничего. Проблема здесь в том, что последняя часть инструкции является ресурсом.
Усечение пути тоже не работает. Пока единственное, что я могу сделать, это прочитать URL-адреса, используя? Var = …
Я только что провел простой тест и могу сказать, что нет не замужем использование символов для этого, которое отрубит последнюю часть имени файла. Пример:
<pre>
<?php
for($i=0;$i<=255;$i++){
$chr = chr($i);
readfile("B.txt{$chr}A.txt");
}
Создан файл с именем A.txt
это стандартный файл и B.txt
это целевой файл. Поместите что-нибудь заметное в каждый файл, чтобы вы знали, когда он был прочитан (у меня уже были файлы для чего-то другого, и в каждом из них был другой список из примерно 100 элементов).
В моей системе не было ни одного символического эксплойта RHEL6. Очевидный эксплойт был бы, если файл remove/this.txt
существует в другом месте, и вы можете перенаправить в другой каталог.
Других решений пока нет …