안녕하세요? 허니입니다. 쿠키/세션 인증 취약점에 대해서 알아보고 대응 방법에 대해 알아보도록 하겠습니다. 사이버 해킹에 대해 공부하시는 학생이나 연구원 분이 계시면 도움이 될 것이라 생각합니다.

 

쿠키(Cookie)는 사용자 정보를 유지할 수 없는 HTTP(Hyper Text Transfer Protocol)의 단점을 해결할 수 있는 방법의 하나로서 각 서버는 쿠키를 사용하여 브라우저가 갖고 있는 정보를 참조할 수 있습니다. 이와 같이 클라이언트에서 동작되는 쿠키는 암호화 등의 문제를 비롯하여 그 구조상 클라이언트 측에서의 조작으로 인한 다양한 문제점을 가지고 있어, 많은 웹 프로그래밍 언어들에는 서버에 클라이언트의 정보를 저장하는 세션(Session)을 지원하고 있다. 적절히 보호되지 않은 쿠키를 사용하면 Cookie Injection등과 같은 쿠키값 변조를 통하여 다른 사용자로의 위장 및 권한상승 등의 문제가 생길 수 있다. 또한 쿠키 및 세션은 Cookie Sniffing 및 악성스크립트실행(XSS)를 통한 Cookie Hijacking 등과 같은 쿠키 값 복사를 통해 현재 활성화된 사용자의 권한 복제 위험성이 존재합니다

 

 대응방법
쿠키 보다 세션 기반 공격에서 상대적으로 안전하기 때문에 쿠키 기반 방식보다 세션이나 토큰을 사용하는 방식을 권장합니다. 쿠키 설정 시 사용자 아이디, 주민번호 등과 같이 중요한 사용자 정보는 평문으로 사용하지 말아야 하며 사용자가 쿠키 값의 조작이 쉽지 않도록 합니다. 세션 사용 등 서버 측 인증 기술을 사용하여야 하며, 부재 시 강제로 서버에서 세션을 파기하도록 시간을 설정 하고 인증이 필요한 모든 페이지는 서버 측에서 인증하도록 수정합니다. 한 세션에 대한 IP정보를 기록하여 중복 세션 사용이 되지 않도록 해야 합니다. http only 옵션을 사용하여 XSS 쿠키 하이재킹 공격을 무력화 시켜야 합니다.

 

Response.AddHeader "Set-Cookie", "CookieName=CookieValue; path=/;HttpOnly"

 

HttpOnly 옵션 사용 시 XST 공격에 취약할 수 있으며, XSS/CSRF 취약점 대응방법을 통해 XST 공격에 대한 설정을 수행해야 합니다. 사용자 인증 등 중요기능 구현 시 가급적이면 Cookie 대신 Session 방식을 사용해야 합니다. 사용자 인증 등 중요 기능 구현 시 Cookie(또는 Session) 방식 활용 시 안전한 알고리즘(SEED, 3DES, AES 등)을 사용해야 합니다. 아래의 코드는 쿠키를 생성 시 value 값을 받아들여 getEncrypt(AES 암호화)함수를 통해 AES 암호화 후 쿠키를 생성하게 하는 방법입니다.(JAVA)

Public void createCookie(){
String value = “1234”;
Value = getEncrypt(value);
Cookie cookie = new Cookie(“cookie_key”, value);
Cookie.setMaxAge(60*60*24);
Cookie.setPath(“/”);
Response.addCookie(cookie);
}

 

 

+ Recent posts