본문 바로가기

[Wargame Write-up]/HackThis!!

[HackThis!!] [SQLi] LEVEL 2

Level 1과 같은 로그인 Form이 보인다. 관리자 계정으로 접속하라고 한다.

 

 

 

Level 1처럼 입력값을 넣고 테스트해봤더니

 

 

 

별다른 메시지를 표시해주지 않는다. 아래쪽에 Browse Members라는 버튼이 신경쓰인다.

 

 

 

알파벳 순으로, 해당 알파벳으로 시작하는 member 리스트를 보여준다.

 

 

 

다른 알파벳을 클릭하니 마찬가지인데, URL을 보니

 

 

 

q 라는 파라미터가 추가되었다. 이 파라미터를 통해 넘기는 값으로 시작하는 member를 테이블에서 검색하는 것 같다.

 

 

 

이 가설을 검증하기 위해, 위 이미지에서 Daw gulf만을 표시하기 위해, q=da라고 변경해보았다. 생각이 맞았다.

 

URL을 이용하여, 관리자인 계정을 찾은 후, 그 계정의 패스워드를 알아내면 될 것 같다.

 

 

 

그 전에, 오류가 있는 쿼리에 대해 Level 1때처럼 Syntax Error를 뱉지는 않는지, 일부러 오류가 있는 쿼리를 넣어 확인해보자.

(이렇게 DB 정보 획득을 위해 구문의 오류를 기반으로 하는 공격을 Error-based SQL Injection이라 한다.)

 

 

 

이 Error를 통해, username과 admin column을 검색하지만, username만 표시하는 것을 알 수 있다.

 

admin column은 관리자인지 아닌지 1(True) / 0(False)의 값으로 구성되는 column일 것이다.

 

이것 또한, 다음 값으로 검증해볼 수 있다.

 

q=%' and admin=0--

 

이렇게 하면, SELECT username, admin FROM members WHERE username LIKE '%' and admin=0-- 이라는 쿼리가 되는데,

 

%는 임의의 문자열이라는 뜻의 마스크로, admin 값이 0인 모든 username을 표시해줄 것이다.

 

 

 

너무 길어서 중략했다. 하지만, admin column에 대한 값의 구성을 알게 되었다.

 

반대로, admin=1로 바꾸면 관리자 계정을 알 수 있다.

 

 

 

이제, 비밀번호를 획득해야 한다. 검색하는 column을 바꿀 수 없으니, Union SQL Injection을 통해 공격한다.

 

UNION 연산은 이 키워드 전후에 나오는 쿼리의 결과를 합쳐주는 연산이다. 집합론에서 합집합과 동일한 연산이다.

 

당연히, 앞뒤에 나오는 쿼리에서 검색하는 column의 수는 동일해야 한다. 현재 앞쪽에서 2개(username, admin)를 검색하고 있다.

 

패스워드를 담는 열의 이름이 password일거라 추측하고, 다음 쿼리를 입력값으로 줘보자.

 

q='a' union select password, 2 from members where username='bellamond'--

 

원래 이 페이지에서는 username, admin 값을 검색하면서 첫 번째 열인 username만 출력된다.

 

이것을 이용해, 첫 번째 열에 password를 배치하고, 쿼리에 에러가 나지 않으면서 2번째 가상의 열을 만들 수 있는 숫자를 넣은 것이다.

 

이 쿼리를 실행하면 bellamond 계정의 패스워드와 2가 2열로 표시되지만, 화면에는 1열만 표시되므로 패스워드만 볼 수 있다.

 

 

 

비밀번호가 Hash 처리되어있다. 웹 서비스였다면 어려웠겠지만, 워게임이므로 이 hash 값에 대한 평문이 검색될 것이다.

 

 

 

맨 아래쪽에 평문이 보인다. 정리하면,

 

Username: bellamond

Password: sup3r

 

인 셈이다.

 

이제 다 끝났다. 로그인하면 끝이다.

 

'[Wargame Write-up] > HackThis!!' 카테고리의 다른 글

[HackThis!!] [MAIN] LEVEL 4  (0) 2016.12.17
[HackThis!!] [MAIN] LEVEL 3  (0) 2016.12.17
[HackThis!!] [MAIN] LEVEL 2  (0) 2016.12.17
[HackThis!!] [MAIN] LEVEL 1  (0) 2016.12.17
[HackThis!!] [SQLi] LEVEL 1  (0) 2016.09.13