티스토리 뷰
계정명 노출은 패스워드 정보탈취를 위한 가장 큰 정보를 제공하는 취약점입니다. 관리자나 테스트 계정처럼 예측이 어려운 일반 사용자 또는 특정인의 계정정보를 탈취하기 위해서는 우선 계정명을 정확히 알고 있어야 합니다. 그런 상황에서 여러 페이지에서 사용자를 나타낼 수 있는 정보로 계정명을 노출하는 경우가 있는데, 공격자는 이렇게 노출된 타 사용자의 계정명을 획득할 수 있고, 이 정보를 바탕으로 패스워드를 탈취하기 위한 공격을 시도할 것입니다.
이러한 계정정보 탈취를 방지하기 위한 가장 첫번째 단계인 정보제공을 방지하기 위해 계정명이 노출되는지 여부를 검증해줘야 합니다.
계정명 정보 노출 케이스는 아래와 같습니다.
01. 마스킹없이 계정명 노출 02. 응답값 내 계정명 노출 03. URI 내 계정명 노출 04. 쿠키 내 계정명 노출 05. 주석 내 계정명 노출 |
01. 마스킹없이 계정명 노출
계정명이 노출되는 가장 많은 페이지는 아무래도 회원관리 페이지일 것입니다. 어찌보면 사용자 관리를 위한 정보제공을 위해 반드시 계정명이 노출되어야 하기 때문이죠. 사실 관리자 서비스이든 사용자 서비스이든 반드시 계정명이 노출되어야 하는지부터 고민해보아야 합니다. 사용자를 나타낼 수 있는 식별값은 여러정보들이 있을 것이고 관리자라 할지라도 모든 정보를 무조건 알 필요는 없기 때문이죠. 만약 반드시 관리자 페이지에서 사용자 계정명을 노출해야 할 경우라면, 리스트 형식의 회원관리 페이지에서는 마스킹을 처리해야 하며, 상세보기를 볼 경우에만 마스킹을 처리하지 않도록 해야 합니다. 단, 이때 로그를 통해 어떤 관리자가 누구의 정보를 조회했는지 정보를 기록해놓아야 할 것입니다. 이때 로그를 통해 계정명이 노출되지 않도록 하기 위해 로그 자체를 암호화 하거나, 계정명 이외의 Index값을 사용하는 것도 방법입니다.
로그기록 예 : [2019-04-15 12:41:50] [admin1234] read user information : user_index : 314 |
그리고 사용자 페이지의 경우 게시판 등에서 사용자를 식별할 수 있는 정보를 노출해야 할 경우, 계정명을 무조건 마스킹처리를 해야 하고, 만약 특정 사용자를 나타내고 싶다면, 일부 자리를 마스킹처리하여 사용자 계정명이 노출되지 않도록 해야 할 것입니다.
계정명 마스킹 예 : testaco**** / tes****nt |
02. 응답값 내 계정명 노출
특히 사용자 서비스를 제공하면서 발생하는 취약점으로, 서비스 제공과 상관없이 서버측 코드에서 쿼리된 결과를 JSON으로 모두 전달하는 과정에서 불필요하게 계정명이 노출되는 케이스입니다. 서버에서 특정정보를 쿼리하여 가져오는 것이 일반적인 웹서비스의 과정이지만, 이때 반드시 필요로 하는 정보만을 식별하여 가져와야 네트워크 상에서 불필요한 여러정보가 노출되지 않도록 방지할 수 있습니다. 또는 특정 URI 등을 통해 요청을 처리된 웹페이지 HTML 코드 중 화면상으로 노출이 되지는 않지만 Input 태그 등의 히든필드로 숨겨저 노출되는 경우가 있습니다. 이런 경우 타인의 계정명일 경우 타인의 계정명이 노출될 것이고, 로그인 사용자의 계정명이 노출된 것이라 하더라도, 세션탈취 또는 패킷탈취 등을 통해 사용자 계정명이 탈취가 될 수있게 됩니다.
03. URI 내 계정명 노출
일부 언어에서 일반적인 파라미터로 데이터를 전달하지 않고 URI에 포함된 값을 파라미터로 사용하는 경우가 있습니다. 이때 사용자의 계정명을 포함하여 전달하도록 개발이된다면, 패킷탈취 또는 브라우저 캐시 등을 통해 사용자의 계정명이 노출 또는 탈취가 될 수 있습니다. 사용자의 계정명을 전달해야 한다면, HTTPS 통신을 통해 전달해야 하며, 이보다 더 안전하게 전달하고 싶을 경우 데이터도 암호화 한뒤 POST 방식을 사용하여 파라미터로 전달해야 하며, HTTPS 통신으로 전송하면 보다 안전하게 전달이 가능할 것입니다.
04. 쿠키 내 계정명 노출
현재 로그인한 사용자 또는 로그인ID 저장 등을 위해 쿠키에 계정명을 평문으로 저장해 놓는 케이스입니다. 쿠키로 계정명이 저장될 경우 XSS 공격뿐만 아니라 TRACE Method를 이용한 XST 공격을 통해서도 쿠키값을 탈취할 수 있으며, 이를 통해 계정명이 타인에게 탈취될 수 있습니다. 계정명은 쿠키가 아닌 세션 내 데이터에 저장하여 네트워크 상에서 노출되지 않도록 방지해야 하며, 로그인ID 저장 등을 위해 쿠키를 사용해야 할 경우, 최소한 데이터를 암호화 한 뒤 저장 및 사용을 해야 할 것입니다.
05. 주석 내 계정명 노출
개발을 하다보면 여러 이유로 인해 주석을 많이 작성하게 됩니다. 개발자 본인이 아닌 다른 개발자가 수정을 하거나, 본인이 개발한 코드라 할지라도 몇 개월 이후 다시 수정해야 할 경우 주석이 큰 힘이 되기 때문에, 주석은 거의 필수로 작성을 하게 됩니다. 이때 개발단계에서 상용으로 릴리즈하게 될 때 주석을 삭제하지 않으면 문제가 발생할 수 있습니다. 특히 개발을 편하게하기 위해 테스트 계정을 주석 내 작성해 놓고 그대로 상용에 올리게 되는 초보적인 실수를 하였을 때 말이죠. 대체로 개발과정에서 테스트 계정은 테스트 목적을 위해 관리자에 준하는 권한을 가지는 경우가 많기 때문에 만약 주석을 통해 관리자 권한의 계정이 노출된다면 정말 끔찍할 것입니다.
그나마 주석이 HTML로 변환되지 않는 서버측 코드의 주석이라면 소스코드가 탈취되지 않는 한 노출이 되긴 힘들겠지만, HTML용 주석에 계정정보를 작성했다면, 모든 사용자에게 관리자 권한의 계정정보를 제공한 것이나 다름없게 되겠죠. 때문에 주석은 반드시 작성이 필요한 정보만 작성해야 하고, 계정정보 등 중요정보는 주석에 작성이 되면 안됩니다.
Fin
'Web Analytics > Vulnerabilities' 카테고리의 다른 글
인증실패 횟수 관련 분석 (0) | 2019.04.14 |
---|---|
Password 관련 취약점 분석 (0) | 2019.03.09 |
Download 취약점 분석 (0) | 2019.03.06 |
Upload 취약점 분석 (0) | 2019.03.03 |
SQL Injection 취약점 분석 (0) | 2019.03.03 |
- Total
- Today
- Yesterday