2024. 9. 19. 20:35ใhacking : p_study/Dreamhack
๐ป๊ณผ์ 2
๋๋ฒ์งธ ๋ฌธ์ ์ ์ฒซ ํ๋ฉด์ด๋ค.
์ผ๋จ admin์ผ๋ก ์๋ํ๋๋ฐ, ์ด์ฉ๋ค ๋น๋ฐ๋ฒํธ 8๊ธ์์ด์ ์ด๊ตฌ๋.. ๋ผ๋ ๊ฒ์ ์์๋ค.
๊ทผ๋ฐ ์ด ์ดํ์๋ถํฐ ์ด๋ป๊ฒ ํด์ผํ ์ง ๊ฐํผ๋ฅผ ์ก์ง ๋ชปํ์๋ค..
๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ํตํด์ ์ฝ๋๋ ๋ดค๋๋ฐ ๋ฑํ ์ด๋ค ์ ๋ณด๋ฅผ ์ป์ด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค.
์ผ๋จ ๋ฌธ์ ํธ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ด์ฌํ ์ฐพ์๋ดค๋ค.
๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด์ ํต์ฌ์ ์ผ๋ก ๋ด์ผํ๋ ํ์ผ์ด ๋๊ฐ์ง ์ ๋์๋ค.
1. index.js ํ์ผ
โ
ํด๋น ํ์ผ์์ ์ง์ค์ ์ผ๋ก ๋ณด์์ผํ ๋ถ๋ถ์ ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ ์๋ํฌ์ธํธ์ ๋ํด ํ์ ํด์ผ ํ๋ค.
์ด ์นํ์ด์ง์ ๋ํ ์ ์ฒด์ ์ธ ๊ตฌ์ฑ์ ๋ด๋นํ๊ณ ์๊ธฐ์ ํ๋๊ทธ๊ฐ ์ ์ฅ๋์ด ์๋ ์๋ํฌ์ธํธ๊ฐ ์กด์ฌํ๊ณ , ๊ทธ ๋ถ๋ถ์ ์ธ์ฆ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
โ์ง๊ธ ๋น์ฅ์ ์ง์ง ํ๋๊ทธ๋ฅผ ์ฐพ๋ ๊ณณ์ ํ์ ํ๊ธฐ ์ด๋ ค์ฐ๋ ์ฝ๋ ํ์ ๋ง ํ๊ณ ๋๊ธฐ์.
/auth ์๋ํฌ์ธํธ : db.doLogin ํจ์๋ก ๋ก๊ทธ์ธ์ ์งํํ๋ค.
๊ด๋ จ ํจ์๋ db.js ํ์ผ์ ์์ผ๋ ์ฐธ๊ณ ํด์ผ ํ๋ค.
โ
/ ์๋ํฌ์ธํธ : ๊ธฐ๋ณธ์ ์ธ ์์ฒญ์ด ๋ฐ์ํ๋ ๊ณณ์ผ๋ก port, host ๋ฑ์ ์ ๋ ฅํด ์์ฒญ์ ๋ณด๋ด๋ ๊ณณ์ด๋ค.
/proxy ์๋ํฌ์ธํธ : ์ฝ๋๋ก ๋ณด์ด์ง๋ง ์ค์ ๋ก ์จ๊ฒจ์ ธ์๋ค.
/ ์๋ํฌ์ธํธ์์ ์์ฒญ์ ๋ณด๋ด๋ฉด proxy ์๋ํฌ์ธํธ๋ก ์ด๋, ์ฟผ๋ฆฌ์ ์ ๋ ฅ์ด ๋ด๊ฒจ ์์ฒญ์ด ์งํ๋๋ค.
โ
/api/history : ์ค์ ๋ก ํ๋๊ทธ๋ฅผ ์ฐพ๋ ์๋ํฌ์ธํธ์ด๋ค.
โ
/api/local/flag ์๋ํฌ์ธํธ : ํ๋๊ทธ๋ฅผ ๋ฐํํ๋ ์๋ํฌ์ธํธ์ด๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์ ๊ทผํ ์ ์๋ ์๋ํฌ์ธํธ์ด๊ธฐ ๋๋ฌธ์ ๊ด์ฌ์ ๋์ง ์์๋ ๋๋ค.
2. db.js ํ์ผ
โ
์ฌ๊ธฐ์ ๋ด์ผํ ๊ฒ์ sql ๋ฌธ ๋ฟ์ด๋ค.
const result = await query("SELECT * FROM users WHERE id = ? AND pw = ?", [id, pw]);
โ
๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ์ ๋งํด๋ณด์๋ฉด,
์ฐ์ sql ๊ด๋ จ ํ์ผ์ธ flag_inject ํ์ผ์ ์ด์ด๋ณด๋ฉด url์ด๋ผ๋ key์ admin_inject value๋ฅผ ๊ฐ์ง๊ณ ์๋ response๋ฅผ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ response์ data ๊ฐ์ผ๋ก ํ๋๊ทธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ id์ ํด๋นํ๋ url ๊ฐ์ ๊ฐ์ง response๋ฅผ ์ฐพ์์ค๋โ
/api/history ์๋ํฌ์ธํธ์์ ํ๋๊ทธ๋ฅผ ์ป์ ์ ์๋ค๋๊ฑธ ์ ์ ์๋ค.
โ
๋ฐ๋ผ์ sql ์ธ์ ์ ์ผ๋ก admin_inject ๊ณ์ ์ ํ์ทจํ ๋ค์, ๊ทธ ๊ณ์ ์ ๊ฐ์ง ์ํ์์ /api/history ๋ก ๋ค์ด๊ฐ reg๋ฅผ ํ์ธ,
๊ทธ ๋ค์์ /api/history/{reg๊ฐ}๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.
[ํ์ต ์ฐธ๊ณ ์๋ฃ]
โ
โ Node.js SQL Injection: Examples & Prevention (stackhawk.com)
โ
ํด๋น ๋ด์ฉ์ํตํด sql ์ฟผ๋ฆฌ๋ฌธ์ ์์๋๊ณ ์ด๋ ์ฟผ๋ฆฌ ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ฉํ sql injection ๋ฐฉ์ง ๋์ฑ ์ฝ๋์ด๋ค.
await query("SELECT * FROM users WHERE id = ? AND pw = ?", [id, pw]);
์ด ์ฝ๋๋ก ์ฟผ๋ฆฌ๋ฌธ์ ๋ง๋ค๋ฉด ๋ฌผ์ํ๊ฐ ์๋ ๊ณณ์ id์ pw๊ฐ ์๋์ผ๋ก ์ด์ค์ผ์ดํ๋์ด ๋ค์ด๊ฐ๋๋ฐ,
๋ฐ๋ผ์ sql injection ๊ณต๊ฒฉ์ ์ด๋์ ๋ ๋ง์ ์ ์๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง ํด๊ฒฐ์ฑ ์ด ์๋ค๊ณ ํ๋ค.
์์ฒญ์ body๊ฐ id=noid&pw=nopw ๋ก ๊ตฌ์ฑ๋์ด ์๋ค๋ฉด id=admin&pw[pw]=1๋ก ์ธ์ ์ ์ด ๊ฐ๋ฅํ๋ค.โ
pw[pw]๋ก ๊ฐ์ ์ ๋ฌํ ๊ฒฝ์ฐ ๊ฐ์ด ์๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ผ๋ก sql์์ ํ๋จ๋๊ธฐ ๋๋ฌธ์ sql ๋ฌธ์ ์๋์ ๊ฐ์ด ๋๋ค.
SELECT * FROM users WHERE id = 'admin_inject' AND pw = `pw` = 1
๋ก๊ทธ์ธ ์ํ์์ /api/history/1๋ก ์ ์ํ๋ฉด ๋๋๋ค.
ํ๋๋ ๊ธฐ์ตํ ๊ฒ์ ์๋์ธ๋ฐ, ์ด ์๋ํฌ์ธํธ๋ก์ ์ ๊ทผ์ด ํ์ํ๋ ์ ์ด๋ค.
/api/history/:rid(\\d+)
์ฌ๊ธฐ์ :rid(\\d+) ๋ ์ ๊ท์์ผ๋ก ์ด ๊ณณ์ ์ซ์๋ฅผ ๋ฃ์ผ๋ฉด rid ์ ๊ฐ์ผ๋ก ์ ํด์ง๋ค๋ ๋ป์ผ๋ก,โ
api/history/1์ ํ๋ฉด rid = 1์ธ response๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ด๋ค.
์ด๋ฌ๋ฉด, ์ฝ๋์ ์ํด ํํฐ๋ง๋์ง ์์ RESPONSE๊ฐ ๋ํ๋๋ค๊ณ ํ๋ค.
๊ทธ๋ฐ๋ฐ,, ๋ ์ฌ์ค ํด๋น ๋ด์ฉ์ ๋ํด ์ด์ฌํ ๊ณต๋ถํ ๋ด์ฉ์ ์ฐพ์๋ณด๊ธฐ๋ ํ์ง๋ง, ์์ง ์๋ฒฝํ ์ดํดํ์ง ๋ชปํด์ ํ๋๊ทธ๋ฅผ ๊ตฌํ์ง ๋ชปํ๋ค.
๊ณต๋ถ๋ฅผ ์ข๋ ํด๋ณด๋ฉด์ ๋ค์ ๊ณผ์ ๋ฅผ ํ์ด๋ด์ผํ ๊ฒ ๊ฐ๋ค.
์ถ๊ฐ ๊ณต๋ถ๋ฅผ ์งํ ํ ๊ผญ ํ๋๊ทธ๋ฅผ ์ป์ด๋ด๋๋ก ํ๊ฒ ์ต๋๋ค.
+ ์ถ๊ฐ ๊ณผ์ ์งํ (2์ฐจ ์๋ ์คํจ)
์ฝ๋์ ์ํด ํํฐ๋ง๋์ง ์์ response๊ฐ ๋ํ๋๋ค.
๋ก๊ทธ์ธ์ ๋๋ฌ์ /api/history/1์ ์ ๋ ฅํด๋ณด์๋ค.
Cannot GET์ด๋ผ๊ณ ๋ฌ๋ค.
Not Found๊ฐ ๋ฌ๋ค.
3์ฐจ ์๋๋ ์งํํด์ผ์ง..
์ด๋ฒ์ฃผ ๊ณผ์ ๋
[ ๊ณผ์ ์ฐธ๊ณ ์๋ฃ ]
https://blog.naver.com/sun1497a/223205481650
'hacking : p_study > Dreamhack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Web Hacking ๊ณผ์ _2(Dreamhack_weblog-1) (1) | 2024.10.30 |
---|---|
Web Hacking ๊ณผ์ _1(Dreamhack_sql injection bypass WAF) (1) | 2024.10.30 |
7์ฃผ์ฐจ_CTF๊ณผ์ (Dreamhack : Type c-j) (0) | 2024.05.25 |
6์ฃผ์ฐจ_CTF๊ณผ์ (Dreamhack : easy-login) (0) | 2024.05.20 |
6์ฃผ์ฐจ_CTF๊ณผ์ (Dreamhack : web-misconf-1) (0) | 2024.05.18 |