본문 바로가기
Web hacking/Nomaltic) 웹 해킹 수업 노트 👩‍💻

[4주차]SQL Injection 대응 방안

by m_.9m 2021. 11. 4.

 SQL 주입 방지

-기본 방어

 

옵션 1. 준비된 명령문 사용(매개 변수화된 쿼리 포함)

이는 개발자가 먼저 모든 SQL 코드를 정의한 후 나중에 각 매개변수를 쿼리에 전달하도록 하는 방법으로서 제공된 사용자의 입력에 관계없이 코드와 데이터를 구분 가능하다. 공격자가 아이디에 tom' or '1'='1를 입력하더라도 문자 그대로 전체 문자열과 일치하는 사용자 이름을 찾는다.

 

  • Java EE – PreparedStatement()바인드 변수와 함께 사용
  • .NET - 사용과 같은 쿼리를 매개 변수화 SqlCommand()또는 OleDbCommand()바인드 변수
  • PHP – 강력한 형식의 매개변수화된 쿼리와 함께 PDO 사용(bindParam() 사용)
  • Hibernate - createQuery()바인드 변수와 함께 사용 (Hibernate에서는 명명된 매개변수라고 함)
  • SQLite - 명령문 개체sqlite3_prepare() 를 만드는 데 사용

옵션 2. 저장 프로시저 사용

□ 매개변수를 사용하는 것과 저장 프로시저를 사용하는 것에 대한 차이점은 프로시저는 저장프로시저에 대한 SQL 코드가 정의되어 데이터베이스 자체에 저장된 다음 응용 프로그램에서 호출된다는 것이다. 이 두 기술은 SQL 주입을 방지하는 데 동일한 효과를 가지므로 가장 적합한 접근 방식을 선택해 적용해야한다.

 

옵션 3. 허용 목록 입력 유효성 검사 

□ 입력 유효성 검사는 매개 변수를 사용하는 경우에도 모든 경우에 2차 방어 수단으로 권장된다. 매개변수 값을 예성 테이블 또는 열 이름에 매핑하여 검증되지 않은 사용자 입력을 제한한다. 유효성 검사의 방법으로는 두가지가 있다.

 

1) 블랙 리스트 방식

□ SQL 쿼리의 구조를 변경시키는 문자나 키워드 , 특수문자 제한한다.

공격에 중점으로 사용되는 UNION, GROUP BY, COUNT(), ; , -- 등의 특수문자들을 블랙리스트로 정의하고 해당 특수 문자들이 외부 입력값 안에 들어오면 공백으로 치환하는 등의 방식이다.

2) 화이트 리스트 방식 

□ 허용된 문자를 제외하고는 허용하지 않는 방식으로 보안성이 더 뛰어난 방법. 정규식 등을 이용해 화이트 리스트를 범주화/ 패턴화 시키는 편이 좋다.

 

 

옵션 4. 모든 사용자 제공 입력 이스케이프

□ 이스케이프(escape) 시퀀스는 이스케이프 문자 백슬래시(/) 다음에 영숫자 또는 특수 문자가 올 수 있는 문자로 시작된다. 영숫자 문자인 경우 줄바꿈 \n , 캐리지 리턴 \r등을 나타내는 특별한 의미를 부여한다.

  • \' – 작은 따옴표로 묶인 문자열 내에서 ' 이스케이프합니다.
  • \" - 큰따옴표로 묶인 문자열 내에서 " 이스케이프합니다.
  • \\ – 백슬래시를 이스케이프합니다.
  • \$ – $를 이스케이프합니다.
  • \n – 문자열 사이에 줄 바꿈을 추가합니다.
  • \t – 탭 공간을 추가합니다.
  • \r – 캐리지 리턴용.

□ 이 기술은 위의 어느것도 실현가능하지 않을 때 사용된다. 쿼리에 입력하기 전의 사용자 입력을 이스케이프 하는 것으로 DBMS는 해당 입력을 개발자가 작성한 SQL 코드와 혼동하지 않으므로 가능한 SQL 주입 취약점을 피할 수 있다.

 

 

 

-추가 방어

1) 최소 권한 적용

2) 보조방어로 허용 목록 입력 유효성 검사 수행

 

DB 보안

 

1. DB 계정의 분리

관리자가 사용하는 DB 계정과 웹 애플리케이션이 DB에 접근할 때 사용하는 계정을 분리시켜야한다. 

2. 최소 권한 적용

모든 데이터 베이스의 계정에 할당된 권한을 최소화하는 것으로 위험할 수 있다.

 

SQL 취약점 스캔 도구 사용

Snyk과 같은 SAST(정적 응용 프로그램 보안 테스트) 도구를 사용해 보안 취약성에 대한 코드를 자동으로 검사한다.