문제풀이 & 분석
힌트를 확인하면 admin 계정으로 로그인하는 것이 목표라는 것을 알려주고 있고 tmitter_user 테이블 정보를 알려준다.
페이지에 접속하면 sign in, sign up 2가지로 나눠져있다.
먼저, 계정을 만들기 위해 sign up으로 접속하여 아무 계정이나 만들었다.
그 후 로그인해서 접속하면 위와 같이 트위터 페이지가 뜨는 것을 확인할 수 있다.
이 페이지에서 여러가지 시도를 해보았지만 딱히 진전은 없어서 힌트로 돌아왔다.
tmitter_user 테이블에 있는 id,ps 가 32자리로 구성되어있다는 사실을 알 수 있다.
만약, id의 길이가 32자리가 넘어도 계정이 생성될 수 있나?라는 의구심이 들었고 만들어봤다.
먼저, sign up 페이지에 가서 id의 길이제한을 32자리에서 33자리로 바꿔준 후 id가 33자리인 계정을 만들어봤다.
그 후에 로그인을 시도해보니??
로그인이 됐다!
id를 생성할때 33자리로 만들었지만 맨마지막을 뺀 32자리로 로그인을 해야 로그인이 성공했다.
이를 통해 33자리 이상으로 계정을 생성하더라도 32자리만큼 끊어서 계정을 생성한다는 것을 알 수 있다.
만약 웹서버에서 id를 32자리로 끊어내기 전에 id가 존재하는지 확인하는 절차가 먼저라면 어떨까?
예를 들어 [admin 1] 이런식으로 33자리의 id를 만든다면 id가 admin과 중복이 아니라고 판단한 후에 32자로 id를 끊어서 결국 DB에는 admin이라는 id의 계정이 생성될 것이다.
그렇다면, 다음과 같이 공격시나리오를 생각해볼 수 있다.
공격시나리오
1. id를 33자리 + [admin (아무값)] 형태로 생성한다.
2. 생성한 계정으로 로그인을 시도한다.
계정을 생성해보자.
이제 예측한대로라면 33자리가 32자리로 잘라지면서 맨마지막 1은 없어질 것이고 id는 admin이 되어 DB에 계정이 생성됐을 것이다.
이제 admin 계정으로 로그인을 시도해보자.