[실습5-7] 세션 하이재킹 공격 대응 실습
* 세션 하이재킹을 막는 방법
1) xss 방어
2) HTTPOnly 헤더 - document.cookie 객체 접근 불가능
3) 세션 발급 시 인증 IP 넣기 (IP 검증)
예시: 정상적인 사용자가 로그인할 때 세션값과 ip를 함께 저장함
그러나, 공격자가 사용자의 세션을 탈취해도 ip 값이 다르기 때문에 페이지에 접근이 불가능해질 것이다.
단점: 매번 ip 검증을 해야 됨.
3번부터 실습을 해보자.
우선 admin 계정으로 로그인하고, 쿠키 정보를 확인하여 복사한다.
그리고 공격자 계정으로 로그인한 다른 사이트(나는 admin은 크롬, hacker는 마이크로소프트 엣지를 사용했다.)에 복사한 쿠키 값을 넣을 것이다.
직접 실습해보면 세션 탈취가 가능하다. 이것을 바꿔볼 것이다. (세션 탈취 성공하는 것은 이전 티스토리 글 참고)
우선 login.php에 들어가서 코드를 수정해보자.
아이디와 이름을 입력하는 칸 밑에, ip주소도 입력될 수 있도록 설정해보자.
표시해둔 코드 한 줄을 추가해주면 된다. 사용자의 ip 주소를 받아 ip라는 변수에 저장하는 것이다.
그러나 여기서 우리는 ip를 저장만 했지, 검증은 따로 해주어야 한다.
공통에서 적용할 수 있는 common.php에서 적용해보자.
이렇게 if문을 추가로 해준다.
우선, 로그인한 사용자인지 확인을 한 후에 현재 ip 주소와 세션에 저장된 ip 주소가 다르다면, 자동으로 로그아웃되게 페이지 리다이렉션을 시켜야 한다.
그럼 이렇게 저장하고, 잘 작동하는지 다시 시도해보자.
로그인 페이지를 수정했기 때문에 로그아웃하고 다시 로그인을 해보자.
다시 아까 admin 계정의 쿠키값을 복사해서 공격자 페이지에서 세션 하이재킹을 시도해보자.
그런데 한 가지 간과한 사항이 있다.
내가 한 pc에서 두 화면을 켰기 때문에 ip 값은 같을 수밖에 없다...
강의를 보며 참고하길 바란다...
우선 이렇게 코드를 짜고 세션 하이재킹을 시도할 경우, 공격자 화면에서는 자동으로 로그아웃이 될 것이다.
그리고 admin 계정에서도 로그아웃이 된다. 세션이 폐기되었다고 보면 된다.
그러나 이 방법에서 허점이 있다.
만약 같은 LAN 망에서 세션을 탈취당할 경우, 이런 로직을 넣는다고 해도 공인 IP로 적용되기 때문에 세션 탈취가 가능해진다. 강의에서는 사설 IP로 사용하기 때문에 실습이 성공적으로 이루어졌다.
그래서 우리는 3번 방법이 아니라, 2번 방법을 사용하는 게 더 안전하다.
적용하기 위해 APM_Setup 폴더에 들어가서 php.ini를 클릭해보자.
httponly를 검색해보면 session.cookie_httponly가 있다.
참고로 검색하는 방법은 Ctrl+F 누르면 된다.
옆에다가 On이라고 쓰고, 저장한다.
그리고 APMSetup Monitor를 껐다가 켜주면 적용될 것이다.
그리고 저번에 만들어둔 xss.php를 열어보자.
그냥 시험용으로 document.cookie가 실행되는지 확인해보는 용도로 코드를 작성해준다.
이제 사이트를 들어가보자.
http://127.0.0.1/insecure_website/xss.php
이렇게 쳐서 들어갔을 때
(참고로 나는 document.cookie가 팝업으로 나와서 다시 monitor를 껐다가 켜주었다.)
이렇게 시도해보면 분명 경고창은 뜨는데 document.cookie가 출력되지 않는 모습을 확인할 수 있다.
더 자세히 확인하기 위해서, 127.0.0.1/insecure_website/ 에 들어갔을 때 쿠키 값을 지워보자.
이렇게 지워주고,
Forward를 눌러주면
이렇게 httponly가 적용되어 있다고 뜬다.
이렇게 document 객체에 접근할 수 없어진다. 세션 하이재킹이 불가능해진다.
'웹 해킹 & 시큐어 코딩' 카테고리의 다른 글
웹 해킹 & 시큐어 코딩 (23) (0) | 2025.02.04 |
---|---|
웹 해킹 & 시큐어 코딩 (22) (0) | 2025.02.02 |
웹 해킹 & 시큐어 코딩 (20) (0) | 2025.02.01 |
웹 해킹 & 시큐어 코딩 (19) (0) | 2025.01.30 |
웹 해킹 & 시큐어 코딩 (18) (0) | 2025.01.28 |