본문 바로가기
분류 전/CTF

[Sunshine] BeepBoop Blog 풀이

by jwcs 2023. 10. 10.
728x90

https://github.com/D13David/ctf-writeups/tree/main/sunshinectf23/web/beep_boop

 

깃허브 링크를 올렸지만 도커를 제공해주지 않아서 나중에 풀어보긴 힘들것 같다.

 

/

초기화면이다. View All...을 누를 경우

 

이처럼 나타내준다.

 

이것저것 눌러보다가 index.js를 발견했다.

 

function loadPosts() {
    fetch("/posts").then(data => {
        return data.json();
    }).then(json => {
        document.getElementById("contents").innerHTML = "";

        let out = "";
        for (let i = 0; i < json.posts.length; i++) {
            let post = json.posts[i].post;
            let preview = post.substring(0, 100) + "...";
            let post_url = json.posts[i]["post_url"].split("/");
            let post_id = post_url[post_url.length - 1];

            const postElement = document.createElement("div");
            postElement.classNames = "post";

            const headElement = document.createElement("h3");
            headElement.innerText = `Post from ${json.posts[i].user}`;
            postElement.appendChild(headElement);

            const textElement = document.createElement("p");
            textElement.innerText = preview;
            postElement.appendChild(textElement);

            const linkElement = document.createElement("a");
            linkElement.onclick = evt => { loadPost(post_id) };
            linkElement.href = "#";
            linkElement.innerText = "View All...";
            postElement.appendChild(linkElement);

            document.getElementById("contents").appendChild(postElement);
        }
    })
}

function loadPost(post_id) {
    document.getElementById("contents").innerHTML = "";

    fetch(`/post/${post_id}/`).then(data => {
        return data.json();
    }).then(json => {;

        const postElement = document.createElement("div");
        postElement.classNames = "post";

        const headElement = document.createElement("h3");
        headElement.innerText = `Post from ${json.user}`;
        postElement.appendChild(headElement);

        const textElement = document.createElement("p");
        textElement.innerText = json.post;
        postElement.appendChild(textElement);

        const linkElement = document.createElement("a");
        linkElement.onclick = evt => { loadPosts() };
        linkElement.href = "#";
        linkElement.innerText = "Go Back";
        postElement.appendChild(linkElement);

        document.getElementById("contents").appendChild(postElement);
    })
}

window.onload = evt => {
    loadPosts();
}

index.js에서 위와 같은 코드를 볼 수 있다.

 

/posts와 /post/${post_id}가 눈에 띈다. 하나씩 살펴보자.

 

위와 같이 json형태의 값들이 줄지어있다. index.js 파일을 보니

window.onload = evt => {
    loadPosts();
}

을 볼 수 있다. 즉, 페이지를 열면 위의 json 값들을 파싱해서 우리에게 보여주는 것같다.

 

그럼 /post 파일은 어떻게 생겼는지 확인해보자.

 

위와 같이 나온다.

 

좀더 확대해보겠다. 위의 hidden 키를 볼 수 있다. 그럼 이 hidden 값이 true인 경우에 flag를 찾을 수 있을 것 같다.

 

import urllib3
import requests
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
urllib3.disable_warnings()

url="https://beepboop.web.2023.sunshinectf.games/post/"

for i in range(273,1024):
    r=requests.get(url+str(i),verify=False)
    if '"hidden":true' in r.text:
        print(r.text)
        break
    print(i)

위와 같은 코드로 풀었다.

 

짜잔

728x90
반응형

'분류 전 > CTF' 카테고리의 다른 글

[Sunshine] beepboop 풀이  (0) 2023.10.14
[Sunshine] Hotdog Stand 풀이  (0) 2023.10.10
[ASIS] hello 풀이  (2) 2023.10.02
[WACON2023] mosaic  (0) 2023.09.05
[WACON2023] mic check 풀이  (0) 2023.09.05