정보보안/Web

XSS로 HTTP ONLY 우회하여 세션 탈취하기

구구닥스 2020. 6. 2. 16:27

보통 일반적으로  XSS를 시도하다 보면 헤더에 HttpOnly 플래그가 설정된 경우를 찾을 수 있다.

HttpOnly는 document.cookie API에 접근을 차단하여 세션 및 쿠키 탈취를 방지하기 위한 설정이다.

 

Set-Cookie: id=ABCE123123r3ABCDf1234; Secure; HttpOnly;

 

이와 같은 설정 값으로 이러한 설정이 활성화 되어 있으면 내가 알고 있는 방법으로는 XSS를 이용하여 세션을 탈취하기란 거의 불가능에 가깝다. 특수문자 및 스크립트 필터링이 미흡해도 세션이나 쿠키값을 탈취할 수 없기 때문에 포기하고 피싱사이트쪽으로 시나리오를 생각하는 경우가 많다.

 

 

다만 HttpOnly가 설정되어 있는 경우라도 세션을 탈취하는 방법이 존재한다.

점검 대상의 사이트 중 필요에 의해서 세션 값을 응답값에 노출 시키는 경우가 이런 경우 XMLHttpRequest를 사용하여 Session을 탈취할 수 있다.

 

즉 HttpOnly가 설정되어 있어도 세션을 탈취할 수 있는 경우는 필터링 미흡 + 응답값에 Session값 노출 두가지 경우가 모두 해당하는 경우에 가능하다.

 

XMLHttpRequest는 HTTP를 통해서 손쉽게 데이털르 주고 받을 수 있는 오브젝트를 제공한다.

(참고 : https://developer.cdn.mozilla.net/ko/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest)

function reqListener (){
console.log(this.responseText);
}

var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "http://www.example.org/example.txt");
oReq.send();

 

이런식으로 쓰이는데

 

여기서 스크립트 문으로 XMLHttpRequest 오브젝트를 선언하고 해당 Session을 파싱하여 본인의 서버에 파싱한 값을 전송하여 저장할 수 있으면 Session 탈취를 할 수 있다.

 

XMLHttpRequest에서 제공하는 responseText.match구문을 사용하여 응답값을 파싱하고 선언하여 얻은 Session값을 본인의 서버에 전송하도록 Script를 작성하여 탈취할 수 있다. 

 

 

 

 

항상 허가된 환경 내에서 테스트할 것을 당부한다. 발생할 모든 책임은 본인에게 있기 때문에

'정보보안 > Web' 카테고리의 다른 글

XSS - Backtick(`)  (1) 2020.10.21
Ghostcat : Tomcat-Ajp (CVE-2020-1938)  (0) 2020.07.22
XSS 진단 및 Cheat Sheet  (1) 2020.01.13