๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ŒCS/DB

[DB] SQL Injection

by dar0m! 2021. 10. 13.


ํ•ด์ปค์— ์˜ํ•ด ์กฐ์ž‘๋œ SQL ์ฟผ๋ฆฌ๋ฌธ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋˜์–ด ๋น„์ •์ƒ์  ๋ช…๋ น์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•

 

1. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•

1.1. Error based SQL Injection

๋ณดํ†ต ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ, ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ input ์ฐฝ์— ์ž…๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

์œ„์˜ ์‚ฌ์ง„์—์„œ ๋ณด์ด๋Š” ์ฟผ๋ฆฌ๋ฌธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ๊ทธ์ธ ์‹œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” SQL ๊ตฌ๋ฌธ์ด๋‹ค. ํ•ด๋‹น ๊ตฌ๋ฌธ์—์„œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ์—†์Œ์„ ํ™•์ธํ•˜๊ณ , ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜์˜ SQL ๊ตฌ๋ฌธ์„ ์ฃผ์ž…ํ–ˆ๋‹ค. ์ฃผ์ž…๋œ ๋‚ด์šฉ์€ ‘ OR 1=1 -- ๋กœ  WHERE ์ ˆ์— ์žˆ๋Š” ์‹ฑ๊ธ€์ฟผํ„ฐ๋ฅผ ๋‹ซ์•„์ฃผ๊ธฐ ์œ„ํ•œ ์‹ฑ๊ธ€์ฟผํ„ฐ์™€ OR 1=1 ๋ผ๋Š” ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด WHERE ์ ˆ์„ ๋ชจ๋‘ ์ฐธ์œผ๋กœ ๋งŒ๋“ค๊ณ , -- ๋ฅผ ๋„ฃ์–ด์คŒ์œผ๋กœ ๋’ค์˜ ๊ตฌ๋ฌธ์„ ๋ชจ๋‘ ์ฃผ์„ ์ฒ˜๋ฆฌ ํ–ˆ๋‹ค.

  ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์ด์ง€๋งŒ, ๊ฒฐ๋ก ์ ์œผ๋กœ Users ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋จ์œผ๋กœ ์จ ๊ฐ€์žฅ ๋จผ์ € ๋งŒ๋“ค์–ด์ง„ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๊ฒŒ ๋œ๋‹ค. ๋ณดํ†ต์€ ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ๋งจ ์ฒ˜์Œ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌ์ž ๊ณ„์ •์— ๋กœ๊ทธ์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ํƒˆ์ทจํ•œ ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๋Š” ๊ด€๋ฆฌ์ž์˜ ๊ถŒํ•œ์„ ์ด์šฉํ•ด ๋˜ ๋‹ค๋ฅธ 2์ฐจ ํ”ผํ•ด๋ฅผ ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

1.2. Union based SQL Injection

SQL ์—์„œ Union ํ‚ค์›Œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ฉํ•ด์„œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•˜๋Š” ํ‚ค์›Œ๋“œ ์ด๋‹ค. ์ •์ƒ์ ์ธ ์ฟผ๋ฆฌ๋ฌธ์— Union ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ ์…˜์— ์„ฑ๊ณตํ•˜๋ฉด, ์›ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Union Injection์„ ์„ฑ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€์˜ ์กฐ๊ฑด์ด ์žˆ๋‹ค. 1. Union ํ•˜๋Š” ๋‘ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ์ˆ˜๊ฐ€ ๊ฐ™์•„์•ผ ํ•˜๊ณ , 2. ๋ฐ์ดํ„ฐ ํ˜•์ด ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

์œ„์˜ ์‚ฌ์ง„์—์„œ ๋ณด์ด๋Š” ์ฟผ๋ฆฌ๋ฌธ์€ Board ๋ผ๋Š” ํ…Œ์ด๋ธ”์—์„œ ๊ฒŒ์‹œ๊ธ€์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์„ title ๊ณผ contents ์ปฌ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋ž‘ ๋น„๊ตํ•œ ๋’ค ๋น„์Šทํ•œ ๊ธ€์ž๊ฐ€ ์žˆ๋Š” ๊ฒŒ์‹œ๊ธ€์„ ์ถœ๋ ฅํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž…๋ ฅ๊ฐ’์œผ๋กœ Union ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์ปฌ๋Ÿผ ์ˆ˜๋ฅผ ๋งž์ถฐ์„œ SELECT ๊ตฌ๋ฌธ์„ ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด ๋‘ ์ฟผ๋ฆฌ๋ฌธ์ด ํ•ฉ์ณ์„œ์„œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค. ํ˜„์žฌ ์ธ์ ์…˜ ํ•œ ๊ตฌ๋ฌธ์€ ์‚ฌ์šฉ์ž์˜ id์™€ passwd๋ฅผ ์š”์ฒญํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์ด๋‹ค. ์ธ์ ์…˜์ด ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜๋ฉด, ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ์ •๋ณด๊ฐ€ ๊ฒŒ์‹œ๊ธ€๊ณผ ํ•จ๊ป˜ ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค. 

 ๋ฌผ๋ก  ํŒจ์Šค์›Œ๋“œ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ ์ธ์ ์…˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์—์„œ ์ด๋ฏธ ๊ทธ ์ด์ƒ์˜ ๋ณด์•ˆ์œ„ํ—˜์— ๋…ธ์ถœ๋˜์–ด ์žˆ๋‹ค. ์ด ๊ณต๊ฒฉ๋„ ์—ญ์‹œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

1.3. Blind SQL Injection

Blind SQL Injection์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ํŠน์ •ํ•œ ๊ฐ’์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š๊ณ , ๋‹จ์ˆœํžˆ ์ฐธ๊ณผ ๊ฑฐ์ง“์˜ ์ •๋ณด๋งŒ ์•Œ ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋กœ๊ทธ์ธ ํผ์— SQL Injection์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ฐ€์ • ํ–ˆ์„ ๋•Œ, ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋กœ๊ทธ์ธ ์„ฑ๊ณต๊ณผ ๋กœ๊ทธ์ธ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ, DB์˜ ํ…Œ์ด๋ธ” ์ •๋ณด ๋“ฑ์„ ์ถ”์ถœํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

1.3.1. Boolean based SQL 

์œ„์˜ ๊ทธ๋ฆผ์€ Blind Injection์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๋ช…์„ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. (MySQL) ์ธ์ ์…˜์ด ๊ฐ€๋Šฅํ•œ ๋กœ๊ทธ์ธ ํผ์„ ํ†ตํ•˜์—ฌ ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๋Š” ์ž„์˜๋กœ ๊ฐ€์ž…ํ•œ abc123 ์ด๋ผ๋Š” ์•„์ด๋””์™€ ํ•จ๊ป˜ abc123’ and ASCII(SUBSTR(SELECT name From information_schema.tables WHERE table_type=’base table’ limit 0,1)1,1)) > 100 -- ์ด๋ผ๋Š” ๊ตฌ๋ฌธ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

 ํ•ด๋‹น๊ตฌ๋ฌธ์€ MySQL ์—์„œ ํ…Œ์ด๋ธ” ๋ช…์„ ์กฐํšŒํ•˜๋Š” ๊ตฌ๋ฌธ์œผ๋กœ limit ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋งŒ ์กฐํšŒํ•˜๊ณ , SUBSTR ํ•จ์ˆ˜๋กœ ์ฒซ ๊ธ€์ž๋งŒ, ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ASCII ๋ฅผ ํ†ตํ•ด์„œ ascii ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ์กฐํšŒ๋˜๋Š” ํ…Œ์ด๋ธ” ๋ช…์ด Users ๋ผ๋ฉด ‘U’ ์ž๊ฐ€ ascii ๊ฐ’์œผ๋กœ ์กฐํšŒ๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ๋’ค์˜ 100 ์ด๋ผ๋Š” ์ˆซ์ž ๊ฐ’๊ณผ ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.  ๊ฑฐ์ง“์ด๋ฉด ๋กœ๊ทธ์ธ ์‹คํŒจ๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ฐธ์ด ๋  ๋•Œ๊นŒ์ง€ ๋’ค์˜ 100์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด ๊ฐ€๋ฉด์„œ ๋น„๊ต๋ฅผ ํ•œ๋‹ค.  ๊ณต๊ฒฉ์ž๋Š” ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•˜์—ฌ ๋‹จ๊ธฐ๊ฐ„ ๋‚ด์— ํ…Œ์ด๋ธ” ๋ช…์„ ์•Œ์•„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

1.3.2. Time based SQL

Time Based SQL Injection ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํŠน์ •ํ•œ ์‘๋‹ต ๋Œ€์‹ ์— ์ฐธ ํ˜น์€ ๊ฑฐ์ง“์˜ ์‘๋‹ต์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด๋ฅผ ์œ ์ถ”ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋Š” MySQL ๊ธฐ์ค€์œผ๋กœ SLEEP ๊ณผ BENCHMARK ์ด๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์€ Time based SQL Injection์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธธ์ด๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋กœ๊ทธ์ธ ํผ์— ์ฃผ์ž…์ด ๋˜์—ˆ์œผ๋ฉฐ ์ž„์˜๋กœ abc123 ์ด๋ผ๋Š” ๊ณ„์ •์„ ์ƒ์„ฑํ•ด ๋’€๋‹ค. ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ abc123’ OR (LENGTH(DATABASE())=1 AND SLEEP(2)) – ์ด๋ผ๋Š” ๊ตฌ๋ฌธ์„ ์ฃผ์ž…ํ–ˆ๋‹ค. ์—ฌ๊ธฐ์„œ LENGTH ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , DATABASE ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ฃผ์ž…๋œ ๊ตฌ๋ฌธ์—์„œ, LENGTH(DATABASE()) = 1 ๊ฐ€ ์ฐธ์ด๋ฉด SLEEP(2) ๊ฐ€ ๋™์ž‘ํ•˜๊ณ , ๊ฑฐ์ง“์ด๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ์ˆซ์ž 1 ๋ถ€๋ถ„์„ ์กฐ์ž‘ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธธ์ด๋ฅผ ์•Œ์•„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ์— SLEEP ์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์น˜ํ™˜์ฒ˜๋ฆฌ ๋˜์–ด์žˆ๋‹ค๋ฉด, ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ BENCHMARK ๋‚˜ WAIT ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค. BENCHMARK ๋Š” BENCHMARK(1000000, AES_ENCRYPT('hello','goodbye')); ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๊ตฌ๋ฌธ์„ ์‹คํ–‰ ํ•˜๋ฉด ์•ฝ 4.74์ดˆ๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

1.4. Stored Procedure SQL Injection

์ €์žฅ๋œ ํ”„๋กœ์‹œ์ € ์—์„œ์˜ SQL Injection

์ €์žฅ ํ”„๋กœ์‹œ์ €(Stored Procedure) ์€ ์ผ๋ จ์˜ ์ฟผ๋ฆฌ๋“ค์„ ๋ชจ์•„ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ๊ณต๊ฒฉ์— ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์ €์žฅ ํ”„๋กœ์‹œ์ €๋Š” MS-SQL ์— ์žˆ๋Š” xp_cmdshell๋กœ ์œˆ๋„์šฐ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋‹จ, ๊ณต๊ฒฉ์ž๊ฐ€ ์‹œ์Šคํ…œ ๊ถŒํ•œ์„ ํš๋“ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ณต๊ฒฉ ๋‚œ์ด๋„๊ฐ€ ๋†’์œผ๋‚˜ ๊ณต๊ฒฉ์— ์„ฑ๊ณตํ•œ๋‹ค๋ฉด, ์„œ๋ฒ„์— ์ง์ ‘์ ์ธ ํ”ผํ•ด๋ฅผ ์ž…ํž ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ด๋‹ค.

 1.5. Mass SQL Injection

๋‹ค๋Ÿ‰์˜ SQL Injection ๊ณต๊ฒฉ

 2008๋…„์— ์ฒ˜์Œ ๋ฐœ๊ฒฌ๋œ ๊ณต๊ฒฉ๊ธฐ๋ฒ•์œผ๋กœ ๊ธฐ์กด SQL Injection ๊ณผ ๋‹ฌ๋ฆฌ ํ•œ๋ฒˆ์˜ ๊ณต๊ฒฉ์œผ๋กœ ๋‹ค๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์กฐ์ž‘๋˜์–ด ํฐ ํ”ผํ•ด๋ฅผ ์ž…ํžˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ณดํ†ต MS-SQL์„ ์‚ฌ์šฉํ•˜๋Š” ASP ๊ธฐ๋ฐ˜ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ฟผ๋ฆฌ๋ฌธ์€ HEX ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ ํ•˜์—ฌ ๊ณต๊ฒฉํ•œ๋‹ค. ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ’์„ ๋ณ€์กฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•…์„ฑ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ , ์‚ฌ์šฉ์ž๋“ค์ด ๋ณ€์กฐ๋œ ์‚ฌ์ดํŠธ์— ์ ‘์† ์‹œ ์ข€๋น„PC๋กœ ๊ฐ์—ผ๋˜๊ฒŒ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ์—ผ๋œ ์ข€๋น„ PC๋“ค์€ DDoS ๊ณต๊ฒฉ์— ์‚ฌ์šฉ๋œ๋‹ค.



2. ๋ฐฉ์–ด ๋ฐฉ๋ฒ•

2.1. ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ

  • input ๊ฐ’์„ ๋ฐ›์„ ๋•Œ, ํŠน์ˆ˜๋ฌธ์ž ์—ฌ๋ถ€ ๊ฒ€์‚ฌํ•˜๊ธฐ
  • ๋กœ๊ทธ์ธ ์ „, ๊ฒ€์ฆ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฏธ๋ฆฌ ์„ค์ •ํ•œ ํŠน์ˆ˜๋ฌธ์ž๋“ค์ด ๋“ค์–ด์™”์„ ๋•Œ ์š”์ฒญ์„ ๋ง‰์•„๋‚ธ๋‹ค.
  • SQL Injection ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ฒ•๊ณผ ํ‚ค์›Œ๋“œ๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ๋ฐ, ์„œ๋ฒ„ ๋‹จ์—์„œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค. ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•˜๊ฒŒ ๋˜๋ฉด ์ˆ˜๋งŽ์€ ์ฐจ๋‹จ๋ฆฌ์ŠคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ๊ณต๊ฒฉ์— ์„ฑ๊ณตํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ณต๋ฐฑ์œผ๋กœ ์น˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋งŽ์ด ์“ฐ์ด๋Š”๋ฐ, ์ด ๋ฐฉ๋ฒ•๋„ ์ทจ์•ฝํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณต๊ฒฉ์ž๊ฐ€ SESELECTLECT ๋ผ๊ณ  ์ž…๋ ฅ ์‹œ ์ค‘๊ฐ„์˜ SELECT๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ์น˜ํ™˜์ด ๋˜๋ฉด SELECT ๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์™„์„ฑ๋˜๊ฒŒ ๋œ๋‹ค. ๊ณต๋ฐฑ ๋Œ€์‹  ๊ณต๊ฒฉ ํ‚ค์›Œ๋“œ์™€๋Š” ์˜๋ฏธ ์—†๋Š” ๋‹จ์–ด๋กœ ์น˜ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค.

2.2. Error Message ๊ฐ์ถ”๊ธฐ

  • SQL ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ, ํ•ด๋‹นํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ฐ์ถ”๊ธฐ
  • view๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์—๋Š” ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋†’์ธ๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” view๋กœ๋งŒ ์ ‘๊ทผํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ๋ณผ ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ ๋‹ค.
  • ๊ณต๊ฒฉ์ž๊ฐ€ SQL Injection์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด(ํ…Œ์ด๋ธ”๋ช…, ์ปฌ๋Ÿผ๋ช… ๋“ฑ)๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค๋ฉด, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ์—๋Ÿฌ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. ์—ฌ๊ธฐ์„œ ํ…Œ์ด๋ธ”๋ช… ๋ฐ ์ปฌ๋Ÿผ๋ช… ๊ทธ๋ฆฌ๊ณ  ์ฟผ๋ฆฌ๋ฌธ์ด ๋…ธ์ถœ์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ ํ˜น์€ ๋ฉ”์‹œ์ง€๋ฐ•์Šค๋ฅผ ๋„์šฐ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

2.3. Prepared Statement ์‚ฌ์šฉํ•˜๊ธฐ

  • Prepared Statement๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์ž๋™์œผ๋กœ escaping ํ•ด์ค€๋‹ค. (statement์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฟผ๋ฆฌ๋ฌธ์—์„œ ์ „๋‹ฌ์ธ์ž ๊ฐ’์„ ?๋กœ ๋ฐ›๋Š” ๊ฒƒ) ์ด๋ฅผ ํ™œ์šฉํ•ด ์„œ๋ฒ„ ์ธก์—์„œ ํ•„ํ„ฐ๋ง ๊ณผ์ •์„ ํ†ตํ•ด์„œ ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— DBMS๊ฐ€ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ํ•˜์—ฌ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐํ•œ๋‹ค. ๊ทธ ํ›„ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•˜์—ฌ ๊ณต๊ฒฉ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์€ ์ด๋ฏธ ์˜๋ฏธ ์—†๋Š” ๋‹จ์ˆœ ๋ฌธ์ž์—ด ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์ฟผ๋ฆฌ๋ฌธ๋„ ๊ณต๊ฒฉ์ž์˜ ์˜๋„๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

2.4. ์›น ๋ฐฉํ™”๋ฒฝ ์‚ฌ์šฉ

์›น ๊ณต๊ฒฉ ๋ฐฉ์–ด์— ํŠนํ™”๋˜์–ด์žˆ๋Š” ์›น ๋ฐฉํ™”๋ฒฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด๋‹ค. ์›น ๋ฐฉํ™”๋ฒฝ์€ ์†Œํ”„ํŠธ์›จ์–ด ํ˜•, ํ•˜๋“œ์›จ์–ด ํ˜•, ํ”„๋ก์‹œ ํ˜• ์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์†Œํ”„ํŠธ์›จ์–ด ํ˜•์€ ์„œ๋ฒ„ ๋‚ด์— ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ , ํ•˜๋“œ์›จ์–ด ํ˜•์€ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์„œ๋ฒ„ ์•ž ๋‹จ์— ์ง์ ‘ ํ•˜๋“œ์›จ์–ด ์žฅ๋น„๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ”„๋ก์‹œ ํ˜•์€ DNS ์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์›น ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์„œ๋ฒ„๋กœ ๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์›น ๋ฐฉํ™”๋ฒฝ์„ ๋จผ์ € ๊ฑฐ์น˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์ฐธ๊ณ 

๋Œ“๊ธ€