[웹사이트의 암호화 방식]


국내 많은 웹사이트들이 로그인 과정에서 네트워크상에서 송신되는 계정 정보(ID 및 Password)를 암호화하고 있습니다. 이러한 암호화 방법에는 크게 3가지 방식이 있습니다.


    • 1. SSL을 적용한 암호화
    • 2. JavaScript 를 이용한 암호화
    • 3. 기타 모듈을 이용한 암호화


    1~3번 기법은 따로 베타적으로 사용해야 하는 것은 아닙니다. 즉 1~3번 기법을 혼용해서 사용할 수가 있습니다. 해킹을 막는 입장에서는 많은 기법을 적용할 수록 보안 측면에서는 향상이 될 수 있다는 것은 상식적인 얘기이죠.


    취약점의 입장에서 얘기를 해 보겠습니다. 1번 기법은 SSL Strip으로 SSL 암호화를 무력화할 수 있다는 것은 널리 알려진 사실이지만 2번과 3번 기법에 대한 암호화 무력화는 그리 많이 알려지지 않은 것이 현실입니다.




    [JS Strip]


    이번에 2번(JavaScript 암호화)을 무력화할 수 있는 기법에 대해서 연구를 해 보았습니다. 검토 결과 JavaScript 암호화를 지원하고 있는 국내 유명 사이트들 대부분이 간단한 문자열 조작만으로 무력화가 될 수 있는 취약점이 존재하는 것을 확인하였습니다. 본 취약점은 JS Strip이라고 명명하겠습니다.


    아래 화면은 SSL Strip 및 JS Strip 기법에 의해서 네이버(www.naver.com)에서 ID(testtest), Password(11111111)로 로그인하였을 때 계정 정보가 노출되는 화면입니다(아시는 분은 아시겠지만, 네이버 사이트의 경우에는 SSL Strip을 적용했다 하더라도 id 필드와 pw 필드가 원래 노출되지는 않음). 단, 이것을 가지고 네이버만 이러한 취약점이 있다고 해서는 안됩니다. 네이버가 국내에서 가장 대표적인 사이트로 예를 든 것 뿐이며, 다른 곳도 마찬가지입니다.


    naver.com_login.png  




    [JavaScript 암호화의 취약점]


    JavaScript 암호화를 무력화가 어렵지 않은 이유에 대해 정리해 보았습니다.


    • JavaScript는 클라이언트 사이드(웹브라우저)에서 실행이 되며, 코드 자체를 숨길 수 있는 것이 아님.
    • JavaScript는 컴파일 방식이 아닌 스크립트 방식이기 때문에 코드 분석이 상대적으로 쉬운 편임.
    • 내부적으로 암호화 기법(RSA, Hash 등)을 사용했다 하더라도 엉뚱한 곳의 문자열 변경만으로 암호화를 쉽게 해제할 수 있음.




    [대표적인 사이트들]


    SSL Strip 과 JavaScript 암호화 무력화 기법을 이용하여 로그인 과정에서 계정 정보를 탈취할 수 있는 대표적인 사이트들을 예로 들어 보겠습니다(전부다 확인해 본 사이트들임). 국내 사이트 거의 대부분이라고 보셔도 됩니다.


    • 네이버, 다음, 네이트 등 유명 포털 사이트
    • 11번가, 지마켓 등 유명 쇼핑몰 사이트
    • 아이핀 인증을 지원하는 사이트들
    • 샵메일 관련 사이트
    • 유명 대학교 사이트
    • 은행권 사이트



    은행권 사이트를 테스트해 보았는데, "우X은행"의 경우, 계좌 정보 이체 정보를 획득하는 것까지는 확인하였지만, 정보의 탈취와 변조(계좌 번호 이체 조작)까지는 확인을 해 보지 못한 상황입니다. 계좌 정보의 변조를 테스트하기 위해서는 최소한 3개의 계좌(송금 계좌, 수신 계좌, 해커 계좌)가 있어야 하는데, 테스트에 걸리는 시간보다 계좌 정보를 얻는 시간이 더 많이 걸리네요(제까랑 와이프꺼랑 달랑 2개 가지고 테스트해 봄).


    ps : 이번 취약점을 검토해 본 결과 외국 유명 사이트에서 JavaScript 암호화를 지원하는 곳이 별로 없었습니다. 즉 JavsScript 암호화는 국내에서 많이 이용되는 암호화 기법이며, 따라서 지금까지 많은 해커들에 의한 공격(취약점 분석)이 이루어 지지 않았던 것으로 보입니다.




    [대처 방안]

    • HSTS(HTTP Strict Transport Security) 기법을 도입하여 SSL Strip을 막을 수 있도록 해야 함(국내 대부분의 사이트가 이 기법을 적용하지 않고 있음).
    • JavaScript 암호화만으로는 한계가 있음. 사용한다고 해도 다른 방식과 같이 병합해서 사용하는 것이 좋음.
    • 크롬 웹브라우저 사용자를 위해 http://dev.chromium.org/sts 에 자사의 사이트를 등록해 보는 것도 고려해 볼만 함.
    • 웹 기반이 아닌 Application 기반의 경우 SSL certificate pinning을 적용하는 것이 바람직함.




    한마디로 정리 : 이왕이면 다홍치마라고 JavaScript 암호화는 하지 않는 것보다는 하는 게 더 좋음. 하지만 쉽게 뚫린다는 것이 약점.