Expression XSS

웹 어플리케이션 2008. 12. 23. 13:59 Posted by TEAMCR@K
▷ 작성자 : 박성현 컨설턴트
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)


2008년 1월 14일에 박성현 컨설턴트가 작성을 한 문서입니다. 현재는 군 복무를 하고 있습니다^^)



Expression XSS
요 약
최근 이슈가 되고 있는 XSS 취약점을 이용한 공격이 증가하고 지능화 될 수록 이에 대응하는 기술도 발전하고 있다. 예를들면, 웹 게시판에서 사용자가 악의적인 스크립트를 입력하지 못하도록 특수문자를 필터링 하거나, 특정 메소드의 키워드를 필터링 하는 경우가 대표적이다.


취약점 세부분석

1. 취약점 내용

Expression을 이용한 XSS 취약점이다. 최근 XSS를 이용하여 수많은 크래킹이 일어나고 있는데 이것을 보안하기 위해 보안하는 방법 역시 수많이 나오고 있다. 그런데 대부분 특수 키워드나 SCRIPT 사용을 금지하여 스크립트의 실행을 보안하려고 하지만 우회할 수 있는 방법이다.
HTML의 소스에 중요부분을 URL 인코딩하여 <style> 태그의 width를 이용하여 Expression에 스크립트를 실행 가능하도록 script에 대한 엘레먼트를 만들고 엘레먼트에 대한 주소를 악성JavaScript 파일로 지정하고 이 소스 부분을 인코딩하여 expression부분에 삽입을 한다.

다음은 Expression XSS 공격코드 이다.

 
다음은 exp.js 파일의 내용이다.


2. 공격 분석
HTML이나 스크립트 실행이 가능한 게시판이나 블로그에 expression을 이용한 악성 태그를 삽입 한다.


다음은 글을 쓴 후 글을 열람하게 될 경우 exp.js 파일이 실행되고 JavaScript에 담겨 있는 악성 스크립트가 실행되는 화면이다.




3. 위험 분석
대부분의 웹게시판들이 HTML이 허용 가능하게 해둘 경우 개인 사용자들의 쿠키 도용으로 인한 개인 사용자들의 개인정보나 피해가 매우 크다.


4. 취약점 내용(2)
바이두라는 중국의 구글이라는 홈페이지에서 expression을 이용한 XSS 웜이 발견되었다.해당 취약점도 위 취약점과 같은 방식이다.Expression에 주석을 이용하여 우회하는 방법을 사용하여 바이두 웜의 감염를 위하여 쿠키에 어느 특정문자열 값을 삽입하고 그 특정문자열을 이용하여 웜에 감염되었는지 확인 한 후 감염되지 않았다면 CSS 파일을 삽입하여 xmlhttprequest를 이용하여 요청을 한다.
이 웜에 감염되면 친구 등록되어 있는 사용자들에게 ajax로 사용자 모르게 임의의 글로 메일이 전송되고 사용자가 그 임의의 메일을 열람 할 경우 감염되고 사용자는 또 친구 등록되어 있는 사용자들에게 임의의 글로 메일이 ajax로 사용자 모르게 메일이 전송된다.
웜에 감염된 총 사용자들과 감염된 온라인 사용자들의 통계를 확인 할 수 있다.




관련사이트
본 취약점에 대한 추가적인 정보를 확인할 수 있는 관련 사이트는 다음과 같다.
 http://openmya.hacker.jp/hasegawa/security/expression.txt
 http://www.gnucitizen.org/xssdb/application.htm



대응 방안
XSS(Cross Site Scripting) 취약점과 동일한 대응방안이며, 아래와 같습니다.

XSS는 외부의 공격자가 정상적인 웹사이트를 악용하여 정상적인 웹사이트에 접속하려는 사용자로 하여금 공격자가 의도한 명령이나 작업을 수행하도록 하는 공격입니다. XSS를 이용한 공격 유형에는 사용자 쿠키 정보 추출을 통한 세션 가로채기 공격 등이 있습니다.
XSS 대응 방안은 사용자가 게시물을 업로드 할 수 있는 게시판의 경우와 사용자로부터 값을 입력 받는 경우로 나눌 수 있습니다.

● 사용자 게시판
운영상 필요한 경우 이외에는 사용자가 HTML을 사용하지 못하도록 하여야 합니다. 운영상 필요하여 HTML을 허용하여야 할 경우에는 스크립트 태그를 사용하지 못하도록 하여야 합니다. 사용자 태그뿐 아니라 본문에 “cookie” 나 “object”나 “document”와 특수한 문자열에 대한 체크를 하여 입력을 받지 못하도록 합니다.

● 파일의 argument로 값을 입력
HTML 태그가 입력되지 못하도록 하여야 합니다. 필터링 하여야 할 문자로는 <, >, & 등이 있고, 사용자 입력으로 원하는 값이 아닌 다른 모든 문자들을 필터링 하여야 합니다. 파일의 입력으로 받는 문자열일 경우에는 입력을 허용할 문자만을 선택하고 나머지는 필터링을 하거나 에러페이지로 이동하도록 합니다. 입력 값으로 <form>문을 작성할 때 다른 파일의 입력 값이 될 때와 같이 파일에 포함되어야만 할 때에는 입력 받은 문자는 URL Encoding을 하여 화면에 표시하도록 합니다.

● 입력 값 변환
<, >와 같은 문자들을 HTML에 표시하는 &lt; 와 &gt; 로 변환을 하여 저장을 하고 보여주는 방법이 존재합니다. 이 문자들이 HTML에서 <, >로 표시되기 때문에 화면에 나타날 때는 문제가 없습니다.


Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.