슈개's IT/SW개발보안

[SW개발보안] SR1-1 DBMS 조회 및 결과 검증

슈개 2021. 1. 23. 09:54
반응형

[SW개발보안] SR1-1 DBMS 조회 및 결과 검증

 

 

SR1-1 DBMS 조회 및 결과 검증

⇒ SQL 삽입 보안약점

외부 입력값에 쿼리 조작 문자열 포함 여부를 확인하지 않고 쿼리문을 생성, 실행하는 경우, 쿼리의 구조와 의미가 변경되어서 실행되는 것

 

[예상 피해]

  1. 권한 밖의 데이터 접근이 가능

  2. DBMS 제어권을 탈취

  3. 해당 쿼리 실행 통해서 제공하는 기능을 우회

 

[방어 대책]

  1. 외부 입력값에 쿼리 조작 문자열 포함 여부를 확인 후 사용

  2. 정적 쿼리 실행을 지원하는 프레임워크 또는 라이브러리를 사용 = 구조화된 쿼리를 실행 = 파라미터화된 쿼리 실행 ⇒ iBatis/myBatis/Hibernate, PreparedStatement

  3. 어플리케이션에서 사용하는 DB 사용자의 권한을 최소한으로 부여 → SQL 삽입 보안약점을 이용한 공격을 완화

  4. 오류 메시지에 시스템 주요 정보가 포함되지 않도록 한다. → Error Based SQL 삽입 공격을 완화 

 

 

searchId.jsp

======================================================

String id = request.getParameter("id");

String query = "select * from users where id = " + id;

Statement stmt = connection.createStatement();

stmt.executeQuery(query);

 

[개발자가 원한 입력 = 안전한 입력 = 의도한 입력]

searchId.jsp?id=123

⇒ select * from users where id = 123

⇒ id 컬럼의 값이 123인 사용자 정보를 조회

 

[공격자가 조작한 입력 = 안전하지 입력 = 의도하지 않은 입력]

searchId.jsp?id=123 or 1=1

⇒ select * from users where id = 123 or 1=1

⇒ 모든 사용자 정보를 조회

 

[안전한 코드 예] 

String id = request.getParameter("id");

// 쿼리의 구조를 정의

String query = "select * from users where id = ? ";

// 구조화된 쿼리를 실행하는 PreparedStatement 객체를 생성

PreparedStatement stmt = connection.prepareStatement(query);

// 정의한 쿼리 구조에 변수를 매핑

stmt.setInt(1, Integer.parseInt(id));

// 쿼리를 실행

stmt.executeQuery();

 

//EXCEPTION (에러 반환 혹은 정상적으로 실행 시키기)

 

메타문자와 이스케이프

 

String input = request.getParameter("input");  ⇐ a' or 'a' = 'a

String query = "select * from users where name = '" + input + "' ";

select * from users where name = 'a' or 'a' = 'a'

 

의미 문자(meta char) = 특수 문자

어떤 기능에서 특별한 용도(의미)를 포함하고 있는 문자

 

이스케이프 

  • 이스케이프 문자(\)를 사용

  • 해당 기능에서 제공하는 방법을 적용

  • 인코딩/디코딩 기법을 적용

 

SQL문에서 '(홑따움표) ⇒ 문자열 데이터의 시작과 끝

select * from users where name = 'John\'s 2nd'

select * from users where name = 'John''s 2nd'

 

URL주소에서 & ⇒ 파라미터와 파라미터를 구분하는 용도

search.jsp?vend_name=Bandi & Luce&address=gangname&...

search.jsp?vend_name=Bandi %26 Luce&address=gangname&...

 

반응형