Archive for Dev. (junyup2)

์ง€์‹์„ ์ฑ„์›Œ๊ฐ€๋Š” ใ€Ž๊ฐœ๋ฐœ์ž/ํ™”์ดํŠธํ•ด์ปคใ€๋ฅผ ๋ชฉํ‘œ๋กœ ์ •๋ฆฌํ•˜๋Š” ๋ธ”๋กœ๊ทธ

๋ชจ์˜ ํ•ดํ‚น ์Šคํ„ฐ๋””/๋ชจ์˜ ํ•ดํ‚น - ๊ธฐ๋ก์ผ์ง€

[๊ธฐ๋ก์ผ์ง€] ๐Ÿ“š 08์ฃผ์ฐจ (๐Ÿ’‰SQLi - Find Vuln Point / ๋Œ€์‘ ๋ฐฉ์•ˆ)

Gearvirus(junyup2) 2023. 12. 14. 19:32

SQL Injection Advanced Ver.

SQL Injection Vuln Point

์•ž์„œ์„œ ๊ณต๋ถ€ํ–ˆ๋˜ SQLi๋ฅผ ๋ณด๋ฉด '์–ด๋””์—(Where)', '์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ(How)' ๊ณต๊ฒฉํ•˜๋ฉด๋˜๋Š”์ง€๋ฅผ ์•Œ๋ ค์ค€ ์ƒํƒœ์—์„œ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค๋ฌด์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ๋Œ€๋†“๊ณ 

"์—ฌ๊ธฐ๊ฐ€ ์ด๋Ÿฐ ์ทจ์•ฝ์ ์ด ์žˆ์œผ๋‹ˆ ๋šซ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.~"

ํ•˜๊ณ  ์นœ์ ˆํ•˜๊ฒŒ ์•Œ๋ ค์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๊ณต๋ถ€ํ•  ๋•Œ๋ถ€ํ„ฐ ์ทจ์•ฝ์ ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์—ฐ์Šตํ•ด์•ผ ํ•œ๋‹ค.

์šฐ์„ ์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด๋ณด๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ์ด๋™๋˜๋Š” ํŽ˜์ด์ง€์™€, ์˜ค๊ณ ๊ฐ€๋Š” ํŒจํ‚ท(Packet)์„ ๋ถ„์„ํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ผ๋‹จ. ์„œ๋น„์Šค๋ฅผ ์ง์ ‘ ์ด์šฉํ•ด๋ณด์ง€ ์•Š๋Š”๋‹ค๋ฉด? ์–ด๋–ป๊ฒŒ ๊ตฌ๋™๋˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ๊ธธ์ด ์—†๋‹ค. ์–ด๋–ค์‹์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ง์ ‘ ์ด์šฉํ•ด๋ณด๋Š”๊ฒŒ BEST ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ํ•œ๊ฐ€์ง€ ์ฐฉ๊ฐ์„ ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ธ์ง€ ํ•ด์•ผ ํ•œ๋‹ค.

 

์‚ฌ์šฉ์ž ์ž…๋ ฅ

'์‚ฌ์šฉ์ž ์ž…๋ ฅ' ์ด๋ผ๊ณ  ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ค์ œ๋กœ ์ž…๋ ฅ ์ฐฝ์ด ๋…ธ์ถœ๋˜์–ด์žˆ๋Š” ์ž…๋ ฅ ๊ฐ€๋Šฅํ•œ ์ฐฝ๋งŒ์„ ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ(params)๊ฐ€ ์กด์žฌํ•˜๋Š”, DB์—๊ฒŒ SQL ์งˆ์˜๋ฌธ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ณณ ์ด๋ผ๋ฉด ์–ด๋””๋“ ์ง€ ์ทจ์•ฝ์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค.

(์ด Data๋Š” DB์—์„œ, SQL ์งˆ์˜๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋‚˜! ํ•˜๋Š” ๊ฒƒ์„ Catchํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.)

 

ํŒŒ๋ผ๋ฏธํ„ฐ

๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์—์„œ ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ DB์—์„œ SQL ์งˆ์˜๋ฌธ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ถœ๋ ฅ์„ ํ•ด์คฌ๊ตฌ๋‚˜! ํ•จ์„ ์ธ์ง€ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

SELECT / WHERE / LIKE ๋“ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์ง€ํ•ด์•ผํ•˜๊ณ , ์ด๋ฅผ ๋จธ๋ฆฌ์†์—์„œ ๋ฐ”๋กœ๋ฐ”๋กœ ๊ทธ๋ ค์ง€๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

 

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

 

and '1' 

'์˜๋ฏธ ์—†๋Š” ๊ฐ’, ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ์—๋Š” ์ง€์žฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฐ’' ์„ ์ถ”๊ฐ€ํ•ด๋ด„์œผ๋กœ์จ SQL Injection์ด ๊ฐ€๋Šฅํ•œ์ง€์˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

WHERE user_id like '%___%' and '1'

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ and'1' ์„ ์ถ”๊ฐ€ํ•ด ๋ด์•ผ ํ•œ๋‹ค.

gear / gear%' and '1%'='1

gear ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ์™€ gear%' and '1%'='1 ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ์˜  ๋‘ ๊ฒฐ๊ณผ๊ฐ€  ๊ฐ™๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” SQL Injection์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

(and '1%'='1 : ์˜๋ฏธ ์—†๋Š” ๊ฐ’์ด์ง€๋งŒ, LIKE ๋ฌธ์˜ ํŠน์„ฑ์ƒ %์™€ ' ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋งž์ถฐ์ฃผ์–ด ๊ฒฐ๊ณผ์—๋Š” ์ง€์žฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด๋‹ค.)

 


์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์€ ํ™”๋ฉด์—์„œ ๊ธ€์ž๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์นธ๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค! 
์–ด๋–ค ๊ฐ’์„ ์ด์šฉํ•˜๋Š”์ง€ / ์–ด๋–ค์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„ํ„ฐ๋ง ๋˜๋Š”์ง€ / ์–ด๋–ค ์กฐ๊ฑด์— ๊ฑธ๋ ค์„œ ๋™์ž‘์ด ๋˜๋Š”์ง€ ๋ฅผ
ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด Burp Suite์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ทจ์•ฝ์ ์„ ์ฐพ์œผ๋ ค๋ฉด ๊ทธ๋ƒฅ ๋•Œ๋ ค ๋„ฃ์–ด๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,
ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ, ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•ด์•ผ ์ทจ์•ฝ์ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค !!

 

๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง์˜ ์ค‘์š”์„ฑ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.


์–ด๋–ค SQL์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

 

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

ํšŒ์›๊ฐ€์ž…์€ insert๋ฅผ ์“ฐ๊ฒ ์ง€.
insert into table() value()

"์ง€๊ธˆ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ SQL ๋ฌธ๊ตฌ์˜ ์–ด๋””์— ๋“ค์–ด๊ฐ€์„œ ๋™์ž‘ํ•  ๊ฒƒ์ธ๊ฐ€." ๋ฅผ ์ƒ๊ฐํ•ด๋ด์•ผํ•œ๋‹ค. (์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ํ…Œ์ŠคํŠธํ•˜์ž.)

๋งˆ์ดํŽ˜์ด์ง€
select ~~ where user_id = '____'


๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
option_val=title&board_result=?
select where (option_val) like '%user%'

Burp Suite์—์„œ Session์„ ๋ณด๋ฉด์„œ ํ™•์ธํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

cookie
user-Agent

์ฟ ํ‚ค์—์„œ๋„ SQL Injection์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ ํ•ด์•ผํ•œ๋‹ค.

 

(+) ์ƒ๊ฐ์„ ํ•ด๋ณด๊ธฐ

์ง€๊ธˆ ๋‚ด๊ฐ€ ์ง‘์–ด ๋„ฃ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„์— ์–ด๋–ป๊ฒŒ ๋“ค์–ด๊ฐ€์„œ ๋™์ž‘ํ•˜๊ณ  ์žˆ๊ตฌ๋‚˜!

ํŽ˜์ด๋กœ๋“œ(Payload)๋ฅผ ์งœ๊ณ  ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด๋ด์•ผํ•œ๋‹ค.

ํ•ดํ‚น ํˆด์€ SQL Query๋ฅผ ์ถ”๋ฆฌํ•˜์ง€๋Š” ๋ชปํ•œ๋‹ค. ์ฆ‰ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ฏผํ•ด์„œ SQL Query๋ฅผ ํ™•์ธํ•ด๋ด์•ผํ•œ๋‹ค.

(๋งˆ๊ตฌ์žก์ด๋กœ ๋•Œ๋ ค๋„ฃ๋‹ค๋ณด๋ฉด ๋ฐฉํ™”๋ฒฝ์— ์ฐจ๋‹จ๋œ๋‹ค.)

 

๋ชจ์˜ํ•ดํ‚น - ์ฃผ์„

๋ชจ์˜ํ•ดํ‚น ์‹œ์— ์›ฌ๋งŒํ•˜๋ฉด ์ฃผ์„์€ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์‹ค์ œ๋กœ ๋งŒ๋‚˜๋Š” ๋Œ€ํ˜• ์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ ์งˆ์˜๋ฌธ์ด ์—ฌ๋Ÿฌ์ค„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์„์œผ๋กœ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

(์ฃผ์„์ด ์–ด๋””์—์„œ ๋จนํžˆ๋Š”์ง€ ๊ฐ์ด ์•ˆ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•ด์•ผํ•œ๋‹ค.)

 

SQL ์‚ฝ์ž… ์œ„์น˜

'1'='1' and title (์ฐธ)
'1'='2' and title (๊ฑฐ์ง“)

์œ„์™€ ๊ฐ™์ด ์ฐธ/๊ฑฐ์ง“์„ ์•ž์ชฝ(๋ฐ˜๋Œ€์ชฝ)์—๋„ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•ด์•ผ ํ•œ๋‹ค.

์–ด๋–ค ๋ฐ์ดํ„ฐ๋ƒ์— ๋”ฐ๋ผ ์–ด๋Š ์œ„์น˜์— ๋„ฃ์–ด์ค˜์•ผํ•˜๋Š”์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•œ๋‹ค.


์ทจ์•ฝ์  ๋ฐœ์ƒ ์œ„์น˜

1. cookie, HTTP ์š”์ฒญ ํ—ค๋”
2. column
3. order by ์ ˆ SQL Injection (๊ฐ€์žฅ ์ทจ์•ฝ์ ์ด ๋งŽ์ด ์ผ์–ด๋‚˜๋Š”๊ณณ)

order by ์ ˆ

sort -> order by (order by ์ ˆ์˜ SQL Injection)

(์ฐธ/๊ฑฐ์ง“ ์กฐ๊ฑด์„ ์–ด๋–ป๊ฒŒ ์‘ค์…” ๋„ฃ์„๊นŒ?!)

case when

SQL ์งˆ์˜๋ฌธ์˜ if ๋ฌธ (๋งŒ์•ฝ์—) ์—ญํ• 

case when (์กฐ๊ฑด)  then (์ฐธ์ผ ๋•Œ) else (๊ฑฐ์ง“์ผ ๋•Œ) end
case when (1=1) then 1 else 2 end

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

-> case when (1=1) then username else title end  (์ฐธ)
-> case when (1=2) then username else title end  (๊ฑฐ์ง“)

์ •๋ ฌ์˜ ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ์ฐธ/๊ฑฐ์ง“

์ •๋ ฌ์˜ ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ •๋ ฌ๋˜๋Š” ๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ ์ฐธ์ธ ๊ฒฝ์šฐ์™€ ๊ฑฐ์ง“์ธ ๊ฒฝ์šฐ์˜ ์ •๋ ฌ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒํ•˜์—ฌ ์ฐธ/๊ฑฐ์ง“์„ ํŒ๋‹จ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด ๋ฐฉ์‹์€ ์ •๋ ฌ์„ ์œ„ํ•œ column์„ ์•Œ์•„์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.)
(์ฐธ ๊ณผ ๊ฑฐ์ง“์„ ๊ตฌ๋ถ„ํ•˜๋Š” ์กฐ๊ฑด์„ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Blind Injection์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.)

ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ column๋ช…์„ ์ •ํ™•ํžˆ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ๋‹ค.

๊ทธ๋Ÿด ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ผ๋ถ€๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์—๋Ÿฌ ๋ฐœ์ƒ์— ์˜ํ•œ ์ฐธ/๊ฑฐ์ง“

case when (1=1) then 1 else (select 1 union select 2) end

ํ–‰์ด 2๊ฐœ๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋ฏ€๋กœ order byํ–‰์ด 2๊ฐœ?! value๊ฐ€ ์•„๋‹ˆ๋ผ matrix๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๋Š” ๊ฒƒ์ด ๋˜์–ด๋ฒ„๋ฆฌ๋ฏ€๋กœ ์ถœ๋ ฅ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.

order by ์ ˆ์— select 1 ์ด๋ผ๊ณ  ๋„ฃ์–ด์ค€๋‹ค๋ฉด? select 1 ๊ณผ 1 ์„ ๋„ฃ์–ด์ค€ ๊ฒƒ์€ ๊ฐ™๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ select 1 union select 2 ์„ ๋„ฃ์–ด์ค€๋‹ค๋ฉด? ํ–‰์ด ํ•˜๋‚˜๋งŒ ๋‚˜์™€์•ผํ•˜๋Š”๋ฐ matrix ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜์–ด ๊ตฌ์กฐ์ฒด๊ฐ€ ๋‚˜์˜จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์‹คํ–‰์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์•„๋ฌด๊ฒƒ๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ฒŒ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

select 1 union select 2 where (1=1)

์ฐธ์ธ ์กฐ๊ฑด์„ ๋„ฃ์œผ๋ฉด ๋‘˜๋‹ค ์ฐธ์ด๋ฏ€๋กœ
->  select 1 union select 2 ๊ฐ€ ๋˜์–ด ์•„๋ฌด ์ถœ๋ ฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. 

select 1 union select 2 where (1=2)

ํ•˜์ง€๋งŒ ๊ฑฐ์ง“์ธ ์กฐ๊ฑด์„ ๋„ฃ์œผ๋ฉด ๋’ค๊ฐ€ ๊ฑฐ์ง“์ด๋ฏ€๋กœ
-> select 1 ๊ฐ€ ๋˜์–ด (๋’ท๋ถ€๋ถ„์ด ๊ฑฐ์ง“์ด๋ฏ€๋กœ ์‚ฌ๋ผ์ง„๋‹ค.) ์ถœ๋ ฅ์ด ๋‚˜์˜จ๋‹ค.

์ผ๋ถ€๋Ÿฌ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜์—ฌ SQL Injection Point๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค.

์ฐธ์ธ ์กฐ๊ฑด๊ณผ ๊ฑฐ์ง“์ธ ์กฐ๊ฑด์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค๋ฉด?! (์ฐธ ๊ฑฐ์ง“์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ตฌ๋ถ„์ด ์•ˆ๋˜๋Š” ๊ฒฝ์šฐ or ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•ด์•ผ ํ•  ๋•Œ) ์ด๋Ÿฐ ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” Blind SQLi๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค๋ฉด?

์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค? / DB Error ๊ฐ€ ๋‚œ๋‹ค?

SQL Injection์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœ ์‹œ์ผœ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

user = user 'and'1'='1
user = user 'and'1'='2

๋‘ ๊ฐ’์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค๋ฉด? ์•„๋ž˜์™€ ๊ฐ™์ด ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœ ์‹œ์ผœ๋ณธ๋‹ค.

user = user 'and (select 1 union select 2 where (1=1)) and '1'='1
user = user 'and (select 1 union select 2 where (1=2)) and '1'='1

์ด๋ ‡๊ฒŒ ์ฐธ/๊ฑฐ์ง“์„ ์—๋Ÿฌ๋กœ์„œ ํ™•์ธํ•˜์—ฌ SQL Injection์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•

error ์œ ๋ฐœ

select 1 union select 2

SQLi์˜ ๋Œ€์‘ ๋ฐฉ์•ˆ

SQL Injection ๋Œ€์‘ ๋ฐฉ๋ฒ•

1. Prepared Statement

๋Œ€์‘ ๋ฐฉ๋ฒ• 1. prepared statement

SQL ์งˆ์˜๋ฌธ์„ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (SQL ์งˆ์˜๋ฌธ์„ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•œ๋‹ค.)

-> ๋ฏธ๋ฆฌ ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊พธ์–ด ๋†“๋Š”๋‹ค๋Š” ๊ฒƒ์œผ๋กœ,  '?'๋กœ ์ž…๋ ฅ๊ฐ’๋งŒ ๊ตฌ๋ฉ์„ ๋šซ์–ด๋†“์œผ๋ฏ€๋กœ์„œ ์งˆ์˜๋ฌธ ์ฟผ๋ฆฌ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด๋ฒ„๋ ค SQL Injection์ด ์›์ฒœ์ ์œผ๋กœ ์ฐจ๋‹จ๋˜์–ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ๋กœ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

์‚ฌ์‹ค Prepared Statement๋Š” ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ๋Š”๋ฐ, SQL Injection์„ ์›์ฒœ์ ์œผ๋กœ ๋ง‰๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค.

์ด์— ๋Œ€ํ•œ ์šฐํšŒ๋Š” ์ „! ํ˜€! ๋ถˆ๊ฐ€๋Šฅ! ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

 

SQLi๋ฅผ ๋ฐฐ์šฐ๋Š” ์ด์œ ?!

prepared statement๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์šฐํšŒ๊ฐ€ ์ „ํ˜€! ์ ˆ๋Œ€! ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด?

๊ทธ๋Ÿผ์—๋„ SQL Injection์„ ๋ฐฐ์šฐ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

์–ด์ฐจํ”ผ ์šฐํšŒ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ฐฐ์šฐ๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

 

1. Prepared Statement๋ฅผ ์ž˜๋ชป ์“ด ๊ฒฝ์šฐ

Prepared Statement๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด '?๋ฌธ๋ฒ•'์„ ์ œ๋Œ€๋กœ ์“ฐ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ Prepared Statement๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด? ์ด๋Š” ์ž˜๋ชป ์ด์šฉํ•œ ๊ฒƒ์ด์—ฌ์„œ ๋ง‰๋Š” ํšจ๊ณผ๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•œ๋‹ค๋Š” ํ—ˆ์ ์ด ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํŒŒ๊ณ ๋“ค ํ‹ˆ์ด ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

2. Prepared Statement๋ฅผ ์“ฐ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ

๋ชจ๋“  SQL Query์— ์žˆ์–ด Prepared Statement๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค.

Prepared Statement ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ

1. order by ์ ˆ
2. table ์ด๋ฆ„, column ์ด๋ฆ„
3. where ___ like ์ ˆ

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๋ฏ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ(parameter)์— sort, ord ๊ฐ€ ์žˆ๋‹ค? ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ํ™•์ธํ•ด๋ด์•ผ ํ•œ๋‹ค.

 

2. White List Filtering

๋Œ€์‘ ๋ฐฉ๋ฒ• 2. white list filtering

ํ•„ํ„ฐ๋ง์ด๋ž€? ํŠน์ • ๋‹จ์–ด์— ๋Œ€ํ•˜์—ฌ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

White vs Black

'ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ํ•„ํ„ฐ๋ง(White List Filtering)' vs '๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ํ•„ํ„ฐ๋ง(Black List Filtering) '

ํ™”์ดํŠธ (White) : ํŠน์ • ๋‹จ์–ด๋งŒ์„ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (ํŠน์ • ๋‹จ์–ด๋งŒ ํ—ˆ์šฉ)

๋ธ”๋ž™ (Black) : ํŠน์ • ๋‹จ์–ด๋ฅผ ๋ชป ์“ฐ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (ํŠน์ • ๋‹จ์–ด๋ฅผ ์ฐจ๋‹จ)

SQLi๋ฅผ ๋ง‰๊ฒ ๋‹ค๊ณ  ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ํ•„ํ„ฐ๋ง์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์จ์ ธ์•ผํ•  ๋‹จ์–ด๋“ค๋„ ์จ์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ๋‹จ์–ด๋ฅผ ์ง€์ •ํ•ด ๋†“๊ณ  ๋ฆฌ์ŠคํŠธ์— ํ—ˆ์šฉ๋œ ๋‹จ์–ด๋“ค ๋งŒ์„ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด๋‘๋Š” ๋ฐฉ์‹์„ ์ทจํ•˜๋Š” ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ํ•„ํ„ฐ๋ง์„ ์ด์šฉํ•œ๋‹ค.

if(sort == 'title'){
}elif(sort == 'author'){
}else{
    sort = 'title';
}

 


์งˆ๋ฌธ ํ™˜์˜, ์ˆ˜์ • ๋ฐ ๋ณด์™„์— ๋Œ€ํ•œ ์ง€์  ํ™˜์˜