복잡한뇌구조마냥

Angular XSS 공격 방어 본문

카테고리 없음

Angular XSS 공격 방어

지금해냥 2025. 4. 15. 18:10

1. XSS ( Cross - Site Scripting [ 교차 사이트 스크립팅 ] )

  • 공격자가 웹 페이지에 악성 코드를 삽입하여 공격하는 방법

ex) script 문구 삽입 ( <script>alert('이 페이지는 이제 제껍니다')</script> )

 

2. Angular의 XSS 보안 모델

  • XSS 버그를 체계적으로 차단하기 위해 Angular는 기본적으로 모든 값을 신뢰할 수 없는 것으로 취급
  • 기본값으로 위험요소를 삭제하고 escape 처리가 되도록 되어 있음.

 

1) escape 

  • 자바스크립트의 escape() 함수는 알파벳과 숫자, 특수문자(*, @, -, _, +, ., /)를 제외한 모든 문자를 16진수로 인코딩하는 함수
  • 1바이트 문자는 %XX형태로 변환되며, 2바이트 문자는 %uXXXX형태로 변환됨

ex) 공백문자 : %20 등등

  • HTML에서는 HTML 엔티티로 escape됨

ex) < : &lt, >: &gt 등등

  • escape를 통해 값을 변환시켜 공격에 대비할 수 있음.

 

2) DomSantizer

  • DOM에서 신뢰할 수 없는 유형의 데이터 처리가 블가피한 경우 DomSanitizer 메서드를 이용하여 삭제 기능 사용

[원본]

[santizer 1번 처리]

[santizer 1번처리 + innerHTML]

  • DomSanitizer는 Angular에서 기본적으로 제공하는 XSS 방지 정책과 별개로 DOM에서 값을 제어할 수 있음.
  • innerHTML을 통한 값 출력으로 XSS공격에 취약해 질 수 있는 단점이 있음.
  • Angular 외부 DOM에서 데이터를 가져와서 사용할 때 등 Angular의 직접적인 간섭이 없을 경우 사용에 유용

 

3. innerHTML 의 위험

  • innerHTML을 사용하여 바인딩을 하면 공격자의 명령어에 따라 script 기능이 동작할 수도 있기 때문에 취약해짐.

4. CSP ( Content-Security-Policy [ 콘텐츠 보안 정책 ] )

  • 클라이언트 단에서 처리하는 것도 중요하나 웹서버에 직접적인 공격을 방어하기 위해서 HTTP 헤더를 이용하여 정책을 운용하는게 좋음
  • angular는 기본적으로 XSS공격 방어가 되어 있으므로 서버로 공격이 넘어가지 않도록 관리가 필요함.

5. XSS 공격 방법

  • script, javascript, 이벤트 속성, 난독화 등을 통해 공격을 할 수 있음
  • 공격당할 수 있는 문구 예제
{
          "<" 
          ,">"
            "\""
          ,"%22"
            ,"'"
          ,"%27"
          ,"%"
          ,"&"
            ,"%00"
          ,"\\("
          ,"\\)"
          ,"="
            ,"<"
            ,">"
            ,"alert"
            ,"append"
            ,"applet"
            ,"base"
            ,"binding"
            ,"blink"
            ,"bgsound"
            ,"charset"
            ,"confirm"
            ,"cookie"
            ,"create"
            ,"document"
            ,"embed"
            ,"eval\\("
            ,"expression"
            ,"frame"
            ,"frameset"
            ,"Href"
            ,"iframe"
            ,"ilayer"
            ,"innerHTML"
            ,"javascript"
            ,"layer"
            ,"<link"
            ,"<meta"
            ,"msgbox"
            ,"object"
            ,"refresh"
            ,"script"
            ,"string"
            ,"<style"
            ,"<svg"
            ,"title"
            ,"vbscript"
            ,"void"
            ,"xml"
            ,"onabort"
            ,"onactive"
            ,"onafteripudate"
            ,"onafterprint"
            ,"onbefore"
            ,"onbeforeactivate"
            ,"onbeforecopy"
            ,"onbeforecut"
            ,"onbeforedeactivate"
            ,"onbeforeeditfocus"
            ,"onbeforepaste"
            ,"onbeforeprint"
            ,"onbeforeunload"
            ,"onbeforeupdate"
            ,"onbegin"
            ,"onblur"
            ,"onbounce"
            ,"oncellchange"
            ,"onchange"
            ,"onclick"
            ,"oncontentready"
            ,"oncontentsave"
            ,"oncontrolselect"
            ,"oncontrolselected"
            ,"oncontextmenu"
            ,"oncopy"
            ,"oncut"
            ,"ondataavailable"
            ,"ondatasetcomplete"
            ,"ondatasetchanged"
            ,"ondblclick"
            ,"ondeactivate"
            ,"ondetach"
            ,"ondocumentready"
            ,"ondrag"
            ,"ondragdrop"
            ,"ondragend"
            ,"ondragenter"
            ,"ondragleave"
            ,"ondragover"
            ,"ondragstart"
            ,"ondrop"
            ,"onend"
            ,"onerror"
            ,"onerrorupdate"
            ,"onevent"
            ,"o-filterchange"
            ,"onfinish"
            ,"onfocus"
            ,"onfocusin"
            ,"onfocusout"
            ,"onhelp"
            ,"onhide"
            ,"onkeydown"
            ,"onkeypress"
            ,"onkeyup"
            ,"onlayoutcomplete"
            ,"onload"
            ,"onlosecapture"
            ,"onmediacomplete"
            ,"onmediaerror"
            ,"onmedialoadfailed"
            ,"onmousedown"
            ,"onmouseend"
            ,"onmouseenter"
            ,"onmouseleave"
            ,"onmousemove"
            ,"onmouseout"
            ,"onmouseover"
            ,"onmouseup"
            ,"onmousewheel"
            ,"onmove"
            ,"onmoveend"
            ,"onmovestart"
            ,"onopenstatechange"
            ,"onoutofsync"
            ,"onpaste"
            ,"onpause"
            ,"onplaystatechange"
            ,"onpropertychange"
            ,"onreadystatechange"
            ,"onrepeat"
            ,"onreset"
            ,"onresize"
            ,"onresizestart"
            ,"onresizeend"
            ,"onresume"
            ,"onreverse"
            ,"onrowclick"
            ,"onrowenter"
            ,"onrowexit"
            ,"onrowout"
            ,"onrowover"
            ,"onrowsdelete"
            ,"onrowsinserted"
            ,"onsave"
            ,"onscroll"
            ,"onseek"
            ,"onselect"
            ,"onselectionchange"
            ,"onselectstart"
            ,"onshow"
            ,"onstart"
            ,"onstop"
            ,"onsubmit"
            ,"onsyncrestored"
            ,"ontimeerror"
            ,"ontrackchange"
            ,"onunload"
            ,"onurlflip"
    };
  • 기본적으로 클라단은 < → &lt;, > → &gt;로 잡아주면 되지만 해당 문구를 통해 공격이 들어올 수도 있다는 것을 인지하자.

 

참조:

Angular 공식 사이트 : https://angular.io/guide/security

 

Angular

 

v17.angular.io

 

Escape 블로그: https://redcow77.tistory.com/636

 

[Javascript] 유니코드로 인코딩하는 함수 - escape() 함수

자바스크립트(Javascript)의 escape() 함수 자바스크립트(Javascript)의 escape() 함수는 알파벳과 숫자 및 특수문자(*,@,-,_,+,.,/)를 제외한 문자를 모두 16진수로 인코딩하는 함수입니다. escape() 함수는 쉼표

redcow77.tistory.com

 

https://www.zerocho.com/category/HTML&DOM/post/587f50b1308ed50018a00d51

 

(HTML&DOM) HTML 엔티티(entity) - 이스케이프(escape), 이스케이핑(escaping)

안녕하세요. 이번 시간에는 HTML 엔티티에 대해서 알아보겠습니다! 혹시 HTML 소스를 보다가  나 < 또는 >를 보신 적이 있나요? 이 문자들은 HTML 파일이 깨져서 나타나는 문자가 아닙니다.

www.zerocho.com

 

나무위키: https://namu.wiki/w/XSS

 

XSS

Cross-site Scripting. 줄이면 CSS인데 Cascading Style Sheet 와 혼동이 올 수

namu.wiki

 

블로그: https://aaboo.home.blog/2019/11/04/%ED%81%AC%EB%A1%9C%EC%8A%A4%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%95%84%ED%84%B0xss/

 

LIST