취약점

웹 사이트는 DBMS와 연동하므로 웹 어플리케이션에서 사용자의 입력값을 통하여 데이터 트랜잭션이 발생함.

만일 사용자 입력값에 대한 유효성 검증이 누락될 경우,

악의적인 사용자는 정상적인 입력값 대신 SQL 쿼리문이 포함된 조작된 입력값을 전송하여 서버측 쿼리문의 구조를 변경할 수 있으며, 이를 통해서 사용자 인증을 우회하거나 데이터베이스의 정보를 유출시키고 서버의 시스템 명령어를 실행시킬 수도 있음.

 

 

실습

 

비밀번호를 다음과 같이 입력해준다

관리자로 로그인 성공!

 

 

공격원리

다음은 일반적으로 로그인을 처리하는 자바파일에 주요 SQL문장이다

"SELECT * FROM USER WHERE userID='아이디' AND userPassword='비밀번호' ";

아이디를 지목하고 해당하는 저장된 비밀번호와 입력값이 일치하는지를 검사한다

AND로 묶여있기때문에 만일 ID만 맞고 비밀번호를 틀리면 SQL은 False를 반환한다. 

 

 

SQL인젝션 공격의 핵심은 SQL문이 무조건 참이 되게하는 것이며 따라서 입력값을 다음과 같이 바꾸어주면 그만이다

"SELECT * FROM USER WHERE userID='admin' AND userPassword='' or 1# '";

' or 1#을 추가해주므로써 AND에 뒷 구문을 참으로 만들어주었다.

#은 주석처리를 의미(마지막 '를 지워주기 위함) 

 

 

 

 

보안조치

보안조치 방법으로 다음 2가지가 있으며 여기서는 2번째 방법을 적용한다.

(1) 소스코드 레벨에서 필터링 코드를 통한 SQL Injection 방어

: ' 또는 #과 같은 SQL관련 문자를 필터링하여 악의적 입력값을 차단한다.

 

(2) 소스코드 레벨에서 Prepared Statement 구문을 통한 SQL Injection 방어

: Prepared Statement 구문은 SQL 쿼리를 선처리하여 컴파일 한 후, 이후 입력되는 변수값을 항상 문자열 변수로 다루기 때문에 사용자가 어떤 악의적인 SQL 구문을 변수에 삽입해도 SQL 문에 영향을 미치지 않아 SQL Injection이 발생하지 않는다. 

즉, 숫자나 or 또는 #과 같은 문자들이 갖는 의미가 사라지기 때문에 구문 조작을 미연에 방지한다.

 

public int login(String userID, String userPassword) {
    	String SQL = "SELECT userPassword FROM USER WHERE userID = ?";
        try {
            pstmt = conn.prepareStatement(SQL);
            pstmt.setString(1, userID);
            rs = pstmt.executeQuery();
            if(rs.next()){
                if(rs.getString(1).equals(userPassword))
                    return 1;  
                else
                    return 0; 
            }
            return -1; 
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -2; 
    }

 

◾ 조치 결과

 

 

참조

' > 보안 설정' 카테고리의 다른 글

[JSP] 9. 디렉토리 인덱싱  (0) 2020.12.27
[JSP] 7.URL 파라미터 조작  (0) 2020.09.09
[JSP] 4.파일 다운로드  (0) 2020.09.08
[JSP] 1-1.Stored XSS 취약점  (0) 2020.09.08
[JSP] 보안 개발 가이드 개요  (0) 2020.09.05

+ Recent posts