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(정적 응용 프로그램 보안 테스트) 도구를 사용해 보안 취약성에 대한 코드를 자동으로 검사한다.
'Web hacking > Nomaltic) 웹 해킹 수업 노트 👩💻' 카테고리의 다른 글
[4주차]Blind SQL Injection과 대응방안 (0) | 2021.11.09 |
---|---|
[4주차]Burp Suite 설치 및 기본설정 (0) | 2021.11.07 |
[4주차]해시 함수에 대한 이해 (0) | 2021.11.03 |
로그인 페이지 만들기를 위한 심폐소생 사이트 (2) (PhpMysql 설치연동, root로 로그인 안될 때 해결법, phpsql연동, 로그인페이지만들기 코드소스) (0) | 2021.10.31 |
[3주차]SQL Injection - 데이터 추출 (0) | 2021.10.29 |