ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2019 DIMI CTF Quals][WebHacking] simple sqli
    CTF write_up/기타 CTF 2019. 7. 15. 00:21

    문제 URL에 들어가보면 다음과 같습니다.

     

    소스를 확인해 보면 다음과 같습니다.

     

     

    해당 문제는 SQL Injection 문제 이기 때문에 필터링 값을 먼저 확인 해야 합니다. 

     

    admin    or    =    "공백"    #    '    _    where 이 필터링 되는 것을 확인 할수 있습니다.

     

    쿼리문을 한번 확인해 보면 다음과 같습니다.

    SELECT * FROM `users` WHERE `id` = trim('{$id}') AND `pw` = trim('{$pw}')

     

    trim()함수는 양쪽끝 공백을 제거하는 함수입니다.

     

    일단 아이디 비밀번호 페이로드를 먼저 작성하고 왜 그렇게 되는지 이야기 해보겠습니다.

     

    아이디 : \

    비밀번호 : )|| id like "ad" "min"-- -    (공백을 Tab으로 대체)

     

    일단 저는 필터링이 되어있는 문자들을 우회할수 있는 문자를 미리 지정해 둡니다.

     

    admin => "ad" "min"

    or => ||

    = => like

    "공백" => "Tab"

    # => --

     

    소스코드를 보면 우리는 id가 admin일때 Flag가 출력됩니다.

    \(역슬래시)가 필터링이 안되어 있어서 다음과 같이 id값에 \ 를 넣어주면서 다음과 같은 쿼리문으로 바뀌게 됩니다.

     

    \를 넣게 되면서 닫는 싱글쿼터가 문자로 변환되서 pw쪽의 여는 싱글쿼터가 id를 닫는 싱글쿼터의 역할을 하게 됩니다.

     

    )|| 를 pw 처음에 넣는 이유는 trim( 의 여는 괄호가 있어서 그것을 닫고 or를 사용해 주는 것입니다. 

     

    그래서 결국에는 다음과 같이 쿼리문이 적용이 됩니다.

     

    공백은 탭으로 바꿔서 입력을 넣어주시면 됩니다. 공백도 필터링이 되기 때문에

     

     

    Flag : DIMI{sQl_inj3Cti0n_ju5t_d0_it~}

     

     

    댓글

Designed by Tistory.