본문 바로가기
Hacking/wargame.kr

[wargame.kr] Question 11. tmitter

by 알거음슴 2021. 6. 28.

문제

you need login with "admin"s id!

===========================

create table tmitter_user( idx int auto_increment primary key, id char(32), ps char(32));

 

 

 

풀이

문제 접근 시 로그인가능한 페이지와 계정을 생성할 수 있는 페이지 두가지가 확인된다.

 

로그인을 위해 계정 생성 페이지로 접속 시 개발자 도구(F12)를 통해 소스코드 확인을 위해 진입해보니 admin으로 접속하는 것을 힌트로 제공받을 수 있다.

 

admin 계정을 생성하려고 하면 이미 존재하는 계정이라고 확인된다. 임의의 계정을 생성하여 사이트로 로그인을 시도해본다.

 

testasdf 유저를 생성하여 로그인을 성공할 수 있고 별다른 큰 힌트나 내용들은 확인되지 않는다. admin 로그인할 수 있는 방법을 찾아보도록 하자.

 

로그인 인증 우회를 위해 로그인화면에 다양한 SQL Injection 구문을 삽입하였으나 이렇다 할 결과를 얻을 수 없었다. 다시 한번 문제를 확인해보니 create table tmitter_user( idx int auto_increment primary key, id char(32), ps char(32)); 즉 유저를 생성할때의 SQL 구문을 통해 취약점을 분석해보도록 한다.

 

이 문제의 경우 char() varchar()의 차이점의 대한 문제이다, 두 함수의 특징을 비교하면

 

char() : 고정 사이즈, 남은 공간은 공백으로 채움, 선언된 값을 초과하면 초과한 값은 삭제하고 등록함.

varchar() : 가변 사이즈, 남은 공간은 공백으로 채워지지않음, 선언된 값을 초과하면 에러가 출력되며 저장되지않음.

 

만약 admin계정을 생성시 32자리 이후에 다른 문자가 들어있는 계정을 생성할경우 32자리 이후에 입력된 문자는 삭제처리되어 자동적으로 admin사용자가 생성되는것이다. 확인해보자.

 

계정생성 페이지로 접속하여 개발자 도구(F12) -> Ctrl + Shift + c 커맨드를 통해 ID 입력값의 소스코드를 호출한다. maxlength=”32” maxlength=”128” 로 수정 시 입력 한계를 초과할 수 있다.admin입력 후 32자리 이후 임의의 값을 입력하여 admin계정을 생성해보자.

 

ID : “admin                                             123  

PS : “testeradmin”

Join 을 통해 성공적으로 계정이 생성되는걸 확인할 수 있고, 32자리이후 값은 모두 절삭처리됨으로 admin / testeradmin이라는 계정이 생성됫다 로그인을 시도해보자.

 

admin 계정으로 접속할 수 있고 또한 flag 값 역시 출력되는걸 확인할 수 있다. 해당 IP 에서만 적용되는 flag값이며 해당값을 제출하면 통과할 수 있다.