웹 개발 공부

Angular 공부 ( XSS공격 방어 )

지금해냥 2023. 4. 4. 14:14

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

 

angular.io

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

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

 

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

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

www.zerocho.com

 

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

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

redcow77.tistory.com

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

블로그: 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/

 

크로스사이트스크립트 필터(XSS)

일번적으로 <를 < 로, 또는 >를 > 로만 잡아주면 되지만,부득이한 상황으로 그렇게 못할 경우 아래 코드를 사용한다. iframe을 i_rame으로 2번째 문자를 _로 바꿔주는 형식이다. package com.mySite.utils; publ

aaboo.home.blog

 

LIST