๐ŸŒ†โ”‚Web_Study/๐ŸฅŠโ”‚pentestgym

SQL ์ธ์ ์…˜ ๊ธฐ์ดˆ

Jastes 2023. 7. 7. 15:00

๐Ÿ’กํ•ด๋‹น ๋‚ด์šฉ์€ pentestqym์˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋ฉฐ,
   ๋ชจ๋“  ์ €์ž‘๊ถŒ์€ ํ•ด๋‹น ์‚ฌ์ดํŠธ์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค.

 ์ด๋ฒˆ์—๋Š” SQL Injection์ด ๋ญ”์ง€์™€ ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.


SQL Injection?

 SQL Injection์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” SQL(Structured Query Language)[๊ฐ์ฃผ:1] ์ฟผ๋ฆฌ๋ฅผ ์•…์˜์ ์œผ๋กœ ์กฐ์ž‘ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ๊ณต๊ฒฉ์œผ๋กœ ์ธํ•ด ๊ณต๊ฒฉ์ž๋Š” ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์›น ๋ณด์•ˆ์— ๋งค์šฐ ์‹ฌ๊ฐํ•œ ์œ„ํ˜‘์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


SQL Injection action?

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” App์€ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ CRUD๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ DB์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ WAS๋ฅผ ํ†ตํ•ด DB์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ DB๋ฅผ ํ™œ์šฉํ•ด ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

 

๊ตฌ์ƒ ์ •๋„์— ๋”ฐ๋ผ ๋ฌผ๋ฆฌ์ /๋…ผ๋ฆฌ์ ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์›น ์„œ๋ฒ„์ธก ๊ธฐ์ˆ ์—์„œ๋„ ์œ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋ฐฐ์›Œ๋ดค์ฃ ?

๋”๋ณด๊ธฐ

1. ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก
- HTTP ํ†ต์‹ (GET ๋งค๊ฐœ๋ณ€์ˆ˜ or POST Body ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ
2. ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด SQL ์ฟผ๋ฆฌ์— ๋Œ€์ž…
3. ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— SQL ์ฟผ๋ฆฌ ์‹คํ–‰์„ ์š”์ฒญ

4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
5. ์„œ๋ฒ„์ธก ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ HTTP ์‘๋‹ต์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ

 

 ์ž! ๊ทธ๋Ÿผ ์œ„์˜ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— SQLi์˜ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ์ทจ์•ฝํ•˜๊ฒŒ ๊ตฌํ˜„๋œ ๋กœ๊ทธ์ธ ๋กœ์ง์€ SQLi๋กœ ์šฐํšŒํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํš๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต๊ฒฉ์ž๊ฐ€ ID ์ž…๋ ฅ๋ž€์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

admin' or '1' = '1

๊ทธ๋ฆฌ๊ณ  PW๋ž€์—๋Š” ์ž„์˜์˜ ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„  anyting์œผ๋กœ ์ž…๋ ฅํ•˜์˜€์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ID์™€ PW๋ฅผ HTTPํ†ต์‹ ์œผ๋กœ ์ตœ์ข…์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ SQL Query๋กœ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

SELECT * FROM users WHERE id='admin' or '1'='1' AND password='anything';

์ด์™€ ๊ฐ™์ด ๊ธฐ์žฌ๋œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ID๊ฐ€ admin์ด ์žˆ๋‹ค๋ฉด ํŒจ์Šค์›Œ๋“œ ์—ฌ๋ถ€์™€ ์ƒ๊ด€ ์—†์ด ํ•ด๋‹น ์ •๋ณด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ SQL ๋ฌธ์ด ํ•ญ์ƒ ์ฐธ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ 

 

๊ทธ๋Ÿผ ์™œ ์ฐธ์ด ๋˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

์œ„์™€ ๊ฐ™์ด 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WHERE์ ˆ์— or๊ณผ AND ๋‘๊ฐ€์ง€์˜ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๊ณ , ๊ฐ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ์‚ฌ์ด์— ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ธ์ง€ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

๊ตฌ๋ถ„ ๋‚ด์šฉ ์กฐ๊ฑด์‹์˜ ์ฐธ/๊ฑฐ์ง“ ์—ฌ๋ถ€
์กฐ๊ฑด์‹1 id='admin' TRUE     (admin ๊ณ„์ •์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ '์ฐธ'์ž…๋‹ˆ๋‹ค.)
์กฐ๊ฑด์‹2 '1'='1' TRUE     (๋ˆ„๊ฐ€ ๋ด๋„ '์ฐธ'์ž…๋‹ˆ๋‹ค.)
์กฐ๊ฑด์‹3 password='anything' FALSE    (admin ๊ณ„์ •์˜ ํ‹€๋ฆฐ ํŒจ์Šค์›Œ๋“œ์ด๋ฏ€๋กœ '๊ฑฐ์ง“'์ž…๋‹ˆ๋‹ค.)

์ž ๊ทธ๋Ÿผ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์ž๋ž‘ ๋Œ€์ž…ํ•˜์—ฌ ์—ฐ์‚ฐํ•ฉ์‹œ๋‹ค. ๋‹จ, AND๊ฐ€ OR๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๋Š” ์  ์œ ์˜ํ•˜์„ธ์š”

์œ„์™€ ๊ฐ™์ด ์ ์šฉ๋œ ๋ชจ์Šต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํ€ด๋ฆฌ๋ฌธ์ด ์ฐธ์ด ๋˜์–ด admin์˜ ๊ณ„์ •์˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ๋Š” SQLi ๊ณต๊ฒฉ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ํ€ด๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ํ€ด๋ฆฌ์— ์žˆ์–ด์„œ ์ฐธ์กฐํ•˜์—ฌ ํ•ด์•ผํ•˜๋Š” ์ ์„ ์ƒ๊ฐํ•˜๋ฉด์„œ ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

SELECT *
FROM users
WHERE ((id='spike') AND (password='ilovejulia'));

์›๋ž˜ ์ฟผ๋ฆฌ์— ๊ด„ํ˜ธ๋กœ ์—ฌ๋‹ซ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฌธ์œผ๋กœ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒƒ์ด์ง€์š”

admin') or ('1'='1

 

 SQLi๋Š” ์ธ์ฆ์šฐํšŒ๋ง๊ณ ๋„ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ์ƒˆ๋กœ์šด DB ๋ช…๋ น๋ฌธ์„ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ App์—์„œ ๊ฒŒ์‹œํŒ์—์„œ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•„๋ก€๋Š” ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๊ฒŒ์‹œ๊ธ€(๊ฒŒ์‹œ๊ธ€ ๊ณ ์œ ๋ฒˆํ˜ธ๊ฐ€ 4215๋กœ ๊ฐ€์ •)์„ ํด๋ฆญํ•˜๋ฉด ๋‚˜์˜ค๊ฒŒ ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

SELECT brd_no, subject, content, author, post_date FROM board WHERE brd_no=4215;

 ๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด SQL ์ฟผ๋ฆฌ์˜ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๋Š” ๊ธฐํ˜ธ์ธ ์„ธ๋ฏธ์ฝœ๋ก (;)๊ณผ ๋ณธ์ธ์ด ์˜๋„ํ•œ ์•…์˜์ ์ธ SQL ๋ฌธ์žฅ์„ ์ด์šฉํ•˜์—ฌ "brd_no"๋ผ๋Š” GET ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค. 9999๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒŒ์‹œ๊ธ€์˜ ๋ฒˆํ˜ธ๋กœ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

HTTP ํ†ต์‹ (GET ํŒŒ๋ผ๋ฏธํ„ฐ; ์‚ฌ์šฉ์ž ์š”์ฒญ ์ „์†ก)
/board/view.php?brd_no=9999;Drop%20table%20users;

 ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์—์„œ ์ „๋‹ฌ๋œ "brd_no" ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์€ SQL ์ฟผ๋ฆฌ์— ํฌํ•จ๋˜์–ด DB์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•…์˜์ ์ธ ์˜๋„๋กœ ์ถ”๊ฐ€๋œ ์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ์ธํ•ด ์›๋ž˜์˜ SQL ์ฟผ๋ฆฌ์™€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ถ”๊ฐ€ํ•œ ์•…์˜์ ์ธ SQL ์ฟผ๋ฆฌ๊ฐ€ ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

SELECT brd_no, subject, content, author, post_date FROM board WHERE brd_no=9999;Drop table users;

๋งŒ์•ฝ App์—์„œ ์‚ฌ์šฉ๋˜๋Š” DB์˜ ๊ณ„์ •์ด ์œ„(์‚ญ์ œ)์™€ ๊ฐ™์€ ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 SQL Injection์€ HTTP ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์˜ ๊ฐ’์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฌธ์ž[ํ™‘๋”ฐ์˜ดํ‘œ('), ์„ธ๋ฏธ์ฝœ๋ก (;) ๋“ฑ]๋ฅผ ํ—ˆ์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ์— ์•…์˜์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


SQLi ์ข…๋ฅ˜

SQLi๋Š” DB ์ ‘๊ทผ๋ฐฉ์‹์ด๋‚˜ ๊ณต๊ฒฉ๊ธฐ๋ฒ•์— ๋”ฐ๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

 

์˜ค๋ฅ˜(Error) ๊ธฐ๋ฐ˜ SQLi

 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์˜๋„์ ์ธ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ๋‚˜ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Ž๋” ์•Œ์•„๋ณด๊ธฐ!!

 

Error ๊ธฐ๋ฐ˜ SQL ์ธ์ ์…˜

๐Ÿ’กํ•ด๋‹น ๋‚ด์šฉ์€ pentestqym์˜ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋ฉฐ, ๋ชจ๋“  ์ €์ž‘๊ถŒ์€ ํ•ด๋‹น ์‚ฌ์ดํŠธ์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ธฐ๋ฐ˜ SQLi์— ๋Œ€ํ•˜์—ฌ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค. Error based SQLi ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ™œ์šฉํ•˜

dystopia050119.tistory.com


 

 UNION๊ธฐ๋ฐ˜ SQLi

 ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ UNION ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ์กด SQL ์ฟผ๋ฆฌ์— ๋ง๋ถ™์ด๊ณ  ๊ธฐ์กด SQL์„ ๋ฌดํšจํ™”์‹œ์ผœ ์›ํ•˜๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ ˆ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“Ž๋” ์•Œ์•„๋ณด๊ธฐ!!

๋”๋ณด๊ธฐ

๋งํฌ ๋งํฌ


 

Blind SQLi

 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

 ๊ณต๊ฒฉ์ž๋Š” ์„œ๋ฒ„์˜ ๋ฏธ์„ธํ•œ ์‘๋‹ต๊ณผ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ด€์ฐฐํ•˜์—ฌ ๊ณต๊ฒฉ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Boolean ๊ธฐ๋ฐ˜

 SQL ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ฐธ ๋˜๋Š” ๊ฑฐ์ง“์— ๋”ฐ๋ผ ์„œ๋ฒ„์˜ ์‘๋‹ต์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ฐธ/๊ฑฐ์ง“ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ณต๊ฒฉ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

Time ๊ธฐ๋ฐ˜

 SQL ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์„œ๋ฒ„์˜ ์‘๋‹ต ์‹œ๊ฐ„์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ง€์—ฐ๋œ ์‘๋‹ต ์‹œ๊ฐ„์„ ํ†ตํ•ด SQL Injection์— ์ทจ์•ฝํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Ž๋” ์•Œ์•„๋ณด๊ธฐ!!

๋”๋ณด๊ธฐ

๋งํฌ ๋งํฌ

 


SQLi์˜ ์˜ํ–ฅ

 SQL Injection ๊ณต๊ฒฉ์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง์„ ํŒŒ๊ดดํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด์™€ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์œ ์ถœํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ์˜ ์†์ƒ๊ณผ ์†์‹ค์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ œ๊ณต๋˜๋Š” ์ €์žฅ ํ”„๋กœ์‹œ์ €(Stored Procedure)[๊ฐ์ฃผ:2]๋ฅผ ์•…์šฉํ•˜๋ฉด ์›๊ฒฉ ๋ช…๋ น ์‹คํ–‰ ๋“ฑ์œผ๋กœ ์‹œ์Šคํ…œ ์†์ƒ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


SQLi ์˜ˆ๋ฐฉ์ฑ…

 SQL Injection์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ˆœํžˆ ํ™‘๋”ฐ์˜ดํ‘œ(')๋‚˜ ์„ธ๋ฏธ์ฝœ๋ก (;) ๋“ฑ์˜ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ๋ฐฉ์–ด์ฑ…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” SQL Injection์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์ž…๋‹ˆ๋‹ค


์ž…๋ ฅ๊ฐ’ ๊ฒ€์‚ฌ

 HTTP ์š”์ฒญ์˜ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์— SQL ๊ตฌ๋ฌธ์œผ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž๋‚˜ ์•…์„ฑ SQL ๊ตฌ๋ฌธ์„ ๊ฒ€์‚ฌํ•˜์—ฌ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์€ SQL Injection ๊ณต๊ฒฉ์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์š”ํ•œ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ ๋ฐ ํ•„ํ„ฐ๋ง์€ ์ผ๋ถ€ SQL Injection ๊ณต๊ฒฉ์— ๋Œ€ํ•ด ํšจ๊ณผ์ ์ด์ง€๋งŒ, ์™„๋ฒฝํ•œ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

 

 SQL Injection ๊ณต๊ฒฉ์€ ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ•๊ณผ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ์กฐ์น˜์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • SQL ๊ธฐํ˜ธ : ํ™‘๋”ฐ์˜ดํ‘œ('), ๊ฒน๋”ฐ์˜ดํ‘œ("), ์„ธ๋ฏธ์ฝœ๋ก (;), ๋Œ€์‹œ(-), ์ƒต(#), ์Šฌ๋ž˜์‹œ์ƒต (/*) ๋“ฑ
  • SQL ๊ตฌ๋ฌธ : SELECT, INSERT, UPDATE, DELETE, UNION, GROUP BY, HAVING, ORDER BY ๋“ฑ

์ €์žฅ ํ”„๋กœ์‹œ์ € ์‚ฌ์šฉ

 ์ €์žฅ ํ”„๋กœ์‹œ์ €[๊ฐ์ฃผ:3]๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์ €์žฅ ํ”„๋กœ์‹œ์ € ๋‚ด์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ SQL ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ์ €์žฅ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ ๋ช…๋ น์— ์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ SQL Injection ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 ๊ณต๊ฒฉ์ž๋Š” ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‹คํ–‰ ๋ช…๋ น์„ ์กฐ์ž‘ํ•˜์—ฌ ์›์น˜ ์•Š๋Š” ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์•…์˜์ ์ธ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, xp_cmdshell[๊ฐ์ฃผ:4]์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๋ฐฉ์–ด ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 ๋‹ค์Œ์€ sp_boardList ์ €์žฅ ํ”„๋กœ์‹œ์ € ์‹คํ–‰ ๋ช…๋ น์„ ์ข…๋ฃŒ์‹œํ‚ค๊ณ  ๋’ค์— xp_cmdshell ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ํ†ตํ•ด C๋“œ๋ผ์ด๋ธŒ์˜ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์‰˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

exec sp_boardList '30', 'test'; exec master..xp_cmdshell 'dir C:\'-- 

๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ ์‚ฌ์šฉ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ

 ํ•ด๋‹น ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•œ ํ›„ ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ”๊ณ  ๊ณต๊ฒฉ์ž์˜ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด SQL Injection ๋ฐฉ์–ด์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ PHP ์˜ˆ์ œ ์†Œ์Šค์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

$conn = mysqli_connect("example.com","spike","ilovejulia","bebop_db");
$sql = "INSERT INTO crews (firstname, lastname, email) 
	VALUES ('$_POST["firstname"]','$_POST["lastname"]','$_POST["email"]')";

$mysqli->query($conn, $sql);

 ๋ณด์‹œ๋Š” ๋ฐ”์™€ ๊ฐ™์ด SQL ์ฟผ๋ฆฌ์— HTTP ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์ด ๋ฐ”๋กœ ์ž…๋ ฅ๋˜๊ณ  SQL ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „๋‹ฌ๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์œ„์˜ ์†Œ์Šค์ฝ”๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

$conn = mysqli_connect("example.com","spike","ilovejulia","bebop_db");
$stmt = $conn->prepare("INSERT INTO crews (firstname, lastname, email) VALUES (?, ?, ?)");

$stmt->bind_param("sss", $firstname, $lastname, $email);
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];

$email = $_POST['email'];
$stmt->execute();

 SQL ์ฟผ๋ฆฌ์˜ INSERT ๊ตฌ๋ฌธ์„ ๋ณด์‹œ๋ฉด VALUES ์ ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋  ๊ณณ์€ ๋ฌผ์Œํ‘œ(?)๋กœ ํ‘œ๊ธฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ Placeholder๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 ์ด SQL ์ฟผ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ „์†ก๋˜๊ณ , ์ถ”ํ›„ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ(๋ฐ”์ธ๋”ฉ)ํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.


์ตœ์†Œ ๊ถŒํ•œ & ๊ธฐ๋Šฅ ์‚ฌ์šฉ

 DBA๋‚˜ ๊ณ ๊ธ‰ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผํ•˜๋ฉฐ, ๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


DB ์ตœ์‹  ํŒจ์น˜

 ์‚ฌ์šฉ ์ค‘์ธ DB์˜ ์ œ์ž‘์‚ฌ๊ฐ€ ๋ฐœํ‘œํ•œ ๋‚ด์šฉ๋Œ€๋กœ ์ตœ์‹  ํŒจ์น˜๋ฅผ ์ง€์†์ ์œผ๋กœ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

์ฐธ๊ณ  ์ด๋ฏธ์ง€

 

  1. DB์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด [๋ณธ๋ฌธ์œผ๋กœ]
  2. ์ผ๋ จ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋งˆ์น˜ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ์˜ ์ง‘ํ•ฉ [๋ณธ๋ฌธ์œผ๋กœ]
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฏธ๋ฆฌ ์ •์˜๋œ ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” ๋ฃจํ‹ด [๋ณธ๋ฌธ์œผ๋กœ]
  4. Windows ๋ช…๋ น ์…ธ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰์„ ์œ„ํ•ด ๋ฌธ์ž์—ด๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ถœ๋ ฅ์€ ํ…์ŠคํŠธ ํ–‰์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]