ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Crackus 7 Write Up (Sql injection, bool type, 숫자와 문자는 true일까 false 일까? / '숫자+문자'와 숫자의 비교)
    CTF/Web 2020. 4. 12. 02:24
     
     
    이번 문제는 문제 풀이만 하면 쉽게 넘어갈 수 있지만,
    자세한 원리까지 오늘 설명해보려고 한다.
     
    코드를 읽어보면 md5('crackus') = $hash라고 되어 있다.
    crackus를 md5 해쉬 암호화한 값을 넣어주면 문제가 풀린다.
     
    하지만 이렇게 쉽게 풀리도록 출제자는 두지 않았다.
    애초에 첫번째 if문에서 아예 못을 박았다.
     
     
    숫자값이 아니면 강제로 나가진다.
     
    ?hash=a
    를 입력해보면
     
     
     
     
     
    이 뜬다.
    그래서 우리는 숫자만 입력해야하는데
    crackus를 md5 해쉬암호화 하면 알 것이다.
     
     
    이 링크에서 암호화가 가능한데, 해보면
     
     
     
     
    보면 알겠지만 알파벳이 들어가 있다.
    이 값을 그대로 넣으면 분명 Nope이 뜰 것이다.
     
    하지만 문자열을 비교하는 로직에 맹점이 하나 있다.
     
    이것을 설명하기 위해서는 bool 타입의 true, false로 올라가야한다.
     
     
    숫자중에서는 0외의 숫자는 true이다.
     
     
     
     
    3을 입력하면 참으로 결과가 출력된다.
    0을 입력한다면 당연히 0은 false로 아무것도 출력이 되지 않는다.
     
    그렇다면 문자는 어떨까?
     
     
     
     
     
     
     
     
     
    아무것도 출력이 되지 않는다.
    그 이유는 문자열은 false로 인식되기 때문이다.
    '='을 이용해서 한번 더 확인해 보자.
     
     
     
     
    false = false -> 참
    결론적으로 참이되어 결과값이 출력되었다.
     
    확실히 문자열은 false라는 것을 알 수 있다.
    그렇다면 숫자 + 문자는 어떨까?
     
    우리는 '1' 또한 참이며 '0'은 거짓인 것을 알고 있다.
     
    이것이 문자열과 섞인다면 어떻게 될까?
     
     
     
     
     
    숫자값으로 인식하여 true로 결과값을 출력하고 있는 모습이다.
     
     
     
     
     
    단 00만 적히면 0으로 인식되어 false가 된다.
     
    원리를 보면 문자열 직전의 숫자까지 인식을 하였다는 것이다.
     
    그렇다면 이러한 로직은 비교연산할때도 쓰이지 않을까?
     
     
     
     
    '123ab' = '123bc'라고 할 때는 참이 아니기 때문에 결과값이 안뜨지만,
    '123ab' = 123 이라고 문자와 숫자를 비교하게 되면
    자연스럽게 문자열의 앞에 있는 숫자와 123을 비교하게 되면서 참이되게 된다.
     
    이러한 원리를 알고나서 다시 구문을 보자.
     
     
     
    $hash에 싱글쿼터로 묶여있지 않다.
    출제자의 의도가 분명해보인다.
     
    우리가 해쉬값을 온전히 넣으려고 하면 실패하지만 첫 문자열인 'A' 이전의 숫자만 입력한다면 어떻게 될까?
     
     
     
    pw에 5045만 입력했는데도 결과값이 나온 모습을 볼수 있다.
    이 원리를 그대로 이용하여 문제를 풀면된다.
     
     
     

    댓글

Designed by Tistory.