문제에 들어가면 간단한 입력 폼과, 소스코드를 볼 수 있는 버튼이 나타나있다.

 

소스를 보면 기존 webhacking.kr에서 약간 달라진 부분이 length(id)<14라는 부분이 추가되었다.

 

sql 쿼리에서 where 구문이 true가 되어서 1이 리턴되면 문제가 풀린다.

 

그런데 쿼리를 잘 보면 where구문에서 id=' 부분에 여는 싱글 쿼터는 있는데, 닫는 싱글 쿼터가 없다.

 

그리고 싱글 쿼터를 입력값으로 주면, 2개의 싱글쿼터로 치환되게 되는데, substr 함수에서 앞의 15개만 잘라내는 부분이있다.

 

따라서 싱글 쿼터를 $_POST['id']의 15번째 자리의 글자에 위치시키면 2개의 싱글 쿼터가 되더라도, substr에 의해 두번째 싱글 쿼터는 잘려서 1개만 들어가게 된다.

 

따라서 입력값은 //(admin         '//)라고 입력하면 풀리게 된다.

admin + 공백9개 + 싱글쿼터

이런 조합인데, 마지막 싱글쿼터가 2개가 되지만, substr로 잘려서 1개의 싱글쿼터만 들어가게 된다.

 

 

그리고 여기서 //('admin' = 'admin         '//)는 true값을 갖는다.

 

http://woowabros.github.io/study/2018/02/26/mysql-char-comparison.html

 

MySQL에서 'a' = 'a '가 true로 평가된다? - 우아한형제들 기술 블로그

DB 알못의 어떤 리서치

woowabros.github.io

왜 그런지는 위 블로그에 잘 설명되어 있다.

 

요약하자면, VARCHAR(15) 이런 데이터 타입이면, 길이가 15미만인 문자열을 저장할때 뒤에 공백으로 패딩을 다 채워서 저장한다고 한다.

 

따라서 문자열간의 =를 확인할 때, 뒤에 공백 패딩을 붙여서 비교를 한다고 한다. ㅎㄷㄷ한 신기한 사실이다.

+ Recent posts