Search
Duplicate

SQL Injection

์ƒ์„ฑ์ผ
2023/02/21 08:03
ํƒœ๊ทธ
DB

SQL Injection

SQL ์ธ์ ์…˜์ด๋ž€?

โ€ข
SQL ์ธ์ ์…˜์€ ์›น ์‚ฌ์ดํŠธ์˜ ๋ณด์•ˆ์ƒ ํ—ˆ์ ์„ ์ด์šฉํ•ด ํŠน์ • SQL ์ฟผ๋ฆฌ ๋ฌธ์„ ์ „์†กํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” DB์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ•ดํ‚น ๊ธฐ๋ฒ•์ด๋‹ค.
โ€ข
๋Œ€๋ถ€๋ถ„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๋Œ€๋กœ ํ•„ํ„ฐ๋งํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•œ๋‹ค.
โ€ข
๊ณต๊ฒฉ ๋‚œ์ด๋„๊ฐ€ ์‰ฝ๊ณ , ํ”ผํ•ด ๊ทœ๋ชจ๊ฐ€ ์ƒ๋‹คํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ์œ„ํ˜‘ 1์ˆœ์œ„๋กœ ๋ถˆ๋ฆด ๋งŒํผ ์ค‘์š”ํ•œ ๊ธฐ๋ฒ•์ด๋‹ค.

SQL ์ธ์ ์…˜ ์˜ˆ์‹œ

โ€ข
๊ฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž๊ฒฉ์ฆ ๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ
โ€ข
SQL ์ง„ํ–‰์€ anjinma ํด๋ผ์ด์–ธํŠธ๊ฐ€ โ€˜์ž๊ฒฉ์ฆ ๋ฒˆํ˜ธ ์กฐํšŒโ€™๋ฅผ ํด๋ฆญํ•˜์—ฌ anjinma๋ผ๋Š” ์ด๋ฆ„์ด ์›น์„œ๋ฒ„์— ์ „์†ก๋˜๊ณ , DB์— ์ž…๋ ฅํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋ฉด ์ž๊ฒฉ์ฆ DB๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
โ€ข
blackhat ํด๋ผ์ด์–ธํŠธ๋Š” anjinma ํด๋ผ์ด์–ธํŠธ์˜ ์ž๊ฒฉ์ฆ ๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ, SQL๋ฌธ์„ ์ˆ˜์ •ํ•˜์ง€๋งŒ ๊ถŒํ•œ์ด ์—†์–ด์„œ ์ž๊ฒฉ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค.
โ€ข
http://license12345.com/mysearch?=anjinma url์„ ์ „์†กํ•  ๋•Œ anjinma๊ฐ€ ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ์œผ๋ฉด, ์ •์ƒ์ ์œผ๋กœ ์ž๊ฒฉ์ฆ ๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, blackhat์ด ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ์œผ๋ฉด ์ž๊ฒฉ์ฆ ๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์—†๋‹ค.
โ€ข
๊ณต๊ฒฉ์ž์ธ blackhat์€ url ๋’ค์— โ€˜ or โ€˜ โ€˜1โ€™ = โ€˜1โ€™์„ ๋„ฃ์–ด์ค˜์„œ ํ•ญ์ƒ ์ฐธ์ด ๋˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ์ž๊ฒฉ์ฆ ๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•ด ์˜จ๋‹ค.

SQL ์ธ์ ์…˜์˜ ์ข…๋ฅ˜

1.
Error based SQL Injection - ๋…ผ๋ฆฌ์  ์—๋Ÿฌ๋ฅผ ์ด์šฉํ•œ SQL Injection
โ€ข
์•ž์„œ ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•œ ๊ธฐ๋ฒ•์œผ๋กœ, ํ•ด๋‹น ๊ธฐ๋ฒ•์œผ๋กœ SQL ์ธ์ ์…˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์„ ์„ค๋ช…ํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.
2.
UNION based SQL Injection = UNION ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•œ SQL Injection
โ€ข
SQL UNION์ด๋ž€?
โ—ฆ
์—ฌ๋Ÿฌ๊ฐœ์˜ SQL๋ฌธ์„ ํ•ฉ์ณ ํ•˜๋‚˜์˜ SQL๋ฌธ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
โ—ฆ
UNION๊ณผ UNION ALL๋กœ ๋‚˜๋‰˜๋Š”๋ฐ, ์ค‘๋ณต ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ์•ˆํ•˜๊ณ ์˜ ์ฐจ์ด์ด๋‹ค.
SELECT name FROM classa UNION SELECT name FROM classb;
SQL
๋ณต์‚ฌ
ํ•˜๊ฒŒ ๋˜๋ฉด, ํด๋ž˜์Šค A์™€ ํด๋ž˜์Šค B ์ด๋ฆ„๋“ค์ด ํ•ฉ์ณ์ ธ์„œ ์ถœ๋ ฅ๋œ๋‹ค.
โ—ฆ
UNION์œผ๋กœ ํ•ฉ์ณ์ง€๋Š” ๋‘ ํ…Œ์ด๋ธ”์€ ์ปฌ๋Ÿผ ๊ฐฏ์ˆ˜๊ฐ€ ์ผ์น˜ํ•ด์•ผ๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
โ—ฆ
[์™ธ๋ถ€ ์ž…๋ ฅ]
โ—ฆ
ID: testโ€™ UNION SELECT 1, 1 โ€”
โ—ฆ
PW: anything
โ—ฆ
[์‹คํ–‰ ์ฟผ๋ฆฌ]
select * from users where id='test' UNION select 1,1 -- and PW='anything'
SQL
๋ณต์‚ฌ
โ—ฆ
์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉด users ํ…Œ์ด๋ธ”์— ๋“ฑ๋ก๋œ Id์™€ pw ๋ชฉ๋ก์„ ์ „๋ถ€ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
3.
Blind SQL Injection - Boolean based Blind SQL Injection
โ€ข
Blind SQL Injection์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ํŠน์ •ํ•œ ๊ฐ’์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š๊ณ , ๋‹จ์ˆœํžˆ ์ฐธ๊ณผ ๊ฑฐ์ง“์˜ ์ •๋ณด๋งŒ ์•Œ ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
โ€ข
๋กœ๊ทธ์ธ ํผ์— SQL Injection์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋กœ๊ทธ์ธ ์„ฑ๊ณต๊ณผ ๋กœ๊ทธ์ธ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ์ด์šฉํ•˜์—ฌ, DB์˜ ํ…Œ์ด๋ธ” ์ •๋ณด ๋“ฑ์„ ์ถ”์ถœํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
4.
Blind SQL Injection - Time based SQL
โ€ข
Time Based SQL Injedction ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํŠน์ •ํ•œ ์‘๋‹ต ๋Œ€์‹ ์— ์ฐธ ํ˜น์€ ๊ฑฐ์ง“์˜ ์‘๋‹ต์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด๋ฅผ ์œ ์ถ”ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
โ€ข
์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋Š” MySQL ๊ธฐ์ค€์œผ๋กœ SLEEP ๊ณผ BENCHMARK์ด๋‹ค.

SQL ์ธ์ ์…˜ ๋Œ€์‘

1.
์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ
โ€ข
SQL Injection์—์„œ ์‚ฌ์š”๋˜๋Š” ๊ธฐ๋ฒ•๊ณผ ํ‚ค์›Œ๋“œ๋Š” ๋งค์šฐ ๋งŽ๋‹ค.
โ€ข
์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ๋ฐ, ์„œ๋ฒ„ ๋‹จ์—์„œ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.
โ€ข
๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆํ•˜๊ฒŒ ๋˜๋ฉด, ์ˆ˜๋งŽ์€ ์ฐจ๋‹จ๋ฆฌ์ŠคํŠธ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ๊ณต๊ฒฉ์— ๊ฒ…๊ณตํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
โ€ข
๊ณต๋ฐฑ์œผ๋กœ ์น˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋งŽ์ด ์“ฐ์ด๋Š”๋ฐ, ์‚ฌ์‹ค ์ด ๋ฐฉ๋ฒ•๋„ ์ทจ์•ฝํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ๊ณต๊ฒฉ์ž๊ฐ€ SESELCTLECT๋ผ๊ณ  ์ž…๋ ฅ ์‹œ ์ค‘๊ฐ„์˜ SELECT๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ์น˜ํ™˜์ด ๋˜๋ฉด SELECT๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์™„์„ฑ๋˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณต๋ฐฑ ๋Œ€์‹  ๊ณต๊ฒฉ ํ‚ค์›Œ๋“œ์™€๋Š” ์˜๋ฏธ์—†๋Š” ๋‹จ์–ด๋กœ ์น˜ํ™˜๋˜์–ด์•ผ ํ•œ๋‹ค.
2.
Prepared Statement ๊ตฌ๋ฌธ ์‚ฌ์šฉ
โ€ข
์š”์ฆ˜์— ์“ฐ์ด๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์€ ์œ ์ € ์ž…๋ ฅ์ด ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์„ ํ•˜๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•˜๋Š” escape ํ•จ์ˆ˜์™€ prepared statement๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
โ€ข
prepared statement๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋ผ ์•ˆ์ „ํ•˜๋‹ค.
โ€ข
Prepared Statement ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— DBMS๊ฐ€ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , ๋Œ€๊ธฐํ•œ๋‹ค.
โ€ข
๊ทธ ํ›„, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์„ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•˜์—ฌ, ๊ณต๊ฒฉ ์ฟผ๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์€ ์ด๋ฏธ ์˜๋ฏธ ์—†๋Š” ๋‹จ์ˆœ ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์ฟผ๋ฆฌ๋ฌธ๋„ ๊ณต๊ฒฉ์ž์˜ ์˜๋„๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
3.
Error Message ๋…ธ์ถœ ๊ธˆ์ง€
โ€ข
๊ณต๊ฒฉ์ž๊ฐ€ SQL Injection์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ •๋ณด(ํ…Œ์ด๋ธ”๋ช…, ์ปฌ๋Ÿผ๋ช… ๋“ฑ)๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
โ€ข
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ, ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ์—๋Ÿฌ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.
โ€ข
์—ฌ๊ธฐ์„œ ํ…Œ์ด๋ธ” ๋ช… ๋ฐ ์ปฌ๋Ÿผ๋ช… ๊ทธ๋ฆฌ๊ณ  ์ฟผ๋ฆฌ๋ฌธ์ด ๋…ธ์ถœ์ด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ ํ˜น์€ ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค๋ฅผ ๋„์šฐ๋„๋ก ํ•ด์•ผํ•œ๋‹ค.
4.
์›น ๋ฐฉํ™”๋ฒฝ ์‚ฌ์šฉ
โ€ข
์›น ๊ณต๊ฒฉ ๋ฐฉ์–ด์— ํŠนํ™”๋˜์–ด ์žˆ๋Š” ์›น ๋ฐฉํ™”๋ฒฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•
โ€ข
์›น ๋ฐฉํ™”๋ฒฝ์€ ์†Œํ”„ํŠธ์›จ์–ด ํ˜•, ํ•˜๋“œ์›จ์–ด ํ˜•, ํ”„๋ก์‹œ ํ˜• ์ด๋ ‡๊ฒŒ ์„ธ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ,
โ€ข
์†Œํ”„ํŠธ์›จ์–ด ํ˜•์€ ์„œ๋ฒ„ ๋‚ด์— ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹
โ€ข
ํ•˜๋“œ์›จ์–ด ํ˜•์€ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ์„œ๋ฒ„ ์•ž ๋‹จ์— ์ง์ ‘ ํ•˜๋“œ์›จ์–ด ์žฅ๋น„๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ,
โ€ข
ํ”„๋ก์‹œ ํ˜•์€ DNS ์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์›น ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์„œ๋ฒ„๋กœ ๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ์ด ์›น ๋ฐฉํ™”๋ฒฝ์„ ๋จผ์ € ๊ฑฐ์น˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

ref)