ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] 39번 풀이
    Wargame/webhacking.kr (old) 2019. 5. 7. 18:45


    덩그러니 입력칸만 준다.

    소스를 보았다.



    쿼리문의 결과 값이 good이 나오면 문제가 풀린다.



    쿼리문을 보니 쿼터가 제대로 닫혀있지 않다.

    쿼터를 닫아주고 테이블에 존재하는 id 값을 입력해주면 문제가 쉽게 풀릴 것 같다.



    \\를 공백으로, '를 ''로 치환한다.

    따라서, 내가 '를 입력해 쿼리문을 닫으려해도 ''로 바뀌어 쿼리 에러가 발생한다.


    하.지.만

    substr함수에 의해 15글자로 잘라준다.

    이 함수를 이용하여 '를 15번째 자리에 두면, ''로 바뀌어도 뒤의 '는 잘리게 된다.



    admin         '

    (admin 대신 내 아이디를 이용해도 된다.)



    문제가 풀렸다.



    왜 공백을 넣어도 동일한 아이디로 인식하는지 알아보았다.


    char : 고정 길이 문자열

    char(10)으로 지정하면, "aa"와 "aa   "를 비교할 때 두 문자열 모두 10자리로 뒤에 공백을 붙여 비교한다.

    따라서, 같은 문자열로 인식한다.


    varchar : 가변 길이 문자열

    varchar(10)으로 지정하여도 그 문자열 만큼만을 비교한다.

    따라서, "aa"와 "aa  "는 다른 문자열로 인식한다.


    해당 사실 확인을 위해 MySQL을 이용하여 실행해보았다.



    char, varchar로 지정하여 table을 생성하였다.



    공백 없이 "admin"의 데이터를 삽입해주었다.

    그리고 "admin  "로 쿼리문 검색 시도!



    읭..?!

    둘 다 결과가 나왔다.

    나의 생각대로라면 char 값은 결과가 나오고, varchar 값은 결과가 없어야하는데...;;;


    그래서 찾아보니 데이터베이스의 설정 값이나 버전에 따라 다르게 작동할 수도 있다는 글을 보았다.

    정확한 지식을 위해 Reference manual을 찾아보았다.


    char, varchar은 문자열을 비교할 때 문자열 중 길이가 긴 문자열의 길이에 맞춰

    짧은 문자열의 오른쪽에 padding 값으로 공백을 넣어 길이를 같게한 후 비교한다.


    "admin"과 "admin         " 값을 비교할 때 짧은 문자열인 "admin"의 오른쪽에 공백을 넣어

    길이를 맞춘 후 비교하기 때문에 같은 값으로 인식되어 해당 문제를 풀 수 있었다.


    [ MySQL Reference manual ] https://dev.mysql.com/doc/refman/8.0/en/charset-binary-collations.html

    'Wargame > webhacking.kr (old)' 카테고리의 다른 글

    [Webhacking.kr] 41번 풀이  (0) 2019.05.07
    [Webhacking.kr] 40번 풀이  (0) 2019.05.07
    [Webhacking.kr] 38번 풀이  (0) 2019.05.07
    [Webhacking.kr] 37번 풀이  (0) 2019.05.07
    [Webhacking.kr] 35번 풀이  (0) 2019.05.07

    댓글

@Jo Grini's Blog