본문 바로가기

Web Hacking/Dreamhack

[Dreamhack] tmitter write up

 

문제 설명으론 테이블 생성 쿼리문 하나만 알려준다.

 

 

위 사진은 서버에 접속했을 때 index 화면이다. 로그인과 회원가입이 있다. 

 

회원가입 창으로 이동 후 개발자 도구를 보면 admin으로 가입 하라는 힌트가 보인다. admin으로 가입 후 로그인 하면 flag가 출력될 것 같다.

 

일단 꽤 푸는데 고민을 많이 한 문제이다. 먼저,

 

1. char 특징 이용-1

 

char 특성상 char(32) 와 같이 선언할 경우 32바이트가 안 채워지면 문자열 뒤에를 공백으로 채워 32바이트를 만든다. 따라서 admin%20으로 우회를 시도했지만 실패했다.

 

2. 로직 버그 이용

 

백엔드 로직을 추측해보면 id가 있는지 확인한 다음에 insert문을 날릴 것이다. 때문에 select로 조회를 먼저 진행한다. 즉 %20admin으로 우회를 시도했지만 실패했다. -> 아마도 trim과 같은 함수가 있는 것 같다.

 

3. 로직 버그 + char 특징 이용-2

 

mysql docs에 가보면 char특징이 친절하게 나온다. char(4)로 선언 되어 있지만 'abcdefgh' 즉, 8바이트가 입력될 경우 뒤 4바이트는 잘린다.

 

서버측 로직을 생각해보면, 폼으로 전달된 사용자 입력값을 그대로 가져와 trim으로 공백만 제거한다. 즉, 33바이트면 그대로 가져와 select 쿼리문을 날린다. admin은

 

"admin%20 * 27"로 저장되어 있을 것이다. 따라서 "admin%20 * 27 + a" 와 같이 입력할 경우 select문 결과로 admin이란 id는 없다고 리턴될 것이고 insert문으로 그대로 회원가입이 된다.

 

이때 회원가입이 될때는 char 특성상 뒤의 a는 잘리기 때문에 admin이 중복되어 DB에 저장되게 된다.

 

즉, maxlength만 우회하면 admin으로 회원가입이 가능하다.

 

 

위 값을 33으로 바꿔주자.

 

 

가입 완료