본문 바로가기
Security/Web Hacking

[XSS Game] Level 6

by 단월໒꒱ 2022. 1. 23.

 

 

alert를 실행시킬 외부 파일을 요청하게 하라고 하고 있다.

 

 

 

 

일단 주어진 화면을 조작해보려고 했지만 따로 입력창이나 버튼 같은 게 없기 때문에 조작해야하는 건 url일 것이라고 생각했다.

이 이후로 소스코드를 참고하여 url 뒤쪽을 조작해보다가 이것만으로는 한계가 있어서 힌트를 일부 살펴보았다.

 

1. # 뒤에 오는 게 로드된 스크립트의 url에 영향을 미친다.

2. 가젯 url의 보안 체크가 정말로 풀 프루프인 것인가?

    (풀 프루프 : 제어계 시스템이나 제어 장치에 대하여 인간의 오동작을 방지하기 위한 설계)

 

일단 이 정도만 확인해보고 좀 더 살펴보았다.

 

 

 

 

힌트에서 얘기해준 대로 # 뒤의 내용을 바꿔주었더니 페이지 상에서 from 뒤에 입력한 내용이 들어가는 것을 확인할 수 있었다. 

아래의 소스코드 마지막 부분에서 확인할 수 있듯 # 뒤의 내용이 getGadgetName 함수의 반환값이 되고 이 값을 includeGadget의 인자로 넣어주고 있다.

 

 

    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());

 

includeGadget 함수를 보면 url을 인자로 하고 있다. 

 

createElement나 scriptEl.src에 대해서 구글링을 해보니 일종의 동적 로딩으로 페이지의 렌더링을 방해하지 않으면서 필요한 파일만 로딩할 수 있게 해준다고 한다. (변수 이름이라서 약간씩은 다를 수 있지만 어쨌든 기능으로 봐서는 그렇다.)

이를 구현하는 방법 중 하나가 javascript로 script 태그를 생성해서 src에 로딩할 주소를 넣음으로서 로딩하는 것이다.

구현 예시는 아래와 같다. 위의 코드와 비슷한 모양이 보인다.

 

 

var scriptEl = document.createElement('script');  
scriptEl.type = 'text/javascript';  
scriptEl.src = 'example.js';  
document.getElementsByTagName('head')[0].appendChild(scriptEl);

 

 

아무튼 위의 방법으로 스크립트 태그를 만들어 # 뒤에 입력받은 내용, 즉 url이 스크립트 태그의 src가 된다는 것을 알 수 있었다.

 

그리고 처음 문제 설명에도 있듯 외부 파일을 요청해서 alert를 실행하도록 해야하는데 다시 구글링을 해서 data url이라는 것을 사용해야 한다는 것을 알아냈다.

이는 외부의 있는 데이터를 url 형태로 표현하는 것으로 해당 파일을 문서 내에 넣을 때 사용한다고 한다.

javascript를 이용해서 alert 구문을 사용하려면 아래와 같이 코드를 짜야한다.

 

data:text/javascript,alert(1)

 

 

 

 

위의 코드를 url의 # 뒤에 넣어주고 Go를 누르면

 

 

 

 

alert 창이 뜨며 이번 단계를 해결할 수 있었다.

 

 

'Security > Web Hacking' 카테고리의 다른 글

[bWAPP] HTML Injection - Reflected(POST)  (0) 2022.02.08
[bWAPP] HTML Injection - Reflected(GET)  (0) 2022.01.30
[XSS Game] Level 5  (0) 2022.01.23
[XSS Game] Level 4  (0) 2022.01.14
[XSS Game] Level 3  (0) 2022.01.14

댓글