Weak Session IDs
개념
사용자의 세션을 식별하는 데 사용되는 세션 ID가 예측 가능하거나,
세션 만료 기간이 공격하기 충분한 시간으로 설정되어 있어 안전하지 않은 경우,
공격자가 이를 탈취하여 인증된 사용자의 세션을 가로채서 해당 권한을 통해 악용하는 방식으로 공격이 이루어진다.
세션 ID란 서버가 사용자를 식별하고 인증 상태를 유지하기 위해 사용하는 고유한 값이다.
사용자가 로그인하면 서버는 세션 ID를 생성하고 이를 사용자의 브라우저(쿠키나 URL 파라미터)에 저장한다.
서버는 이후 요청에서 이 세션 ID를 확인하여 사용자를 식별하고 인증하는 형태이다.
실습(Low Level)
아래는 Weak Session IDs 실습 페이지이다.
‘Generate’ 버튼이 존재해서 해당 버튼을 클릭하면 ‘dvwaSession’이라는 새로운 쿠키가 발급되는 형태이다.
개발자 도구를 통해 쿠키값을 확인해 본다.
Generate 버튼을 한 번씩 누르면 dvwaSession 값이 1씩 증가하는 것을 확인할 수 있다.
이러한 식으로 서버가 세션 ID를 +1씩 순차적으로 생성하는 것을 알 수 있게 되는데,
이는 공격자가 예측 가능한 세션 ID로써 새로운 세션 ID로 인증받아 시스템에 접근할 수 있을 것이다.
실습(Medium Level)
Medium Level의 dvwaSession 값은 Low Level과는 다른 형태를 띠고 있는 것을 확인할 수 있다.
몇 초 후에 다시 Generate 하였을 때의 값 또한 첫 번째 사진과 차이가 많이 나는 것을 확인할 수 있다.
즉, 버튼 클릭 이벤트 발생 시 dvwaSession 값이 올라가는 것이 아닐 것이라고 추측할 수 있다.
하지만 Generate 버튼을 연속적으로 클릭하였을 때는 일정한 규칙이 보이는 듯싶은데,
이를 1초 간격으로 클릭할 시에 +1씩 값이 증가하는 것을 확인할 수 있다.
EpochConverter로 1731747876 dvwaSession 값을 확인하면,
2024년 11월 16일 토요일 오후 6:04:36 시간인 것을 확인할 수 있다.
즉, Medium Level에서는 dvwaSession 값을 현재 시각을 기준으로 설정해 놓았다는 사실을 알 수 있다.
실습(High Level)
High Level에서는 형태상 해쉬값 같은 dvwaSession 값을 관찰할 수 있다.
hash-identifier를 통해 확인 시, md5 알고리즘으로 확인된다.
해당 해쉬값을 복호화하면 3, 4의 값인 것을 확인할 수 있다.
즉, Low Level과 같이 dvwaSession 값을 부여하는 형태이지만 추가로 md5 암호화를 적용한 것으로 유추할 수 있다.
소스코드를 확인해 보면 역시 Session ID + 1의 값을 md5 해시를 적용하여 쿠키를 설정하는 것을 확인할 수 있다.
실습(Impossible Level)
Impossible Level의 경우 md5 알고리즘보다 강력한
sha1 알고리즘을 사용하였고, 랜덤수, 시간, Impossible 문자열을 결합하였다.
또한, setcookie에서 Secure, HttpOnly 옵션을 true, true 설정하여 HTTP 전송,
JavaScript 접근 차단을 통해 쿠키를 보호하여 쿠키 값의 탈취를 예방하고 있다.
대응방안
- 세션 ID를 암호학적으로 안전한 난수 생성기를 사용하고 충분한 길이를 통해 예측할 수 없도록 생성한다.
- HTTPS를 통해 세션 ID를 암호화하여 네트워크에서 패킷들이 평문으로 노출 및 탈취되지 않도록 보호한다.
- HttpOnly, Secure, SameSite 속성을 설정해 세션 ID가 클라이언트 측에서 노출되지 않도록 방지한다.
해당 속성은 보안기사에서도 생각보다 문제가 많이 제출된다.
이러한 속성을 어떻게 설정해야, 좀 더 안전한 방식인지 등에 대해 알 필요가 있다. - 로그인 및 주요 권한 변경 시 새로운 세션 ID를 생성하고 동일한 세션 ID가 사용되지 않도록 기존 세션 ID를 폐기한다.
- 세션의 유효기간을 짧게 설정하여 세션 탈취 후에도 악용 가능성을 줄인다.
사용자가 아무런 동작을 하지 않을 때, 로그인이 풀린다거나 화면 보호기로 가서 실제 사용자가 왔을 때만
다시 이용할 수 있게 적용하는데, 일반적으로 세션에 대한 유효기간은 전자금융감독규정,
ISMS 등 관리체계 인증심사 내에서는 이 세션의 유효기간을 10분으로 보통 권고를 하고 있다.
하지만 시스템 또는 업무마다 세션의 유효기간을 길게 설정해야 되는 경우도 존재한다.
예를 들어 증권회사라고 한다면, 실시간 데이터, 실시간 주식거래 등은 세션이 끊기면 안 되기 때문에,
이러한 업무의 특수성이 있는 것들은 세션에 대한 유효기간 설정을
조금 더 길게 해 놓는 등 보안 설정을 갖추어서 높여놓는 경우가 존재한다.
DOM-based XSS
개념
크로스 사이트 스크립트(XSS)란 공격자가 페이지에 악의적인 스크립트를 삽입하여, 해당 페이지를 열람하는 사용자의 권한으로
해당 스크립트가 실행되어 사용자의 세션을 가로채거나, 피싱 공격, 정보 유출 등의 공격을 진행할 수 있는 취약점을 의미한다.
그중, DOM-based XSS (DOM 기반 XSS)는 피해자의 브라우저 즉, 클라이언트 측 자바스크립트 코드에서 사용자의 입력을
안전하게 처리하지 않아 발생하여, 요청이 서버로 전송되지 않고 클라이언트 브라우저에서 공격이 이루어지는 XSS 유형으로,
웹 페이지가 동적으로 DOM을 조작하는 방식에 악성 스크립트를 삽입하는 형식이다.
주로 웹 페이지 상에서의 편집기를 통해서 공격하는 방식과 문서 내에서 스크립트 구문을 작성하거나
악성 매크로를 삽입하여 일반 사용자의 클릭을 유도하는 형태로 공격이 이루어진다.
문서 방식의 경우 예를 들면, 엑셀 및 워드 내 URL 삽입,
엑셀 및 워드 자체 스크립트 구문 작성 등으로 충분히 공격을 수행할 수 있다.
특히 해당 방식은 피싱 공격, 정보 유출 등에 많이 활용된다. 사회공학적인 기법을 통해서 사용자가 URL을
아무런 의심 없이 클릭하도록 메일의 본문 내용을 조작하여 정보 유출 또는 추가적 피해를 유도한다.
실습(Low Level)
아래는 Low Level의 XSS(DOM) 실습 페이지이다.
language를 select 할 수 있는 기능이 구현되어 있다.
언어 중 하나를 select 하였을 때, URL에서 default 매개변수의 값이 설정된 것을 확인할 수 있다.
아래와 같이 해당 default 인자값을 임의로 변경하였을 때, 해당 인자값이 웹페이지에 그대로 반영되는 것 또한 확인 가능하다.
페이지의 소스코드를 살펴보면, document.location.href()에서 URL의 데이터를 가져오는데, 이를 검증하지 않고 사용하며,
document.write()에서 전달된 데이터를 HTML로 변환하여 DOM에 직접 삽입하는 부분에서 공격에 취약한 점이 존재한다.
즉, document.location.href를 사용해 default라는 URL 파라미터를 가져오고,
추출한 default 값은 <option> 태그에 삽입되어 HTML 페이지를 구성하는 동작을 보았을 때,
클라이언트 측에서 JavaScript 코드를 동적으로 DOM을 조작하여 페이지의 일부를 구성하고 있다는 것을 나타낸다.
이를 악용하여 default 매개변수에 쿠키 값을 반환하는 alert 스크립트를 삽입한다.
위와 같이 alret 창에 사용자의 쿠키 값이 표시된다.
실습(Medium Level)
Medium Level의 경우 stripos 함수를 통해 <script 문자열을 찾고,
해당 문자가 있을 경우 기본 값(default=English)으로 바꾼다.
즉, URL 파라미터인 default 값을 확인하고, 이를 통해 <script> 태그를 차단하려는 목적으로 보인다.
이를 우회하기 위해서는 <script> 태그 외에 <img> 태그의 이벤트 속성인 onerror를 추가하는 방법이 존재한다.
예를 들면, <img src=x onerror=alert(document.cookie)>와 같이
이미지 태그의 src 속성에 잘못된 값을 설정하면 이미지를 불러올 수 없으므로 onerror 이벤트가 트리거 된다.
하지만 페이지 소스코드 상 위의 코드를 삽입하면, document.wirte <option> 태그 내부에 삽입되어
onerror를 무시하기 때문에, </option></select><img src=x onerror=alert(document.cookie)>
와 같이 </option>와 </select>로 기존의 <option>과 <select> 구조를 종료하고 삽입하면 아래와 같이 우회가 가능하다.
실습(High Level)
High Level의 경우 switch ~ case 문으로 Whitelist 기반의 입력값 검증을 통해
default 파라미터에 전달된 값이 허용된 언어 값(French, English, German, Spanish)인지 확인하고,
그렇지 않은 경우 기본값(English)으로 리다이렉트 하는 방식으로 동작한다.
이는 #을 통해 우회할 수 있다. # 이후의 값은 브라우저에서만 처리되고, 서버 측에서는 해당 값을 처리하지 않으므로,
default 값을 English#></option></select><script>alert(document.cookie)</script>로 전달한다.
URL에서는 정상적인 값인 English에 프래그먼트(#)가 추가된 상태이므로, 브라우저는 # 이후에 >을 통해
태그를 닫은 후의 값이 서버로 전달되지 않고 클라이언트 측에서만 사용되게 되어 우회에 성공하게 된다.
실습(Impossible Level)
Impossible Level의 서버 측 소스코드에서는 별도의 보안 조치가 필요 없다고 나타난다.
Impossible Level의 자바 스크립트 코드를 살펴본다.
이전 Level들과 다르게 URL 입력값을 디코딩하지 않고 DOM에 삽입되기 때문에, 태그나 특수문자가 실행되지 않는다.
즉, 입력값을 DOM에 삽입하기 전에 HTML 특수문자를 인코딩하여 태그나 스크립트로 해석되지 않도록 처리한다.
대응방안
- 웹 서버 내에서 입력 값에 정의된 문자 길이를 검증하여 javascript 등의 명령이 삽입되지 않도록 수정하고,
사용자 입력 폼(로그인 폼, 검색 폼, URL 등)을 대상으로 특수문자, 특수구문 필터링 규칙 적용한다.
보안 조치에는 극단적 보안 조치와 효율성을 고려한 보안 조치로 나눌 수 있다.
극단적인 보안 조치는 업무 효율성, 업무의 편의성 등을 전혀 고려하지 않고,
위험을 애초에 없애버리기 위한 방법이기에, 태그 및 스크립트 사용 제한은 사실상 기능 자체를 막아놓은 것이라고 볼 수 있다.
이러한 경우 보안성은 매우 향상되겠지만 개발 또는
다른 업무를 수행하는 운영자는 업무를 수행하지 못하는 상황들도 충분히 생길 수 있다.
물론 업무를 수행하면서 극단적인 조치를 하는 경우는 거의 없다.
업무를 통해서 수익 창출, 업무에 대한 발전 등을 위해서라면 보안 조치를 너무 극단적으로 갈 수는 없다. - 사용자 입력값을 허용된 값의 리스트인 화이트 리스트와 비교하여 검증하여, 해당 태그만 허용하는 방식을 적용한다.
- 홈페이지 소스코드에서는 사용자가 입력한 문자열에서 〈,〉,&,"," 등을 replace 등의
문자 변환함수(혹은 Method)를 사용하여 <, >, &, "로 치환한다.
입력값을 DOM에 삽입하기 전에 HTML 특수문자를 인코딩하여 태그나 스크립트로 해석되지 않도록 처리한다.
다음 글에서는 XSS(Redlected), XSS(Stored)을 주제로 실습을 진행할 예정이다.
'IT_정보보안 > 웹 모의해킹 프로젝트 (DVWA)' 카테고리의 다른 글
39. 웹 모의해킹 실습 (6) : XSS(Stored), XSS(Reflected) (2) | 2024.12.26 |
---|---|
37. 웹 모의해킹 실습 (4) : SQL Injection, SQL InjectionI (Blind) (1) | 2024.11.12 |
36. 웹 모의해킹 실습 (3) : 파일 업로드, Insecure CAPTCHA (2) | 2024.10.27 |
35. 웹 모의해킹 실습 (2) : CSRF, File Inclusion (1) | 2024.09.30 |
34. 웹 모의해킹 실습 (1) : DVWA 환경 구성 및 Command injection, Brute Force (1) | 2024.09.22 |