
취약점 진단 중 게시글 작성을 위한 간단한 태그는 허용되지만, 이벤트 핸들러나 위험한 태그만 막아둔 대상이 있었습니다.
허용되는 태그들만을 이용해 어떻게 우회해야 할지 고민하다 발견한 취약점이었는데, 처음엔 "<>을 쓴 거니까 XSS 취약점이겠군" 하고 생각했었습니다.
다만, 더 자세히 찾아보니 XSS와는 조금 달랐기에 이에 대해 적어보려고 합니다.
XSS가 무엇인가?
취약점 명에서 드러나다시피 "교차 사이트"를 유발하는 공격입니다. (Cross-Site Scripting)
여기서 "교차 사이트"란 단순히 다른 사이트로 이동시킨다는 의미뿐 아니라, 공격자의 스크립트가 피해자 사이트의 권한 위에서 실행된다는 의미에 가깝습니다.
그 때문에 사용자가 아무런 행동을 하지 않아도 세션 쿠키 탈취, 악성 사이트 접근, 드라이브 바이 다운로드 등이 자동으로 유발될 수 있지요.
여기서 핵심은 JavaScript가 실행된다는 점입니다. 스크립트가 브라우저 위에서 동작하기 때문에 사용자 개입 없이도 공격이 완료된다는 것입니다.
제가 찾은 취약점은 말이죠...

단순히 HTML과 CSS를 사용하여 해당 스크립트가 저장된 게시글 접근 시, 위와 같은 이미지를 띄우는 취약점이었습니다.
흰색 바탕에 중앙에 누가 봐도 다시 로그인해야 할 것 같은 화면이 띄워지고, 해당 링크 클릭 시 공격자가 의도한 페이지로 접근하게끔 하는 취약점이었지요.
position: fixed와 높은 z-index 값을 이용해 실제 페이지 위를 완전히 덮어버리는 방식이라, 사용자로서는 정상적인 시스템과 구분하기가 매우 어려울 것 같았습니다.
그래서 이건 XSS인가?
이건 HTML Injection이라고 하는 다른 취약점입니다.
XSS가 되려면 "교차 사이트"뿐 아니라 JS를 통해 무언가 자동으로 이뤄져야 합니다.
스크립트 없이 HTML과 CSS만으로 구성된 이 공격은 사용자의 클릭이라는 행동이 반드시 전제되어야 합니다. 즉, 자동으로 실행되는 것이 없는 셈이지요.
반면 XSS는 페이지에 접근하는 것만으로도 공격이 완료됩니다. 이 점이 두 취약점을 가르는 주요 Point라고 볼 수 있습니다.
해당 취약점은 피싱 페이지를 만들어 사용자의 클릭을 유도하는 단계가 추가된 취약점입니다.
사용자가 링크를 누르지 않으면 공격은 성립하지 않습니다. 그렇다고 위험하지 않다는 뜻은 아닙니다.
실제로 로그인 화면을 그대로 복제한 피싱 페이지와 결합면 계정 탈취로 이어질 수 있습니다.
(더군다나, 캡처한 이미지 한 장만으로도 상당히 이상 유사한 HTML 코드를 AI가 빠르게 제작해 주기 때문에 피싱 페이지 제작도 어렵지 않지요)
HTML Injection은 무엇인가?
입력값이 HTML로 해석되는 지점에 태그를 삽입할 수 있는 취약점입니다.
브라우저는 입력된 값을 그대로 마크업으로 렌더링하므로, 공격자는 스크립트 없이도 페이지의 구조와 외형을 임의로 조작할 수 있습니다.
가짜 폼, 가짜 알림, 피싱 레이아웃을 심는 것이 대표적인 활용 방식이다.
정교한 사회공학 기법과 결합하여 취약점을 이용한다면, 충분히 위험한 취약점이라고 생각합니다.
어떻게 대처해야 하는가?
기본적으로 스크립트를 삽입하는 취약점이므로, 사용자 입력값에 대해 반드시 필요한 태그들만 허용하게끔 해두어야 합니다.
하지만, 이 "반드시 필요한 태그들"에 대한 명확한 기준이 없으므로 적절한 특수기호 필터링과 출력값 인코딩을 적용하는 것을 권장합니다.
XSS와 다르게 HTML 출력을 이용하는 취약점이기도 하니, innerHTML과 같은 HTML을 해석하는 속성 대신 textContent와 같이 데이터를 텍스트로만 렌더링하게끔 제한을 걸어두는 것도 방법입니다.
 [김주형] | [kjh@cela.kr] |
취약점 진단 중 게시글 작성을 위한 간단한 태그는 허용되지만, 이벤트 핸들러나 위험한 태그만 막아둔 대상이 있었습니다.
허용되는 태그들만을 이용해 어떻게 우회해야 할지 고민하다 발견한 취약점이었는데, 처음엔 "<>을 쓴 거니까 XSS 취약점이겠군" 하고 생각했었습니다.
다만, 더 자세히 찾아보니 XSS와는 조금 달랐기에 이에 대해 적어보려고 합니다.
XSS가 무엇인가?
취약점 명에서 드러나다시피 "교차 사이트"를 유발하는 공격입니다. (Cross-Site Scripting)
여기서 "교차 사이트"란 단순히 다른 사이트로 이동시킨다는 의미뿐 아니라, 공격자의 스크립트가 피해자 사이트의 권한 위에서 실행된다는 의미에 가깝습니다.
그 때문에 사용자가 아무런 행동을 하지 않아도 세션 쿠키 탈취, 악성 사이트 접근, 드라이브 바이 다운로드 등이 자동으로 유발될 수 있지요.
여기서 핵심은 JavaScript가 실행된다는 점입니다. 스크립트가 브라우저 위에서 동작하기 때문에 사용자 개입 없이도 공격이 완료된다는 것입니다.
제가 찾은 취약점은 말이죠...
단순히 HTML과 CSS를 사용하여 해당 스크립트가 저장된 게시글 접근 시, 위와 같은 이미지를 띄우는 취약점이었습니다.
흰색 바탕에 중앙에 누가 봐도 다시 로그인해야 할 것 같은 화면이 띄워지고, 해당 링크 클릭 시 공격자가 의도한 페이지로 접근하게끔 하는 취약점이었지요.
position: fixed와 높은 z-index 값을 이용해 실제 페이지 위를 완전히 덮어버리는 방식이라, 사용자로서는 정상적인 시스템과 구분하기가 매우 어려울 것 같았습니다.
그래서 이건 XSS인가?
이건 HTML Injection이라고 하는 다른 취약점입니다.
XSS가 되려면 "교차 사이트"뿐 아니라 JS를 통해 무언가 자동으로 이뤄져야 합니다.
스크립트 없이 HTML과 CSS만으로 구성된 이 공격은 사용자의 클릭이라는 행동이 반드시 전제되어야 합니다. 즉, 자동으로 실행되는 것이 없는 셈이지요.
반면 XSS는 페이지에 접근하는 것만으로도 공격이 완료됩니다. 이 점이 두 취약점을 가르는 주요 Point라고 볼 수 있습니다.
해당 취약점은 피싱 페이지를 만들어 사용자의 클릭을 유도하는 단계가 추가된 취약점입니다.
사용자가 링크를 누르지 않으면 공격은 성립하지 않습니다. 그렇다고 위험하지 않다는 뜻은 아닙니다.
실제로 로그인 화면을 그대로 복제한 피싱 페이지와 결합면 계정 탈취로 이어질 수 있습니다.
(더군다나, 캡처한 이미지 한 장만으로도 상당히 이상 유사한 HTML 코드를 AI가 빠르게 제작해 주기 때문에 피싱 페이지 제작도 어렵지 않지요)
HTML Injection은 무엇인가?
입력값이 HTML로 해석되는 지점에 태그를 삽입할 수 있는 취약점입니다.
브라우저는 입력된 값을 그대로 마크업으로 렌더링하므로, 공격자는 스크립트 없이도 페이지의 구조와 외형을 임의로 조작할 수 있습니다.
가짜 폼, 가짜 알림, 피싱 레이아웃을 심는 것이 대표적인 활용 방식이다.
정교한 사회공학 기법과 결합하여 취약점을 이용한다면, 충분히 위험한 취약점이라고 생각합니다.
어떻게 대처해야 하는가?
기본적으로 스크립트를 삽입하는 취약점이므로, 사용자 입력값에 대해 반드시 필요한 태그들만 허용하게끔 해두어야 합니다.
하지만, 이 "반드시 필요한 태그들"에 대한 명확한 기준이 없으므로 적절한 특수기호 필터링과 출력값 인코딩을 적용하는 것을 권장합니다.
XSS와 다르게 HTML 출력을 이용하는 취약점이기도 하니, innerHTML과 같은 HTML을 해석하는 속성 대신 textContent와 같이 데이터를 텍스트로만 렌더링하게끔 제한을 걸어두는 것도 방법입니다.
[김주형] | [kjh@cela.kr]