본문 바로가기

로그 저장소 :)/보안.Security

SQL Injection

<SQL 인젝션 공격 종류>


1. SQL Injection(normally)

SQL Injection은 홈페이지 DB에 특수문자('[싱글쿼터])나 Union, Select 등의 문자를 필터링하지 않아, 조작된 SQL Query가 서버로 전송되어 DB의 정보를 획득, 수정, 삭제 등의 명령 실행이 가능한 공격 기법이다. 또한, xp_cmdshell과 같은 System Stored Procedures를 통해 시스템의 권한 획득이 가능하다.

예>

GET/bbs/list.php?board_seq=2&sSearchString=&sSearchMethod=title_n' and 'x'='y   HTTP/1.1

Host: test-domain.com


Accept: */*


2. TRUE OR FALSE Blind SQL Injection

공격자의 입력값에 따라 웹 어플리케이션의 반응을 통해 DB에서의 처리에 대해 참과 거짓을 구분할 수 있을 때 공격자는 조건문과 함께 아스키 코드 값 삽입하고, 코드 값을 하나씩 변경시켜가며 참과 거짓의 반응을 통해 문자를 추측한다. 이 과정을 거쳐서 피해 데이터베이스의 DB명, 테이블명 등을 추출하는 공격이다.

예>

GET /bbs/view.php?seq=1477719&board_seq=1 AND 1=1HTTP/1.1

Host:test-domain.com

Accept:*/*



3. Time Base Blind SQL Injection

참과 거짓을 반환되는 화면에 의해 확인할 수 없을 때 시간을 지연시킬 수 있는 함수(Sleep, Wait For delay, Benchmark 등)을 사용하여 고의적으로 시간을 지연시킨 후 처리 응답속도를 확인하여 참과 거짓을 구분하는 공격이다.

예>

GET/bbs/list.php?nPage=27&board_seq=2[[#0]]'||SLeeP(3)&&'1   HTTP/1.0

Accept-Language: en-us,en 


Accept-Charset: utf-8,* 


Accept: text/html,image/jpeg,image/gif,text/xml,text/plain,image/png 


User-Agent: Opera/9.27 


Host: test-domain.com


Connection: close



<대응방안>

1) 입력란에 특수문자를 입력하지 못하도록 Prepared Statement 객체 등을 이용하여 DB에 컴파일된 쿼리문(상수)을 전달하는 방법을 사용한다.

2) Parameterized Statement를 사용하는 경우에는 DB쿼리에 사용되는 외부 입력 값에 대하여 특수문자 및 쿼리 예약어를 필터링하고, Struts, Spring 등과 같은 프레임워크를 사용하는 경우에는 외부 입력 값 검증 모듈 및 보안 모듈을 상황에 따라 적절하게 사용한다.

3) Prepared Statement 클래스를 사용할 수 없는 환경이라면, 입력 값을 필터링 처리한 후 사용한다. 필터링 기준은 데이터베이스와 연동하는 스크립트의 모든 파라미터에서 사용자의 입력 값이 특수문자(`, ", /, ;, :, Space, -, +)를 포함하는지 검사하여 허용되지 않은 문자열이나 문자를 필터링 한다.



<추가 조치 방안>

① 허용되지 않은 문자열이 포함된 경우에는 에러로 처리한다.

② 데이터베이스의 에러메시지를 사용자에게 보여주지 않도록 설정한다.

③ 웹 어플리케이션이 사용하는 데이터베이스 사용자의 권한을 제한한다.