возможно ли это как XSS-эксплойт в Javascript? - PullRequest
0 голосов
/ 24 января 2019

Я работаю с некоторыми унаследованными приложениями, и мне интересно, будет ли это жизнеспособным XSS-эксплойтом?

код:

<div id="demo"></div>

<script>

document.getElementById("demo").innerHTML = '<script src="/me.js"></script>';
</script>

Не думаю, но есть более умные людитам, чем я.Есть ли варианты этого?

1 Ответ

0 голосов
/ 17 февраля 2019

Это само по себе безвредно:

document.getElementById("demo").innerHTML = '<script src="/me.js"></script>';

HTML5 указывает, что тег, вставленный с помощью innerHTML, не должен выполняться. 1

Однако (и поскольку вы спрашиваете), может быть отдаленный шанс (по общему признанию), что это все еще может быть использовано:

// This is the backdoor that an attacker has to inject somehow
Object.defineProperty(Element.prototype, 'innerHTML', {
  set: function (value) {
    const script = document.createElement('script');
    script.textContent = `alert('gotcha! ${value}')`;
    document.body.appendChild(script);
  }
});

// This is what you're doing in your app
document.getElementById("demo").innerHTML = '<script src="/me.js"><\/script>';
<div id="demo"></div>

Как видите, было бы легко разобрать и извлечь URL-адрес и заново внедрить скрипт в страницу.


В настоящее время использование innerHTML, скорее всего, не рекомендуется.Пример:

Предупреждение. Если ваш проект будет подвергнут любой проверке безопасности, использование innerHTML, скорее всего, приведет к отклонению вашего кода.Например, если вы используете innerHTML в расширении браузера и отправляете расширение на addons.mozilla.org, оно не пройдет процесс автоматического просмотра. 1

У React есть интересный способ (IMHO) отговорить вас от его использования:

dangerouslySetInnerHTML - замена React для использования innerHTML в браузереDOM.В общем, настройка HTML из кода рискованна, потому что легко непреднамеренно подвергнуть ваших пользователей атаке межсайтового скриптинга (XSS).Таким образом, вы можете установить HTML непосредственно из React, но вы должны ввести опасно SetInnerHTML и передать объект с ключом __html, чтобы напомнить себе, что это опасно. 2


Наконец, я думаю, что стоит упомянуть, что и у epascarello, и у E. Sundin есть верная точка зрения.Мы знаем, что <script> не будет загружаться и / или выполняться при введении через innerHTML, но это не значит, что вы в безопасности:

<div id="demo"></div>

<script>
document.querySelector('#demo').innerHTML =
  '<img src="x.gif" onerror="alert(42)">';
</script>

Ссылки

  1. https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML#Security_considerations
  2. https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...