XSS-атака для обхода функции htmlspecialchars () в атрибуте value - PullRequest
22 голосов
/ 24 мая 2010

Допустим, у нас есть эта форма, и возможная часть для внедрения вредоносного кода ниже:

...
<input type=text name=username value=
       <?php echo htmlspecialchars($_POST['username']); ?>>
...

Мы не можем просто поставить тег или javascript: alert (); call, потому что значение будет интерпретироваться как строка, а htmlspecialchars отфильтровывает <,>, ', ", поэтому мы не можем закрыть это значение кавычками.

Мы можем использовать String.fromCode (.....) для обхода кавычек, но я все еще не могу заставить всплывающее окно с простым предупреждением.

Есть идеи?

Ответы [ 3 ]

16 голосов
/ 24 мая 2010

Кроме того, важно отметить, что разрешение людям вставлять HTML или JavaScript на вашу страницу (а не в ваш источник данных) само по себе не несет в себе угрозы безопасности. Уже существуют расширения для браузера, которые позволяют вам изменять DOM и сценарии на веб-страницах, но, поскольку они предназначены только для клиентской части, они будут знать только об этом.

Когда XSS становится проблемой, это когда люди а) используют его для обхода проверки на стороне клиента или фильтрации ввода или б) когда люди используют его для манипулирования полями ввода (например, путем изменения значений тегов OPTION в ACL для предоставления их разрешения они не должны иметь). ЕДИНСТВЕННЫЙ способ предотвратить такие атаки - санировать и проверять входные данные на стороне сервера вместо или в дополнение к проверке на стороне клиента.

Для очистки HTML от ввода, htmlspecialchars идеально подходит, если вы не хотите разрешать определенные теги, в этом случае вы можете использовать библиотеку, такую ​​как HTMLPurifier. Если вы размещаете пользовательский ввод в HREF, ONCLICK или любом другом атрибуте, который позволяет создавать сценарии, вы просто напрашиваетесь на неприятности.

РЕДАКТИРОВАТЬ: Глядя на ваш код, похоже, что вы не цитируете свои атрибуты! Это довольно глупо. Если кто-то введет свое имя пользователя как:

john onclick="alert('hacking your megabits!1')"

Тогда ваш скрипт будет анализироваться как:

<input type=text name=username value=john onclick="alert('hacking your megabits!1')">

ВСЕГДА используйте кавычки вокруг атрибутов. Даже если они не введены пользователем, это хорошая привычка.

<input type="text" name="username" value="<?php echo htmlspecialchars($_POST['username']); ?>">
10 голосов
/ 25 июня 2010

Есть один способ. Вы не передаете htmlspecialchars () третий параметр кодирования или правильно проверяете кодировку, поэтому:

$source = '<script>alert("xss")</script>';
$source = mb_convert_encoding($source, 'UTF-7');
$source = htmlspecialchars($source); //defaults to ISO-8859-1
header('Content-Type: text/html;charset=UTF-7');
echo '<html><head>' . $source . '</head></html>';

Работает только в том случае, если вы можете a) настроить страницу на вывод UTF-7 или b) заставить страницу сделать это (например, iframe на странице без четкого набора символов). Решение состоит в том, чтобы гарантировать, что все входные данные имеют правильную кодировку, и что ожидаемая кодировка правильно установлена ​​в htmlspecialchars ().

Как это работает? В UTF-7 символы <> "имеют разные кодовые точки, чем UTF-8 / ISO / ASCII, поэтому они не экранированы, если не преобразовать вывод в UTF-8 для гарантии (см. Расширение iconv).

1 голос
/ 24 мая 2010

value - это обычный атрибут HTML, не имеющий отношения к Javascript.
Следовательно, String.fromCharCode интерпретируется как буквальное значение и не выполняется.

Чтобы внедрить скрипт, сначала нужно заставить синтаксический анализатор закрыть атрибут, что будет трудно без >'".

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

Даже если вы указываете значение, оно все равно может быть уязвимым; см эту страницу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...