안경잡이개발자

728x90
반응형

  tmitter 문제는 일종의 웹 사이트를 해킹하는 문제입니다. 다시 말해 웹 해킹 유형이며, SQL Injection을 물어봅니다. 문제 사이트에 접속하자마자 데이터베이스 테이블 형태가 등장합니다. 테이블의 구조는 다음과 같습니다.

 

 

  확인 결과 테이블은 3개의 속성으로 구성되며 id와 ps는 각각 32자를 담을 수 있는 고정 길이 문자열로 선언된 것을 확인할 수 있습니다. 다만 여기에서 varchar() 대신에 char()를 쓰고 있다는 점을 이용하면 될 것 같습니다.

 

 

  [Sign Up] 버튼을 누르면 다음과 같이 회원가입 페이지로 이동하게 됩니다. 한 번 다음과 같이 아무런 정보나 넣어서 회원가입을 해보겠습니다.

 

 

  회원가입 이후에는 해당 정보로 로그인까지 해보겠습니다.

 

 

  로그인 결과 다음과 같이 특정한 글을 작성할 수 있는 메인 페이지가 등장합니다.

 

 

  그렇다면 이 문제의 해결 조건은 무엇일까요? 다시 회원가입 페이지로 이동해보았습니다. 확인 결과 주석에 적혀있는 바와 같이 admin 계정으로 회원가입을 하면 문제가 풀린다는 것 같습니다.

 

   

  따라서 일단 admin 계정으로 회원가입을 시도해보겠습니다. 하지만 당연히 회원가입에 실패합니다. 그렇다면 어떻게 해야 회원가입에 성공할 수 있을까요?

 

 

  이러한 문제는 SQL Injection부터 시작하여, 공격 벡터가 매우 다양합니다. 따라서 문제에서 힌트를 내포하고 있을 가능성이 높다고 생각합니다. 문제를 확인해 본 결과 회원가입 페이지에서 id와 ps의 길이를 제한하고 있는 것을 알 수 있습니다. 32자가 최대라고 하는데, 이것은 쉽게 우회할 수 있습니다.

 

 

  이 문제는 사실 데이터베이스 테이블을 설정할 때 이용했던 char() 자료형의 취약점을 이용하는 문제입니다. char() 자료형은 고정 문자열이기 때문에 사용자가 입력한 문자열을 제외한 빈 공간은 공백이 차지하게 됩니다.

 

  따라서 핸드폰 번호와 같이 길이가 거의 고정적인 데이터를 저장할 때가 아니라면 varchar() 자료형을 이용하는 것이 합리적입니다. 또한 MySQL에서 char() 자료형은 공간을 벗어나는 데이터를 입력하는 경우 수용량까지만 입력을 받습니다. 다시 말해서 32자를 넘어가는 데이터를 넣어버린다면 어떻게 될까요?

 

  따라서 'admin'이라는 데이터를 넣었을 때나 'admin                               '와 같이 뒤에 공백이 포함되어 있는 데이터를 넣었을 때나 모두 마찬가지로 동일한 데이터가 데이터베이스에 기록된다는 의미입니다. 따라서 'admin                               123'과 같은 문자열을 전송하는 경우 검증 단계에서 볼 때는 두 문자열은 서로 다른 문자열이지만 실제로 데이터베이스에 등록이 될 때는 동일한 id 값으로 등록이 됩니다. 결과적으로 32자를 넘으면서, admin과 공백을 포함하는 문자열을 전송하면 성공적으로 정답 처리를 받을 수 있습니다.

 

 

 

  따라서 개발자 도구(F12)를 실행하여 다음과 같이 32자를 넘어서 많은 글자가 들어갈 수 있도록 maxlength 속성의 값을 변경하고, 텍스트 창이 잘 보이도록 width 값을 조금 넓혀 보았습니다. 그리고 'admin + 공백 + 임의 문자열'을 입력하여 데이터베이스에 데이터를 등록하시면 됩니다.

 

 

  결과적으로 다음과 같이 admin으로 회원가입 된 정보로 로그인을 해보았습니다.

 

 

  회원가입에 성공했고, 결과적으로 플래그(Flag) 값을 얻게 되었습니다.

 

 

728x90
반응형