본문 바로가기

드림핵

[드림핵 워게임] [wargame.kr] tmitter

<문제>

 

 

<풀이>

문제 사이트에 접속하면 처음으로 보이는 페이지이다.

Sign Up으로 들어가본다.

 

id 와 ps를 입력하는 폼이 있다.

 

sql injection을 시도해본다.

id에 admin' or 1=1-- 를 입력하고

ps에 12341234를 입력했다.

 

 

sql injection이 제대로 먹혔다면

id : admin, pw : 12341234 로 로그인할 수 있을 것이다.

 

그런데 login failed가 떴다.

 

Sign Up은 제대로 된 것인가 확인하기 위해 

id : admin' or 1=1-- 

ps : 12341234로 로그인해보았다.

 

 

로그인에 성공했다.

하지만 id가 admin이 아니다.

 

 

오랜 시간 삽질 끝에 다음과 같은 방법으로 문제를 해결할 수 있었다.

 

문제에 계정 테이블를 생성하는 sql문이 제공되었는데,

id와 ps의 크기가 32로 제한되어 있는 것을 확인할 수 있다.

 

id에 admin을 입력해서 Sign Up을 시도하면

 

admin이 이미 존재하므로 Sign Up을 할 수 없다.

 

admin뒤에 띄어쓰기를 추가해서 Sign Up을 시도해봐도

공백이 제거된 채로 값이 전달되기 때문에 마찬가지로 admin is exist!!가 뜨며 Sign Up에 실패한다.

 

id의 입력값이 32글자로 제한되는 것과

공백이 제거된 값이 입력되는 것을 활용해

기존에 있는 admin 값과의 충돌을 우회하면서 admin으로 로그인하는 방법을 찾아낼 수 있다.

 

Sign Up 페이지에서 개발자 도구를 열어서 id input 요소에 maxlength 속성을 지운다.

그러면 id 값으로 32자를 초과하는 길이의 값을 전달할 수 있다.

 

id : admin                              1234

ps : 12341234

를 입력한다.

 

id값에 admin 뒤에 충분한 공백을 넣고 그 뒤에 임의의 값을 넣었기 때문에

db에 저장될 때는 32자 뒤에 있는 값은 잘려서 들어가므로 admin으로 저장되지만

기존의 admin 계정의 id와 비교할 때는 충돌하지 않는 것으로 인식된다.

 

Sign Up 한 뒤에

id : admin

ps: 12341234

로 Sign In 한다.

 

tmitter.php 페이지로 이동하고 FLAG가 출력된다.