ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • |Lord of SQL_injection| #29 Phantom
    Wargame Site/SQL injection 2019. 3. 15. 18:31






    개학과 동시에 직책과 해야할 공부가 늘어나고 있다!!


    하지만, 보안에 대한 공부는 멈추면 안되기에 ~~








    29 번 문제 Phantom 이다.

    이번 문제는 "insert" 를 이용한 SQL Injection 이라는 것을 알 수 있다.

    joinmail 에 인자를 전달해서 푸는 문제인 것 같다.





    insert 의 취약한 점은 

    별도의 필터가 없을경우, insert 하나로 여러개의 열을 삽입가능하다는 점이다.


    이 점이 심각한 이유는 경우에 따라 권한도 조정이 가능하다는 점이다.


    예를들어 계정 생성시에 priv 라는 필드에 의해 권한이 부여되는 사이트가 있을 경우, 대부분 일반계정이 할당되어있는 쿼리문을 사용할 것이다. 하지만, 이를 악용하면 임의적으로 priv 필드를 조정할 수 있기 때문에 문제가 발생한다.

     




    insert into user values(1, 'guest', '1234'), (0, 'hacker', 'root')

    ex ) 1 : 일반계정, 0 : root 계정







    우선은 단순하게 joinmail 에 1을 넣어보도록 하자.







    다음과 같은 결과가 나온다. 그렇다면 insert 취약점을 이용하면 직접 email 을 탐색할 수 있지 않을까? (select 문 삽입)




    (0, ' [ Gateway IP ]', select email from prob_phantom where no=1) 

    과 같은 형식을 넣어주면 풀릴 듯 했다....




    하지만, 아무일도 일어나지 않았다.



    그 다음부턴 구글링의 힘을 빌렸다. 그러다 보니 MySQL 1093 error 와 관련이 있다는 것을 알 수 있었다.



    MySQL 은 Oracle 과 달리 "쿼리문 내에서 동일한 테이블을 호출할 경우 에러를 발생시킨다"는 것을 알았다.

    이 문제에서 핵심적인 내용이었다. 이를 우회하기 위해서는 별칭을 넣어주면 된다고 한다.


    그리하여


    (0, ' [ Gateway IP ]', select email from prob_phantom [어떤 글자든] where no=1) 


    과 같은 형식을 만들었더니....





    짜잔!!





    이메일이 똬앟!!!






    또 하나의 에러 우회방법을 터득한 것 같아서 기분이 좋았다 ~~



    흐.뭇.하.군









    댓글

Designed by Tistory.