PHP_SELF и XSS

#php #xss

#php #xss

Вопрос:

Я нашел статью, в которой утверждается, что $_SERVER['PHP_SELF'] она уязвима для XSS.

Я не уверен, правильно ли я это понял, но я почти уверен, что это неправильно.

Как это может быть уязвимо для XSS-атак!?

 <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>
  

Комментарии:

1. Смотрите также: seancoates.com/blogs/xss-woes

2. Это не отвечает на вопрос, но до сих пор было упущено из виду во всех ответах: Поскольку атрибут action может принимать относительный URI, оставьте его пустым, чтобы ссылаться на ту же страницу: action = "" — это то, что $_SERVER['PHP_SELF'] также выражает, но без данных. И когда вы затем посмотрите на ссылку HTML по вашему выбору, вы увидите, что это также значение по умолчанию, поэтому вы можете его не использовать. Насколько это было просто?

3. Предоставление пустого атрибута action недопустимо в HTML 5, а полное отсутствие атрибута делает вашу страницу уязвимой для атак iframe.

Ответ №1:

Чтобы сделать его безопасным в использовании, вам нужно использовать htmlspecialchars() .

 <?php echo htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, "utf-8"); ?>
  

Смотрите Уязвимость XSS почти в каждой форме PHP, которую я когда-либо писал, о том, как $_SERVER["PHP_SELF"] можно атаковать.

Комментарии:

1. некоторое объяснение (почему это небезопасно без выполнения этой операции?) были бы высоко оценены

2. Во-первых — я протестировал несколько версий этого в современных браузерах — похоже, ни одна из них не выполняет скрипт, который я прикрепляю к содержимому. Во-вторых, чем использование <?php echo $_SERVER['PHP_SELF'];?> отличается от использования обычных ссылок (набранных вручную?) — пользователь может манипулировать ими так же легко? Итак, это уже не такая большая угроза? (Современные браузеры)? И почему использование этой глобальной переменной отличается от использования полного URL вручную?

3. Извините, ошибка в ссылке выше: Ошибка установления соединения с базой данных

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

Ответ №2:

Это действительно уязвимость XSS. Я понимаю, что вы считаете, что это не может повредить вашему сайту, но это не значит, что это нереально.

Если вы в это не верите, попробуйте следующее:

Мы предполагаем, что у вас есть страница, такая как «registration.php «. Мы предполагаем, что у вас есть форма, в которой действие:

 <?php echo $_SERVER['PHP_SELF']; ?>
  

действительно, как вы выразились:

 <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>
  

Теперь просто добавьте строку ниже

 %27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E
  

На самом деле это не сложно понять, поскольку PHP_SELF является отражением URL, ваше приложение прочитает все, что вы введете в URL, и повторит это. Вот так просто.

htmlspecialchars должен позаботиться об этом, нет причин оспаривать доказательства.

 <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
   <!-- form contents -->
</form>
  

Однако, даже если это первый шаг к краже файла cookie, дело не в том, что это происходит автоматически. Даже если организовать атаку довольно просто (поскольку злоумышленник зарегистрируется на вашем сайте и увидит, как выглядит файл cookie … и т.д.), Должен быть верен ряд других факторов, чтобы возникла ситуация с кражей файла cookie. Например, срок действия файла cookie не должен быть истек. Чем это зависит от того, насколько сложным является файл cookie. Чем, возможно, у вас есть другие меры предосторожности при размещении на сервере, это не обязательно должна быть полная аутентификация, основанная на наличии cookie!

Хотя я действительно считаю, что это довольно сложное и действительно плохое программирование для выполнения всех условий (даже если у yahoo.mail, например, была такая уязвимость, и если вы посмотрите в Интернете, вы найдете даже эксплойт и декодер cookie), XSS реален, и кто знает, что может сделать хитрый злоумышленник, если ваш сайт пострадает от этого. Лекарство простое…

Комментарии:

1. Я вижу, как может сработать атака. Но я не вижу, как использование htmlspecialchars останавливает это.

2. Отличное объяснение. Спасибо.

3. Отличное объяснение. Еще один недостаток того, как можно манипулировать интерпретаторами, если они не понимают синтаксис предыдущих или последующих интерпретаторов. Закрывать код пораньше и внедрять — это весело 🙂

Ответ №3:

Сама статья, на которую вы ссылаетесь, дает вам:

 http://www.example.com/form.php/">alert(‘xss attack’)<br class="irrelevant
  

что здесь непонятно?

Редактировать: это XSS-атака, потому что я могу скрыть ссылку с моего сайта на ваш с помощью некоторого JS, добавленного к URL, который отправляет мне ваши файлы cookie, поэтому в тот момент, когда вы нажимаете на эту ссылку, вы pwnd.

Комментарии:

1. Как это должно быть XSS-атакой?

2. Макронэл, ты знаешь, что такое XSS?

3. @McRonald: Прочитайте первую строку здесь , которая точно описывает, что происходит в этом ответе.

Ответ №4:

Вы должны использовать filter_input() для доступа к суперглобальным файлам в PHP. Если вы установите фильтр на FILTER_SANITIZE_FULL_SPECIAL_CHARS, он удалит небезопасные символы, обычно используемые в XSS. Учитывая ваш пример:

 <form method="post" 
    action="<?php filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS); ?>">
<!-- form contents -->
</form>
  

Ответ №5:

Уязвимость заключается в том, что пользователь может вводить вредоносные коды JavaScript в форму. Для предотвращения этого используется htmlspecialchars функция.

Предопределенные символы (например, >, <, «, ‘) преобразуются в объекты (> < и т.д.)

htmlspecialchars($_SERVER[«PHP_SELF»]) гарантирует, что все отправленные переменные формы преобразуются в сущности.

Чтобы узнать больше об этой уязвимости, посетите: https://www.w3schools.com/php/php_form_validation.asp

Еще одна ссылка, которая может вам помочь: https://www.google.com/amp/s/www.bitdegree.org/learn/php-form-validation/amp

Ответ №6:

Я изучаю этот вопрос о переменной PHP_SELF и атаке XSS. Есть кое-что, чего я все еще не могу понять: предполагается, что переменная PHP_SELF ссылается на имя файла сценария (скрипт, который выполняется). Тогда почему он берет свое значение из URL? (разрешение проблемы XSS).

Комментарии:

1. Это не ответ, а скорее вопрос