SQL Injction์ด๋
- ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ๋ณด์ ์์ ์ทจ์ฝ์ ์ ์๋์ ์ผ๋ก ์ด์ฉํ์ฌ ์ ์์ ์ธ SQL๋ฌธ์ ์ฃผ์ ํ๊ณ ์คํ๋๊ฒ
ํ์ฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ๋ ํ์
SQL Injection์ ์ข ๋ฅ
Error based SQL Injection4
- ๋ ผ๋ฆฌ์ ์๋ฌ๋ฅผ ์ด์ฉํ SQL Injection
- ๊ฐ์ฅ ๋์ค์ ์ธ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด๋ค.
ex)
SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
๋ผ๋ SQL ๊ตฌ๋ฌธ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ง์ฝ ์ฌ์ฉ์๊ฐ ์ฌ๊ธฐ์
'OR 1=1 --
๋ผ๋ SQL ๋ฌธ์ ์ฃผ์ ํ๊ฒ ๋๋ค๋ฉด ์ด ์ฌ์ฉ์๋ Users ๋๋น์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฒ ๋๋ค.
๋ํ ๋ณดํต ๊ด๋ฆฌ์ ๊ณ์ ์ ์ ์ผ ๋จผ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ 2์ฐจ ํผํด๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
SELECT * FROM Users WHERE id = ''OR 1=1 -- ' AND password = 'INPUT2'
ํด์ : 'OR1=1 ์ ์ฃผ์ ํด์ค์ผ๋ก์จ ๊ตฌ๋ฌธ์ด ํญ์ ์ฐธ์ด ๋๋๋ก ํ๊ณ -- ์ ์ฃผ์ ํด์ค์ผ๋ก์จ ๋ท ๊ตฌ๋ฌธ๋ค์
๋ชจ๋ ์ฃผ์์ฒ๋ฆฌ์ํจ๋ค.
๊ฒฐ๊ณผ : ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ DB ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์กฐํํ ์ ์๋ค.
Union based SQL Injection
- Union ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ SQL Injection
- ๋ ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ ํตํฉํด์ ํ๋์ ํ ์ด๋ธ๋ก ๋ณด์ฌ์ค๋ค.
- Union ํ๋ ๋ ํ ์ด๋ธ์ ์ปฌ๋ผ ์์ ๋ฐ์ดํฐ ํ์ด ๊ฐ์์ผํ๋ค.
ex)
SELECT * FROM Board WHERE title LIKE '%INPUT%' OR contents '%INPUT%'
์ด๋ผ๋ ๊ตฌ๋ฌธ์ ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ
'UNION SELECT null,id,passwd FROM Users--
๋ผ๋ ๊ตฌ๋ฌธ์ ์ฃผ์ ํ๋ค๋ฉด ์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด๊ฐ ๊ฒ์๊ธ๊ณผ ํจ๊ป ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋๋ค.
SELECT * FROM Board WHERE title LIKE '% 'UNION SELECT null,id,passwd FROMUsers --
%'AND contents '% UNION SELECT null,id,passwd FROM Users -- %'
ํด์ : ์ฑ๊ธ์ฟผํฐ๋ฅผ ๋ซ์์ฃผ๊ธฐ ์ํ ' ์ฝ์ , Union ๋ช ๋ น์ด๋ฅผ ํตํด ๋ ์ฟผ๋ฆฌ๋ฌธ์ ํฉ์ณ์ค์ผ๋ก์จ ํ๋์ ํ ์ด
๋ธ๋ก ๋ณด์ฌ์ง๊ฒ ๋๋ค.
๊ฒฐ๊ณผ : ์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด๊ฐ ๊ฒ์๊ธ๊ณผ ํจ๊ป ํ๋ฉด์ ๋ณด์ฌ์ง๊ฒ ๋๋ค.
Blind SQL Injection
- Boolean based SQL
- ํน์ ํ ๊ฐ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ง ์๊ณ , ๋จ์ํ ์ฐธ๊ณผ ๊ฑฐ์ง์ ์ ๋ณด๋ง ์ ์ ์๋ค.
ex)
SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
๋ผ๋ ๊ตฌ๋ฌธ์ ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ,
abc123' and ASCII(SUBSTR(SELECT name FROM INFORMATION_SCHEMA.tables WHERE
table_type = 'base table' limit 0,1),1,1) > 100 --
๋ผ๋ ๊ตฌ๋ฌธ์ ์ฃผ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด๊ฒ์ ์กฐํ๋๋ ํ ์ด๋ธ ๋ช ์ ์ฒซ ๊ธ์๋ง ๋ฐ์ 100์ด๋ผ๋ ๊ฐ๊ณผ ๋น๊ตํด์ฃผ๋ ๊ตฌ๋ฌธ์ด๋ค.
๋ง์ฝ ํ ์ด๋ธ์ ์ฒซ๋ฒ์งธ ๊ฐ์ด 100์ด์์ด๋ผ๋ฉด ๋ก๊ทธ์ธ ์ฑ๊ณต์ด ๋ ๊ฒ์ด๊ณ , ์๋๋ผ๋ฉด ์คํจํ ๊ฒ์ด๋ค.
์ด ๊ณผ์ ์ ์๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ์งํํ ์ ์๋ค.
SELECT * FROM Users WHERE id = 'abc123' and ASCII(SUBSTR(SELECT name FROM
INFORMATION_SCHEMA.tables WHERE table_type = 'base table' limit 0,1),1,1) > 100 --' AND password = 'INPUT2'
ํด์ : ์กฐํ๋๋ ํ ์ด๋ธ์ ์ฒซ๋ฒ์งธ ๊ฐ๋ง ์์คํค ์ฝ๋์ ๋น๊ตํด์ ์ฐธ, ๊ฑฐ์ง์ ํ๋ณํ๋ค.
๊ฒฐ๊ณผ : ์๋ํ ์คํฌ๋ฆฝํฌ๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ํ ์ด๋ธ ๋ช ์ ์์๋ผ ์ ์๋ค.
- Time based SQL
- ์๋ฒ๋ก๋ถํฐ ์ฐธ ๊ฑฐ์ง์ ์๋ต๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ถ
ex)
SELECT * FROM Users WHERE id = 'INPUT1' AND password = 'INPUT2'
๋ผ๋ ๊ตฌ๋ฌธ์ ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ,
abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --
๋ผ๋ ๊ตฌ๋ฌธ์ ์ฃผ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด ๊ฒฝ์ฐ ๊ตฌ๋ฌธ์์ ์ค์ ํ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธธ์ด๊ฐ 1์ด๋ฉด SLEEP(2) ๊ฐ ๋์ํจ์ผ๋ก์จ ์คํ์ ์ง์ฐ ์ํค๊ณ , ๊ฑฐ์ง์ด๋ฉด ๋์ํ์ง ์๋๋ค.
SELECT * FROM Users WHERE id = 'abc123' OR (LENGTH(DATABASE())=1 AND SLEEP(2)) --' AND password = 'INPUT2'
ํด์ : ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธธ์ด๊ฐ ๋ง์ผ๋ฉด SLEEP() ํจ์๋ฅผ ํตํด ์คํ์ ์ง์ฐ์ํจ๋ค.
๊ฒฐ๊ณผ : ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธธ์ด๋ฅผ ์ ์ถํ ์ ์๋ค.