4. 관리자 계정으로 로그인하기. 하지만 계정의 아이디를 알 수 없다...
관리자 계정으로 로그인을 하려고 하는데 아이디를 알 수 없는데 어떻게 로그인할까요??
일단 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은 컬럼 개수를 맞춰야하는데 어떻게 정확히 두 개인지 알았던 이유를 설명안한것 같아 여기서 같이 설명하자면
doldol계정을 가져오면서 추가로 1,2를 select 하였습니다. 그러면 다음표처럼 데이터를 가져올 것입니다.
id | password |
doldol | dol1234 |
1 | 2 |
만약 union으로 select 컬럼 수가 doldol계정을 가져올 때 컬럼과 맞지않다면 union을 할 수 없어 로그인에 실패했을 것입니다.
컬럼 한 개만 select하면 로그인 실패한 것을 확인할 수 있습니다.
근데 하지만 저번처럼 ' union select 1, dol1234로는 로그인이 되지 않습니다. 그럼 한가지 더 생각해볼 수 있는 것이 해시를 사용한다입니다.
저번 로그인 로직 만들 때 식별/인증 분리와 동시, 해시 사용하여 식별/인증 분리와 동시가 있었습니다.
그럼 해시를 사용했다면 어떻게 우회할 수 있을까요??
우리가 입력한 비밀번호를 해시화하여 데이터베이스에서 가져온 계정의 비밀번호와 같은지 비교할 것입니다.
' union select 1, [해시화한 비밀번호] #를 입력하고 비밀번호에 해시화하기 전의 비밀번호를 입력한다면 가능합니다.
위에서 말했듯 우리가 입력한 비밀번호를 해시화하고 select 한 비밀번호와 같은지 비교하는 것입니다.
혹시 이해가 되실까요?? 즉, 가져올 데이터베이스의 값을 우리가 조작하여 우리가 입력한 비밀번호의 해시값을 가져오게 하는 겁니다.
근데 문제가 있죠... 우리는 어떤 해시 알고리즘을 사용한 지 모릅니다.
그래서 저는 전부 다 해보아야겠다!! 생각하면서 왠지 이거 쓸거 같은거 먼저 해보았습니다.
근데 운이 좋게 바로 md5를 해보았는데 이거네요!!
버프 스위트에 디코더 기능으로 쉽게 해시도 할 수 있어 진짜 좋네요!
6. normaltic5 계정으로 로그인하기
이번에도 앞에서 했던 것과 마찬가지로 doldol계정으로 로그인해보겠습니다.
일단 doldol계정으로 로그인하니 UserId와 Password에 입력한 아이디, 비밀번호를 넣어 요청을 보내고 아이디 비밀번호가 맞으면 302로 리디렉트 index.php로 보내주며 로그인 성공되는 것 같습니다.
근데 response 헤더의 set-cookie 부분을 보니 loginUser에 로그인할 아이디를 넣어 쿠키를 지정해주는 게 보입니다.
혹시?!! 이걸 normaltic5로 바꿔주면 로그인이 될까요? 바로 해보겠습니다.
이제 앞에서 해봤으니 response를 잡는 방법은 알 것이라 생각합니다. 까먹었을 수 있으니... (오른쪽 클릭 do intercept 의 response )
오 ~~~~ 역시 쿠키를 설정할 때는 다른 사람이 봐도 상관없거나 완전 무작위 문자열로 설정해주어야할 것 같네요!!
그리고 한 번 풀고 다시 블로그 작성할 때 한번더 푼거라 쿠키 지울때 알았는데 클라이언트에서 쿠키를 바꿔주어도 로그인이 될 것 같습니다.
세션을 설정해주는 이유를 한번더 체감하게 됩니다.
위와 사진처럼 개발자도구 application에서 쿠키를 확인할 수 있는데 loginUser를 바꿔주고 새로고침으로 다시 index.php를 요청해보니 로그인 성공!!!
사실 이때까지 normaltic계정 로그인이 다 SQL Injection 문제여서 이번 문제도 그런 문제인줄 알고 열심히 SQL 구문을 만들었는데 역시 제대로 페이지를 이용해보고 어떻게 작동하는지 확실하게 알아보아야할 것 같습니다.
다음 수업전에 모든 챌린지를 다풀 수 있어서 다행인 것 같습니다.
이번 주차는 이렇게 마무리하고 다음 수업도 열심히 올리겠습니다.
'웹 해킹' 카테고리의 다른 글
웹 해킹 공부 일기장 2 - 과제 (0) | 2023.12.01 |
---|---|
웹 해킹 공부 일기장 2 - 1 (SQL Injection 데이터 추출) (0) | 2023.11.30 |
웹 해킹 공부 일기장 1 - 과제 (0) | 2023.11.26 |
웹 해킹 공부 일기장 1 - 2 (인증 우회) (4) | 2023.11.24 |
웹 해킹 공부 일기장 1 -1 (SQL Injection) (0) | 2023.11.23 |