티스토리 뷰
가. 원인
- 입력된 데이터에 대한 유효성 검증을 하지 않고 DB 쿼리의 일부로 사용
- 입력값 필터링 없이 동적쿼리에 적용 후 사용
나. 영향
- 로그인 인증우회
- DB 데이터 유출/수정/삭제
- 시스템 명령어 실행
다. 보안대책
- 정적쿼리 사용
- 쿼리구조를 변경할 수 있는 문자열을 검사 후 쿼리문 생성에 사용
- PreparedStatement 객체 등을 이용하여 컴파일 된 쿼리문을 사용
- DB 사용자 권한 최소화
- 500 서버오류 정보 노출 제한
라. 안전한 코드
1. JDBC API 사용
String id = request.getParameter("id"); Connection con = db.getConnection(); PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, id); ResultSet rs = pstmt.executeQuery();
|
2. MyBatis 사용
<select id="search">
|
3. Hibernate 사용
String name = request.getParameter("name"); Query query = session.createQuery("from Student where name = ? "); query.setString(0, name);
|
String name = request.getParameter("name"); Query query = session.createQuery("from Student where name = :name "); query.setString("name", name);
|
마. 진단방법
<동적쿼리>
1. Statement 객체를 통해서 쿼리가 실행되는 부분을 확인
2. Statement 객체가 PreparedStatement 객체인지 확인
3. PreparedStatement 객체를 사용하고 Set 함수를 통해 외부 입력값을 사용하는지 확인
4. 추가로 입력값 필터링을 수행하는지 확인
바. 정/오탐 케이스
<정탐 케이스>
1. PreparedStatement 객체를 사용하고 있으나 파라미터를 setString으로 설정하지 않음
2. 파라미터 검증없이 문자열 결합으로 쿼리구문을 생성 후 실행
3. MyBatis에서 입력값이 쿼리의 인자값으로 사용되지 않고 쿼리 명령어에 연결되는 문자열로 사용
<오탐 케이스>
1. 입력값이 위치하는 부분을 ?로 설정 하고, 쿼리 실행 시 파라미터가 전달되도록 구현
'Web Analytics > SW 보안약점 진단원' 카테고리의 다른 글
[구현보안] 입력 데이터 검증 및 표현 03 - 크로스 사이트 스크립트 (0) | 2019.09.30 |
---|---|
[구현보안] 입력 데이터 검증 및 표현 02 - 경로 조작 및 자원 삽입 (0) | 2019.09.30 |
[설계보안] 세션통제 01 - 세션통제 (0) | 2019.09.29 |
[설계보안] 에러처리 01 - 예외처리 (0) | 2019.09.29 |
[설계보안] 보안기능 08 - 중요정보 전송 (0) | 2019.09.29 |
- Total
- Today
- Yesterday