Web Hacking/Webhacking.kr

[Webhacking.kr] NotSQL

프레딕 2024. 7. 27. 16:18
728x90

제목이 NotSQL인걸 보니 NoSQL 문제인듯 하다

일단 사이트의 no 쿼리에 1과2를 날릴 수 있고 그 외엔 뭐 찾을 수가 없었다.

그래서 일단 개발자도구의 스크립트가 있길래 그걸 봐줬다.

 

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.`;
  }
}

일단 no를 가져와서 no값이 없으면 메인페이지에 subject로 표시된 href를 띄운다.

그리고 no가 있으면 subject와 content를 보여준다.

여기서 봐야할 점은 /view.php?query 부분에서 값을 가져온다는 것이다.

그래서 해당 엔드포인트에 query값에 아무값이나 넣어줬더니 아래 에러를 볼 수 있었다.

대충 에러값을 보니 GraphQL을 사용하는걸 확인할 수 있었다.

GraphQL도 인젝션이 가능한데 일단 {__schema{types{name}}을 하면은 스키마의 타입들의 이름을 볼 수 있다.

여기서 GraphQL은 __schema에 대부분의 정보들이 들어있다.

일단 Board는 아마 no의 타입일거고 딱봐도 수상하게 생긴 User_d51e7f78cbb219316e0b7cfe1a64540a 요게 flag의 타입일 것이다.

그다음엔  {__schema{types{fields{name}}} 이걸로 필드값들을 볼 수 있다.

여기로 들어가면 딱봐도 수상하게 생긴 login.... 하고 passwd... 하고 userid....가 보인다. 

그리고 추가적으로 {__schema{queryType{fields{name, description}}}} 을 검색하면 쿼리타입의 이름과 description을 볼 수 있다.

view는 no의 쿼리타입이고 login... 이게 flag의 쿼리타입인듯 하다.

그래서 일단 {login_51b48f6f7e6947fba0a88a7147d54152{userid_a7fce99fa52d173843130a9620a787ce}} 이렇게 날려봤다.

그러면 admin 아이디인걸 확인 가능하고 passwd도 똑같이 날려보니

위와 같이 FLAG 획득이 가능했다.

알면 쉬우고 모르면 어려운.,.. 문제인듯 하다

728x90
반응형