Я недавно пытаюсь изучить DOM XSS / clientide XSS, и https://www.owasp.org/index.php/DOM_Based_XSS упоминает эту часть, где вы можете завершить URL-адрес #
, сопровождаемым кодом JavaScript, и он будет обходить сервер, но по-прежнему будет отображаться JavaScript:
Техника, позволяющая избежать отправки полезной нагрузки на сервер, основана на том факте, что фрагменты URI (часть в URI после «#») не отправляются на сервер браузером. Таким образом, любой код на стороне клиента, который ссылается, скажем, на document.location, может быть уязвим для атаки, которая использует фрагменты, и в этом случае полезная нагрузка никогда не отправляется на сервер. Например, вышеупомянутый XSS на основе DOM может быть изменен на:
http://www.some.site/page.html#default=<script>alert(document.cookie)</script>
Я пытался обслужить этот HTML
<!DOCTYPE html>
<html lang="en">
<body>
<p id="asd"> asdasdasd </p>
</body>
<script>
var a = document.querySelector("#asd");
</script>
</html>
На следующем экспресс-сервере
const app = require("express")();
const PORT = 12343;
app.get("/", (request, response) => {
console.log(__dirname)
response.sendFile('asdasd.html', {root: `${__dirname}`})
})
app.listen(PORT, () => {
console.log(`server listening on port: ${PORT}`)
})
И когда я пытаюсь зайти на сайт по этому адресу:
http://localhost:12343/#a.innerText=%22Work!%22
Это не работает, однако я могу манипулировать переменной с помощью консоли.
Как #
работает в этом контексте?