2014-06-09 1 views
1

스포일러 경고 :이 질문은 Google's XSS Challenge의 문제 중 하나에 대한 답변을 포함합니다! 지금 당장 답을 알고 싶지 않다면 더 이상 읽지 마시기 바랍니다.이 XSS 공격은 어떻게 작동합니까?


은 내가 level 4 of the challenge은, 그러나, 나는 여전히이 작동 이용 방법을 정확하게 모르는 통과 얻을 수 있어요.

<!doctype html> 
<html> 
    <head> 
    <!-- Internal game scripts/styles, mostly boring stuff --> 
    <script src="/static/game-frame.js"></script> 
    <link rel="stylesheet" href="/static/game-frame-styles.css" /> 

    <script> 
     function startTimer(seconds) { 
     seconds = parseInt(seconds) || 3; 
     setTimeout(function() { 
      window.confirm("Time is up!"); 
      window.history.back(); 
     }, seconds * 1000); 
     } 
    </script> 
    </head> 
    <body id="level4"> 
    <img src="/static/logos/level4.png" /> 
    <br> 
    <img src="/static/loading.gif" onload="startTimer('{{ timer }}');" /> 
    <br> 
    <div id="message">Your timer will execute in {{ timer }} seconds.</div> 
    </body> 
</html> 

기본적으로, 그들이 사용하는 장고 프레임 워크 (which uses a bunch of security measure against XSS) : 레벨 4 - 다음은 구글의 XSS 도전에서 코드입니다. 변수 timer은 사용자로부터 입력을 전달합니다. 이 액티비티의 목적은 Django의 XSS 보안을 우회 할 수있는 페이로드를 보내서 메시지를 경고하는 것입니다. 나는 다음과 같은 페이로드 중 하나를 사용하여 메시지를 경고 할 수 있어요

:

');alert('xss 

또는

3') || alert('1 

나는 위의 페이로드를 사용하여 레벨을 취소 할 수 있어요하지만 난 여전히 alert() 메서드가 정확히 어디에서 호출되는지 확실하지 않습니까? onload 처리기 또는 startTimer() 메서드 내에 있습니까?

내가 페이로드를 제출 한 후 페이지의 HTML 소스를 확인하는 경우, 장고 페이로드 인코딩이기 때문에 혼란 스러워요 : 당신은 두 개의 서로 다른 언어의 혼합입니다 혼란 것으로 보인다 무엇

<html> 
    <head> 
    <!-- Internal game scripts/styles, mostly boring stuff --> 
    <script src="/static/game-frame.js"></script> 
    <link rel="stylesheet" href="/static/game-frame-styles.css" /> 

    <script> 
     function startTimer(seconds) { 
     seconds = parseInt(seconds) || 3; 
     setTimeout(function() { 
      window.confirm("Time is up!"); 
      window.history.back(); 
     }, seconds * 1000); 
     } 
    </script> 
    </head> 
    <body id="level4"> 
    <img src="/static/logos/level4.png" /> 
    <br> 
    <img src="/static/loading.gif" onload="startTimer('&#39;);alert(&#39;xss');" /> 
    <br> 
    <div id="message">Your timer will execute in &#39;);alert(&#39;xss seconds.</div> 
    </body> 
</html> 

답변

1

왜 XSS가 작동했는지 봅니다. One of the section in the OWASP XSS cheat sheet는 말한다 :

HTML 엔티티 인코딩은 태그 내부와 같이 HTML 문서의 몸에 넣어 신뢰할 수없는 데이터에 대한 괜찮습니다. 의 일종의 정렬은 속성에 포함되는 신뢰할 수없는 데이터에 대해 작동합니다. 특히 속성에 따옴표를 사용하는 것에 대해 종교적인 경우 특히 그렇습니다. 그러나 신뢰할 수없는 데이터를 태그 안에 넣거나 onmouseover, 또는 CSS 내부 또는 URL과 같은 이벤트 처리기 속성을 사용하는 경우 HTML 엔티티 인코딩이 작동하지 않습니다. 그러므로 메소드를 인코딩하는 HTML 엔티티를 사용하더라도 XSS에 취약 할 가능성이 가장 큽니다. 신뢰할 수없는 데이터를 넣는 HTML 문서 부분에 이스케이프 구문을 사용해야합니다. 아래 규칙은 모두 입니다.

이 경우 사용자 입력이 HTML 대신 JS로 처리되는 이벤트 핸들러에 입력됩니다. 그리고 입력은 HTML 컨텍스트 (JS 컨텍스트가 아님)에서 이스케이프 처리 중입니다.따라서 JS는 startTimer('3&#39;) || alert(&#39;1');startTimer('') || alert('1');으로 처리하며 간단히이 스크립트를 실행합니다.

추신 : 탈출로 인해 공격이 차단되었을 수 있습니다.

2

를 : HTML 및 JavaScript. &#39;은 HTML입니다. 으로 표시되고으로 해석되는 경우 ' 문자로 변환됩니다. 즉, JavaScript 인터프리터의 관점에서 보면 '&#39; 사이에는 차이가 없습니다. onload="startTimer('&#39;);alert(&#39;xss');" 코드는 처음에는 언뜻보기에는 작동하지 않아야하는 것처럼 보이지만 실제로는 onload="startTimer('');alert('xss');"과 동일합니다.

+0

오! 정말 혼란 스럽습니다. 나는 문자열''); alert (' xss'가 메소드'startTimer'에 전달되고 메소드 내에서 경고가 호출 중임을 알았습니다. –

+0

+1 때문에 답을 찾을 수있었습니다. –

+0

'+ 경고 ('hi ') +'경고 – Red2678