본문 바로가기
04. 시큐어코딩

시큐어코딩(6) - Open Redirect

by 김덕환 2017. 11. 15.
반응형

1. 정의


신뢰되지 않는 URL 주소로 자동 접속 연결 (URL Redirection to Untrusted Site, Open Redirect)


사용자로부터 입력되는 값을 외부사이트의 주소로 사용하여 자동으로 연결하는 서버 프로그램은 피싱(Phishing) 공격에 노출되는 취약점을 가질 수 있다. 일반적으로 클라이언트에서 전송된 URL 주소로 연결하기 때문에 안전하다고 생각


할 수 있으나, 해당 폼의 요청을 변조함으로써 공격자는 사용자가 위험한 URL로 접속할 수 있도록 공격할 수 있다. 



2. 해결방법


- 자동 연결할 외부 사이트의 URL과 도메인은 화이트리스트로 관리하고, 사용자 입력값을 자동 연결할 사이트 주소로 사용하는 경우에는 입력된 값이 화이트리스트에 존재하는지 확인해야 한다. 



3. 예제


========================== 안전하지 않은 코드의 예 ==========================


String query = request.getQueryString();

if (query.contains("url"))

{

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

response.sendRedirect(url);

}


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


위와 같은 코드가 서버에 존재할 경우 공격자는 다음과 같은 링크를 희생자가 접근하도록 함으로써 희생자가 피싱사이트 등으로 접근하도록 할 수 있다.

(<a href="http://bank.example.com/redirect?url=http://attacker.example.net">Click</a>)



============================== 안전한 코드의 예 =============================


// 다른 페이지로 이동하는 URL 리스트를 만든다.

String allowURL[] = { "http://url1.com", "http://url2.com", "http://url3.com" };


// 입력받은 URL은 미리 정해진 URL의 order로 받는다.

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

try

{

Integer n = Integer.parseInt(nurl);

if ( n >= 0 && n < 3)

response.sendRedirect(allowURL[n]);

}

catch (NumberFormatException nfe)

{

// 사용자 입력값이 숫자가 아닐 경우 적절히 에러를 처리한다.

}


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



위의 코드와 같이 외부로 연결할 URL과 도메인들은 화이트리스트를 작성한 후, 그 중에서 선택함으로써 안전하지 않은 사이트로의 접근을 차단할 수 있다. 

반응형