취약점
웹 사이트는 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 |