-
[L.O.S] Level 29 - phantomWargame/L.O.S 2023. 1. 1. 07:25반응형
Level 29 - phantom을 풀어보자.
SQL의 서브쿼리에 대한 개념이 있어야 풀 수 있는 문제이다.
문제 페이지를 보면, 다른 문제들과는 달리 입력 쿼리가 보이지 않는다.
그 대신 표가 출력이 되어 있다.
소스 코드가 꽤 긴데, joinmail을 파라미터로 입력해야 한다는 것을 알 수 있다.
duplicate가 필터링 되고, insert into를 통해 테이블에 값이 들어 가는데 0과 접속 주소, joinmail이 입력된다.

<phantom의 php 코드 내용> 우선 아무거나 입력을 해서 어떤 변화가 생기는지를 확인해보자.
joinmail 파라미터에 127.0.0.1을 입력해보았다.
그랬더니 insert into의 쿼리가 출력되고, 접속 ip와 입력한 값이 표에 추가로 출력되는 것을 볼 수 있다.

<joinmail 파라미터에 값 입력> 여기까지 동작을 보고 어떻게 이번 문제를 해결할 수 있을까??
여기서 문제를 해결할 수 있는 두 가지 정보를 알 수 있다.
먼저 joinmail 파라미터를 이용해 값을 입력할 때, 항상 no, ip, email이 입력된다는 것을 알 수 있다.
그 중 no과 ip는 고정이다. (0, 접속 ip)
두 번째로 문제를 풀기 위해 이용할 것은 자동으로 표로 출력되는 email을 이용하라는 것을 알 수 있다.
즉, no이 1일 때의 email을 출력하는 쿼리 문을 입력한다면 자동으로 email이 출력된다는 것이다.
여기서 서브쿼리를 이용하도록 하자.
insert into의 값을 입력할 values는 ','를 기준으로 여러 개를 한 번에 입력할 수 있다.
(insert into [table] values (a,b,c), (d,e,f), (g,h,i), ... )
그래서 쿼리 문은 먼저 아무 값이나 넣고, 괄호를 닫은 다음 ','로 원하는 값을 입력할 것이다.
아래 사진을 보면 select 문을 넣어 no이 1일 때의 email을 출력하는 모습을 볼 수 있다.
그런데 select 문을 두 번 사용하였는데 그 이유는 무엇일까??
만약 prob_phantom 테이블에서 바로 email을 select 한다면 마지막 코드가 동작할 것이다.
그래서 select email from 뒤에 한 번 더 select 문을 사용하고, as를 통해 다른 테이블처럼 지정하는 것이다.
그 결과로 no이 1일 때의 email인 admin_secure_email@rubiya.kr이 출력되는 것을 볼 수 있다.

<서브쿼리를 통한 입력 및 출력> 혹시 이해가 되지 않을까봐 select 문을 하나만 사용해 입력을 한 결과이다.
소스 코드의 마지막 부분에 있는 delete 명령으로 no이 1이 아닌 값이 모두 삭제되는 것을 볼 수 있다.

<delete 명령 동작으로 삭제된 데이터> 이제 알아낸 email을 입력해주면, PHANTOM Clear!가 출력되며 문제가 해결된다.

<phantom 문제 완료> 반응형'Wargame > L.O.S' 카테고리의 다른 글
[L.O.S] Level 31 - zombie (0) 2023.01.04 [L.O.S] Level 30 - ouroboros (1) 2023.01.02 [L.O.S] Level 28 - frankenstein (0) 2022.12.31 [L.O.S] Level 27 - blue_dragon (0) 2022.12.30 [L.O.S] Level 26 - red_dragon (0) 2022.12.28