Skip to content

Latest commit

ย 

History

History
93 lines (59 loc) ยท 3.04 KB

File metadata and controls

93 lines (59 loc) ยท 3.04 KB

CVE-2024-29041 | Open Redirect

ํ™”์ดํŠธํ–‡ ์Šค์ฟจ 3๊ธฐ (19๋ฐ˜) - ์ •๋ฏผ์„ (@j93es) / Blog Link


์š”์•ฝ

์•„๋ž˜ Express ๋ฒ„์ „์—์„œ req.location() ํ˜น์€ ๋‚ด๋ถ€์ ์œผ๋กœ req.location()์„ ์ด์šฉํ•˜๋Š” req.redirect()์—์„œ๋Š” ํ—ค๋”์˜ Location์— ๊ฐ’์„ ๋„ฃ๊ธฐ ์ „, encodeurl()์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ ๋ฆฌ๋””๋ ‰์…˜ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • < 4.19.2
  • >= 5.0.0-alpha.1, < 5.0.0-beta.3

PoC ๊ตฌ์„ฑ

๋จผ์ € normal-app, vuln-app 2๊ฐœ์˜ express ์„œ๋น„์Šค๋ฅผ ์ œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋‘ ์„œ๋น„์Šค๋Š” ๋ชจ๋‘ query์˜ q์— ์žˆ๋Š” url์„ ํŒŒ์‹ฑํ•œ ํ›„, Location ํ—ค๋”์— ๋„ฃ์–ด ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

// index.js
const express = require("express");
const app = express();
const port = 3000;

app.use(function (req, res) {
  res.location(req.query.q).end();
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

๊ฐ app์˜ package.json์— express ๋ฒ„์ „์„ ๋ช…์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค. vuln-app์€ 4.19.0, normal-app์€ ํŒจ์น˜๊ฐ€ ์™„๋ฃŒ๋œ 4.19.2๋กœ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.


ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰

8002์—๋Š” ์ทจ์•ฝํ•œ ๋ฒ„์ „์˜ Express๊ฐ€, 8003 ํฌํŠธ์—๋Š” ์•ˆ์ „ํ•œ ๋ฒ„์ „์˜ Express๊ฐ€ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.

# ์ด๋ฏธ์ง€ ๋นŒ๋“œ
make build

# ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
make up

# ์ข…๋ฃŒ
make down

# ๋กœ๊ทธ ๋ณด๊ธฐ
make logs

# ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
make restart

# ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ ๊ฐ€๋Šฅ
make clean

# ์ด๋ฏธ์ง€ ์ œ๊ฑฐ ํ›„ ์žฌ๋นŒ๋“œ
make rebuild

๊ฒฐ๊ณผ

์š”์ฒญ

ํŒจ์น˜ ๋‚ด์—ญ1๊ณผ ํŒจ์น˜ ๋‚ด์—ญ2์˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์š”์ฒญ URL์„ ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

curl -i -X GET "http://localhost:8003?q=http://google.com%5C%5C@apple.com"

์•ˆ์ „ํ•œ Express ์„œ๋ฒ„(8003 ํฌํŠธ)

normal

์ทจ์•ฝํ•œ Express ์„œ๋ฒ„(8002 ํฌํŠธ)

normal


์ •๋ฆฌ

http://localhost:8003?q=http://google.com%5C%5C@apple.com ์š”์ฒญ ์‹œ Location ํ—ค๋”์—, ์ฒซ ๋ฒˆ์งธ URL์ธ http://google.com\\@apple.com์—์„œ๋Š” ์ด์ค‘ ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ํŒŒ์„œ์— ๋”ฐ๋ผ ๋‹จ์ผ ๋ฐฑ์Šฌ๋ž˜์‹œ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๊ณ , ์ดํ›„ @ ๊ธฐํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด ์•ž์˜ ๋ถ€๋ถ„์ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ ํ•ด์„๋˜๊ณ  ์‹ค์ œ ๋„๋ฉ”์ธ์€ apple.com์œผ๋กœ ์ฒ˜๋ฆฌ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ URL์ธ http://google.com\%5C@apple.com์—์„œ๋Š” %5C๊ฐ€ ๋ฐฑ์Šฌ๋ž˜์‹œ์˜ URL ์ธ์ฝ”๋”ฉ ํ˜•ํƒœ์ด์ง€๋งŒ, ์ด๋ฏธ ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๋กœ ์ด์Šค์ผ€์ดํ”„๋˜์–ด ์žˆ์–ด ์ „์ฒด ๋ฌธ์ž์—ด์ด \%<5C@apple.com์œผ๋กœ ํ•ด์„๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ URL ํŒŒ์‹ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์˜๋„ํ•œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ URL์€ URL ์Šคํ‘ธํ•‘์ด๋‚˜ ์˜คํ”ˆ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ทจ์•ฝ์  ๋“ฑ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.