본문 바로가기

웹 해킹

웹 해킹 공부 일기장 1 - 과제 (챌린지)

 

4. 관리자 계정으로 로그인하기. 하지만 계정의 아이디를 알 수 없다...

 

관리자 계정으로 로그인을 하려고 하는데 아이디를 알 수 없는데 어떻게 로그인할까요??

 

일단 SQL Injection이 가능한지 먼저 알아보겠습니다.

SQl Injection 가능
식별과 인증 동시

일단 확인해보니 SQLI 가 가능하며 비밀번호를 틀리게 입력하여도 로그인이 가능한 것을 보니 식별과 인증을 동시에 하기때문에 SELECT로 찾은 계정이 있기만하면 해당 아이디로 로그인이 되는 것 같습니다.

 

모든 계정에 대해 SELECT할 수 있다면 해당 계정으로 로그인이 될 것 같습니다.

// 추측 로그인로직
select * from users where id='$userId' and password='$userPw';

// or 1=1로 전체 계정에 대해 limit로 한 계정만 가져오기
select * from users where id='' or 1=1 limit 0,1 #'and password='$userPw';

 

그래서 생각한 것이 전체 계정을 select한 다음 limit로 하나의 계정의 데이터만 가져오는 것입니다.

limit는 마지막에 limit [가져올 행], [가져올 행 개수]로 적으면 됩니다. 가져올 행은 0부터 시작이므로 0은 첫번째 행입니다.

즉, limit 0,1 을 적으면 첫번째 줄부터 하나의 행만 가져오는 것입니다. 

 

이렇게 select * from users where id='' or true 로 전체 데이터에 대해 limit [0], 1 로 첫번째 계정의 데이터만 가져올 것입니다.

0부분만 1씩 늘려가면 언젠가는 관리자계정으로 로그인할 수 있지 않을까요...??

로그인 성공

다행히 엄청 금방 나오네요 ㅎㅎ

 

 

5. normaltic4 계정으로 로그인하기

 

doldol계정으로 로그인해보니 앞의 normaltic계정으로 로그인하는 것처럼 작동합니다.

 

- 로그인 성공 시 302 리디렉트

- SQL Injection 가능 //  입력:  doldol' and '1'='1

- 주석가능 // 입력: doldol' #

- 식별과 인증 분리 // 입력: 아이디 doldol' # 비밀번호 틀리게 입력

 

이정도 정보를 모았고 normaltic3 때 union은 컬럼 개수를 맞춰야하는데 어떻게 정확히 두 개인지 알았던 이유를 설명안한것 같아 여기서 같이 설명하자면

union으로 select 컴럼 개수 맞추기

 

doldol계정을 가져오면서 추가로 1,2를 select 하였습니다. 그러면 다음표처럼 데이터를 가져올 것입니다.

id password
doldol dol1234
1 2

만약 union으로 select 컬럼 수가 doldol계정을 가져올 때 컬럼과 맞지않다면 union을 할 수 없어 로그인에 실패했을 것입니다.

union select

컬럼 한 개만 select하면 로그인 실패한 것을 확인할 수 있습니다.

 

근데 하지만 저번처럼 ' union select 1, dol1234로는 로그인이 되지 않습니다. 그럼 한가지 더 생각해볼 수 있는 것이 해시를 사용한다입니다.

 

저번 로그인 로직 만들 때 식별/인증 분리와 동시, 해시 사용하여 식별/인증 분리와 동시가 있었습니다.

 

그럼 해시를 사용했다면 어떻게 우회할 수 있을까요??

우리가 입력한 비밀번호를 해시화하여 데이터베이스에서 가져온 계정의 비밀번호와 같은지 비교할 것입니다.

 

' union select 1, [해시화한 비밀번호] #를 입력하고 비밀번호에 해시화하기 전의 비밀번호를 입력한다면 가능합니다. 

위에서 말했듯 우리가 입력한 비밀번호를 해시화하고 select 한 비밀번호와 같은지 비교하는 것입니다.

 

혹시 이해가 되실까요?? 즉, 가져올 데이터베이스의 값을 우리가 조작하여 우리가 입력한 비밀번호의 해시값을 가져오게 하는 겁니다.

근데 문제가 있죠... 우리는 어떤 해시 알고리즘을 사용한 지 모릅니다.

 

그래서 저는 전부 다 해보아야겠다!! 생각하면서 왠지 이거 쓸거 같은거 먼저 해보았습니다.

근데 운이 좋게 바로 md5를 해보았는데 이거네요!!

로그인 성공

버프 스위트에 디코더 기능으로 쉽게 해시도 할 수 있어 진짜 좋네요!

 

 

6. normaltic5 계정으로 로그인하기

이번에도 앞에서 했던 것과 마찬가지로 doldol계정으로 로그인해보겠습니다.

doldol 계정 로그인

 

일단 doldol계정으로 로그인하니 UserId와 Password에 입력한 아이디, 비밀번호를 넣어 요청을 보내고 아이디 비밀번호가 맞으면 302로 리디렉트 index.php로 보내주며 로그인 성공되는 것 같습니다. 

근데 response 헤더의 set-cookie 부분을 보니 loginUser에 로그인할 아이디를 넣어 쿠키를 지정해주는 게 보입니다.

 

혹시?!! 이걸 normaltic5로 바꿔주면 로그인이 될까요? 바로 해보겠습니다.

이제 앞에서 해봤으니 response를 잡는 방법은 알 것이라 생각합니다. 까먹었을 수 있으니... (오른쪽 클릭 do intercept 의 response )

응답의 loginUser를 normaltic5 로 ~~~
로그인 성공

오 ~~~~ 역시 쿠키를 설정할 때는 다른 사람이 봐도 상관없거나 완전 무작위 문자열로 설정해주어야할 것 같네요!!

 

그리고 한 번 풀고 다시 블로그 작성할 때 한번더 푼거라 쿠키 지울때 알았는데 클라이언트에서 쿠키를 바꿔주어도 로그인이 될 것 같습니다.

세션을 설정해주는 이유를 한번더 체감하게 됩니다.

클라이언트에서 쿠키 변조

위와 사진처럼 개발자도구 application에서 쿠키를 확인할 수 있는데 loginUser를 바꿔주고 새로고침으로 다시 index.php를 요청해보니 로그인 성공!!!

 

사실 이때까지 normaltic계정 로그인이 다 SQL Injection 문제여서 이번 문제도 그런 문제인줄 알고 열심히 SQL 구문을 만들었는데 역시 제대로 페이지를 이용해보고 어떻게 작동하는지 확실하게 알아보아야할 것 같습니다.

 

다음 수업전에 모든 챌린지를 다풀 수 있어서 다행인 것 같습니다.

 

이번 주차는 이렇게 마무리하고 다음 수업도 열심히 올리겠습니다.