ABOUT ME

-

Today
-
Yesterday
-
Total
-
s0ye0ve
  • [LOS] 1. gremlin _write up - los.rubiya.kr
    Wargame/LOS (Lord of SQL Injection) 2021-02-05
    728x90

    문제를 들어가면 굵은 글씨로 써진 쿼리문과 함께 문제 코드가 보인다.

    gremlin 문제

    간단히 살펴보면 preg_match 함수로 id와 pw에 들어갈 특정 문자열들을 필터링해주고 있고, (데이터베이스 공격을 방지하기 위함인 것 같다.) id와 pw에 입력을 받아 쿼리문을 참으로 만들면 solve("gremlin") 함수가 실행되어 문제가 해결된다.

     

    따라서 SQL 인젝션을 이용해 쿼리문이 항상 참이되도록 인자를 넣어주면 된다.

     $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
     -> select id from prob_gremlin where id='1' or '1'#' and pw=''

    id에 1' or '1' %23이라는 값을 넣어주면 쿼리문 처리 시 id는 항상 참으로, pw 전에 #을 입력해 뒤의 pw입력 구문 전체를 주석처리 해주므로 pw를 몰라도 if($result ['id'])라는 조건을 만족시켜 정상적으로 쿼리문이 실행된다.

    실제 인식되는 쿼리문은

    select id from prob_gremlin where id='1' or '1'

    인 셈이다.


    주의사항

    ※ SQL 인젝션 시에는 항상 따옴표가 잘 닫혔는지, 이상하게 쓰인 것은 아닌지 확인해봐야 한다.

    where id=' '1' or '1' %23' (X)
    // 위처럼 입력하게 되면 실제 쿼리문 인식 시
    // where id=''1' 로 인식되어 따옴표를 닫아 제대로 실행되지 않기 때문에 유의해야 한다.
    
    -> where id='1' or '1' %23' (O)

    ※ #으로 주석처리를 하는데 url에 입력 시 자동으로 url encoding 되지 않아 %23으로 입력해줘야 한다.


     

    위에 작성한 SQL문을 만족시키기 위해 현재 페이지의 URL 뒤에 ?id=1' or '1' %23 을 입력해준다.

     

    정상적으로 최종 쿼리문이 true를 반환하며 문제가 해결된다.

    728x90

    'Wargame > LOS (Lord of SQL Injection)' 카테고리의 다른 글

    [LOS] 2. cobolt _write up - los.rubiya.kr  (1) 2021.02.05

    댓글

Copyright 2020. s0ye0ve all rights reserved.

Designed by Tistory.