320x100

웹 서비스 취약점 분석

 

엔드 포인트: /admin

엔드포인트는 컴퓨터 네트워크에 연결되는 모든 장치를 말합니다. Bob과 Alice가 전화로 통화할 때 두 사람의 연결은 한 사람에서 다른 사람으로 확장되며, 연결의 "엔드포인트" 는 각자의 전화입니다. 

 

 

admin 세션 생성은 서비스 실행 시 os.urandom(32).hex()를 통한 무작위 값 생성을 통해 username이 admin인 세션 정보를 session_storage에 생성합니다. 해당 session_storage 정보를 조회할 수 있다면 무작위 값을 추론하지 않고도 곧바로 Session ID를 획득할 수 있음을 알 수 있습니다.

 

if __name__ == '__main__':
    import os
    # create admin sessionid and save it to our storage
    # and also you cannot reveal admin's sesseionid by brute forcing!!! haha
    session_storage[os.urandom(32).hex()] = 'admin' # username이 admin인 Session ID를 무작위로 생성
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

 

 


간단한 Cookie 변조를 통한 admin 계정 탈취 연습

 

py 코드를 분석하여 guest 이메일로 로그인합니다.

 

로그인페이지에서 마우스 오른쪽 버튼을 클릭하여 inspector를 열어주고 Application -> Cookies 카테고리를 찾아 들어가면 현재 Value가 guest 인 것을 확인 할 수 있습니다.

 

value값 guest를 admin 으로 수정을 하고 새로고침을 하면 admin 계정으로 접속이 되고 FLAG를 찾을 수 있습니다.

 


간단한 Session Hijacking 연습

 

/admin 페이지에 접속하면 세션 정보 조회와 같이 현재 접속된 모든 이용자의 Session ID와 username을 조회할 수 있습니다.

 

Session ID와 username을 복사한 후 py 코드를 분석하여 user 아이디로 로그인을 합니다.

 

이후 쿠키의 sessionid의 값을 admin의 Session ID로 생성해야 합니다. 방금 연습한 웹 브라우저를 통해 쿠키 변조와 같이 웹 브라우저의 개발자 도구를 사용하면 쿠키의 정보를 수정할 수 있습니다. 

 

User의 Session ID를 admin의 세션아이디로 변경합니다.

 

 

 

 

admin의 Session ID가 적용된 상태에서 서버에 요청하면 FLAG를 획득할 수 있습니다.

결론

기본적으로 배포 전 디버그 코드가 남아있는지 검사한다면 이번 실습의 공격을 방지할 수 있습니다. “developer’s note”나 “TODO” 등과 같은 문자열들을 찾아보며 소스코드에 주석된 메시지와 코드들을 점검하는 습관을 들이는 것이 좋습니다.

 

세션 하이재킹 공격에 대해서는 세션 타임아웃을 적용해 해결할 수 있습니다. 일정 주기마다 Session ID를 재발급해 정상 로그인한 이용자는 장기간 세션을 유지할 수 있는 반면, 탈취한 Session ID로 접속한 아용자는 일정시간 이후 더 이상 해당 인증이 유효하지 않게 되므로 안전한 서비스를 구현할 수 있습니다.

 

 

 

 

dreamhack web hacking 강의를 기반으로 작성되었습니다.
300x250

+ Recent posts