Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

White Security

[wargame.kr] tmitter 문제풀이 본문

Wargame Writeups/wargame.kr

[wargame.kr] tmitter 문제풀이

POSIX 2019. 1. 22. 11:13

wargame.kr 사이트의 11번째 문제입니다.



admin 아이디로 로그인하세요!

아래 유저 테이블의 컬럼 정보가 주어진 것으로

SQL injection 문제라는 것을 유추할 수 있습니다.



링크로 진입하면 로그인, 가입의 두가지 기능 페이지가 존재합니다.



먼저 로그인 버튼을 누르면 페이지 좌측 상단에

위와 같이 자그마한 로그인 폼이 떠오르고

적당히 입력해 보면 login failed 알림을 볼 수 있습니다.



다음으로 가입 페이지로 살펴보겠습니다.

아이디와 페스워드, 두가지 정도를 입력 할 수 있네요.



admin으로 가입을 시도해 보았지만,

정보 메시지만 보일 뿐, 가입이 되지 않습니다.


가입 페이지 소스를 살펴 보겠습니다.

자바스크립트로 아이디와 패스워드의 길이를 점검하며

각 4자, 7자가 넘지 않으면 제출이 불가하도록 되어 있군요.


하단에 admin으로 가입해야 한다는 hint가 존재합니다.



그렇지만, 기본적으로 이미 존재하는 계정으로는 가입이 불가능하니

SQL injection이 필요할 것이라 예상됩니다.



작은따옴표를 시에 앞에 역슬래시가 붙어 나오는 걸 보면

서버에서 addslashes나 mysql_real_escape_string 등의 함수를 사용하고 있다는 것을 유추해볼 수 있습니다.



%1a를 넣었을시에도 역슬래쉬가 붙으므로

mysql_real_escape_string 함수를 사용했다는 걸 알 수 있습니다.


물론 그렇지 않을 경우도 있지만, 난이도와 워게임의 특성을 고려하면 거의 확실하지요. 


여기서는 mysql_real_escape_string의 취약점으로 인해서

%bf%27 문자열이 (%27 : 작은따옴표)

%bf%5c%27 중국 문자열로 바뀌어 버린다는 점을 이용하겠습니다. 


단순하게 테이블에서 이미 존재하는 ID인지 확인하기 위해서는

select * from user where id = '$id'

같은 구문을 사용하게 되는데, 뒤에 and 0을 끼워 넣으면

select * from user where id = '$id' and 0

어떤 경우에도 아무것도 반환하지 않습니다.



따라서 %bf' and 0을 삽입하면

존재하지 않는 아이디라고 판단하게 되어

중복 가입이 가능해지는 것입니다.



비밀번호를 적절히 바꾸어 로그인을 시도하면

관리자 계정에서 Flag를 얻어낼 수 있었습니다.

Comments