SQL 인젝션
- SQL(Structured Query Language)을 주입하는 공격.
- 사용자 입력 값에 SQL 문을 주입하여 의도하지 않은 동적 쿼리를 생성하여 DB 정보를 보거나 조작할 수 있는 취약점
- 입력값 검증이 불충분하여 사용자 입력값이 불완전한 SQL 문과 결합되는 경우 발생합니다.
취약점의 원인
- 공격자: 취약한 웹 애플리케이션을 대상으로 SQL 문 주입 → 불완전한 SQL 문은 사용자 입력 값에 의해 완전한 SQL 문으로 변환
String id = request.getParameter("id");
String query = "select * from member where id = "+id+"";
→ 사용자 입력으로 쿼리 완료 시 취약점 발생
2. 변경된 SQL 쿼리로 인해 DB 정보를 보거나 조작할 수 있음
공격 유형
1. 인증우회공격(Authentication Bypass Attack): 인증기능을 수행하는 어플리케이션(로그인)에 대해 정상적인 인증메커니즘을 통한 로그인이 아닌 비정상적인 메카니즘(SQL 문 삽입)을 이용하여 인증을 우회하는 공격
2. Data Retrieval Attack: SQL 문을 주입하여 DB에 있는 데이터를 조회
3. 시스템 명령 실행 공격: SQL Server 시스템 명령 실행
4. 데이터 조작 공격: 삽입, 수정, 삭제 등의 행위
인증 우회 공격
- 로그인 페이지에서 일반 id와 pw가 아닌 id와 pw에 SQL 문을 넣음 -> 레코드 처음에 사용자로 로그인함
- 로그인 O: 1개 이상의 레코드 반환(세션, 쿠키 출력)
- 로그인 X : 0개의 레코드를 반환합니다(id 또는 pw가 일치하지 않음).
- 정상적인 id,pw 없이 SQL 문을 삽입하여 로그인을 허용하는 취약점
인증 우회 공격 원리
1. SQL 문을 ID pw에 붙여넣기
2. 로그인 시도 – 아이디와 비밀번호 전송
3. 패스 id=’ 또는 1=1, pw=asdf
4. 사용자 입력 값으로 SQL 문 완성
SELECT *FROM member WHERE id=''or 1=1--' and pw ='ENC DATA'
5. 비정상적인 SQL 쿼리
6. DB는 회원용 테이블을 웹 어플리케이션으로 전송
7. 공격자에게 세션 또는 쿠키 발행