정의
SQL(Structured Query Language)
DB를 구축하고 활용하기 위해 사용하는 언어로 DB를 정의, 조작, 제어할 수 있음.
SQL Injection
웹 어플리케이션의 허점을 이용해 악의적인 SQL쿼리를 삽입해 DB를 비정상적으로 조작하는 취약점.
종류
1. 인증우회
로그인 폼에 주로 시도하며, SQL 쿼리문에의 True/False 논리적 연산 오류를 이용한다. ' or 1=1# , ' or 2>1--등 무조건 결과가 참인 쿼리를 입력해 로그인 페이지를 우회한다.
2. Error-based Injection
DB의 에러메시지를 기반으로 정보를 유추한다.
주로 group by와 having 구문을 이용해 고의로 오류를 발생시키고, 출력되는 에러메시지를 기반으로 데이터를 절취한다.
3. Union Injection
order by를 이용해 컬럼개수를 유추한 뒤, union select를 통해 컬럼의 데이터를 가져온다.
information_schema를 이용해 테이블 명, 컬럼 명 등의 테이블 구조를 알아낼 수 있다.
4. Blind Injection
페이지의 반환 값이 참/거짓에 따라 달라질 때 사용한다. 간단히 말하자면, 첫 행 첫글자의 글자가 a인가?라는 쿼리를 작성해 그 결과가 참인지 거짓인지 확인하는 방식이다. 해당 쿼리가 거짓이면 b, c로 계속 바꿔가면서 시도한다. 직접 하기에는 시간이 오래 걸려 sqlmap이나 Burpsuite의 Intruder 등의 도구를 사용하기도 한다.
5. Time-based Injection
에러 메시지, 참 거짓에 따른 메시지 등 확인 가능한 결과값이 없을 때, sleep을 걸어 페이지가 나타나는 시간에 따라 참 거짓을 유추한다.
대응방안
1. 입력값에 대한 검증
화이트(블랙) 리스트를 통해 입력값을 필터링 및 치환한다.
2. 계정 권한 제한
DB 사용자들의 권한을 최소화 한다.
3. 저장 프로시저 관리
사용하지 않는 저장 프로시저는 삭제하고, 지정한 형식의 데이터만 받아 실행할 수 있도록 한다.
4. 에러 메시지 노출 방지
DB의 구조를 파악할 수 있는 에러 메시지는 노출을 차단해야 한다.
5. 웹 방화벽 사용
WAF를 이용해 의심스러운 접근을 막는다.
'공부 > 웹해킹' 카테고리의 다른 글
[CVE] CVE-2017-12617 실습 (0) | 2019.11.17 |
---|---|
[SQL] Oracle SQL Injection (0) | 2019.10.16 |
XSS (0) | 2019.06.29 |
인코딩, 디코딩, 해시 (0) | 2019.06.24 |