반응형
📌 목차
- WebSockets란?
- WebSockets 공격의 원리
- 주요 공격 기법
- 보안 위협과 실제 사례
- 방어 방법 및 대응 방안
🔍 WebSockets란?
WebSockets는 클라이언트와 서버 간의 실시간 양방향 통신을 제공하는 프로토콜이다.
HTTP 요청과는 다르게 연결을 한 번 맺으면 지속적으로 데이터를 주고받을 수 있어 채팅, 실시간 알림, 스트리밍 등에 많이 사용됨
그러나, WebSockets는 기본적으로 인증 및 보안 기능이 내장되어 있지 않아
잘못된 설정이 있을 경우 인증되지 않은 사용자가 연결하여 악성 메시지를 전송하는 취약점이 발생할 수 있음.
⚙️ WebSockets 공격의 원리
WebSockets는 HTTP 기반이지만, 연결이 한 번 성립되면 추가적인 인증이 필요하지 않음
따라서, 클라이언트 측에서 인증을 우회하여 악성 데이터를 서버로 전송할 수 있음.
✅ 취약한 WebSocket 연결 예제
const ws = new WebSocket("ws://example.com/socket");
ws.onmessage = function(event) {
console.log("Received: " + event.data);
};
ws.send("Hello Server!");
📌 취약점
- ws://example.com/socket은 보안 없이 누구나 접근 가능
- 서버에서 별도의 인증 없이 메시지를 처리하면 공격자가 악성 메시지를 보낼 수 있음
🚨 주요 WebSockets 공격 기법
1️⃣ 인증되지 않은 WebSocket 연결
📌 공격 방식
- WebSocket이 사용자 인증 없이 작동하면 공격자가 직접 연결하여 악성 요청 전송 가능
✅ 공격 예시
const ws = new WebSocket("ws://vulnerable.com/socket");
ws.onopen = function() {
ws.send(JSON.stringify({"action": "getUserData", "userId": "123"}));
};
🚨 결과:
- 공격자가 userId: 123 데이터를 직접 요청하여 개인정보 유출 가능
2️⃣ Cross-Site WebSocket Hijacking(CSW)
📌 공격 방식
- 피해자가 공격자가 만든 웹사이트를 방문하면 자동으로 WebSocket 연결이 이루어져 공격자가 악성 요청을 수행
✅ 공격 예제 (공격자 사이트에서 실행)
const ws = new WebSocket("ws://victim.com/socket");
ws.onopen = function() {
ws.send(JSON.stringify({"action": "transferFunds", "amount": "10000"}));
};
🚨 결과:
- 피해자의 계정을 이용하여 서버로 악성 요청을 전송
3️⃣ WebSocket 메시지 조작(Man-in-the-Middle, MitM)
📌 공격 방식
- 공격자가 네트워크에서 WebSocket 메시지를 가로채고 변조하여 악성 데이터 삽입
✅ 공격 예시 (Burp Suite를 이용한 WebSocket 가로채기)
{
"action": "updateProfile",
"role": "admin"
}
🚨 결과:
- 공격자가 자신의 계정을 관리자로 변경 가능
⚠️ 보안 위협과 실제 사례
✅ 보안 위협
- 🛡️ 인증 우회: 공격자가 직접 WebSocket 연결을 수행하여 데이터 탈취
- 🎭 CSRF & 세션 하이재킹: Cross-Site WebSocket Hijacking을 통해 악성 요청 수행
- 🚀 권한 상승: 공격자가 WebSocket 메시지를 변조하여 관리자 권한 획득
- 💣 서비스 거부 공격(DoS): 대량의 WebSocket 연결을 생성하여 서버 과부하 유발
✅ 실제 발생 사례
- 2018년 Slack WebSocket 취약점
- WebSocket이 인증되지 않은 연결을 허용하여 비인가 사용자가 메시지를 가로챌 수 있는 취약점 보고됨
- 2020년 온라인 게임 플랫폼에서 WebSocket 공격 발생
- 공격자가 WebSocket 메시지를 조작하여 부당한 게임 아이템을 획득
🔐 방어 방법 및 대응 방안
✅ 1. WebSocket 연결 시 인증 적용
- WebSocket을 열 때 반드시 JWT 또는 세션 토큰을 이용한 인증 수행
- 예제 (Node.js + WebSocket 인증)
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('connection', (ws, req) => {
const token = req.headers['sec-websocket-protocol'];
if (!isValidToken(token)) {
ws.close();
}
});
✅ 2. WebSockets에 CORS 정책 적용
- WebSocket 요청이 신뢰할 수 있는 출처에서만 수행되도록 제한
- 예제 (Express + WebSocket)
const server = new WebSocket.Server({ port: 8080, verifyClient: (info, cb) => {
const allowedOrigins = ["https://trusted.com"];
if (allowedOrigins.includes(info.origin)) {
cb(true);
} else {
cb(false, 403, "Forbidden");
}
}});
✅ 3. WebSocket 메시지 유효성 검사
- 클라이언트에서 전달하는 메시지를 화이트리스트 기반으로 검증
- 예제 (Python Flask + WebSocket)
@socketio.on('message')
def handle_message(msg):
if msg["action"] not in ["sendMessage", "updateProfile"]:
return {"error": "Invalid action"}
✅ 4. WebSocket 전송 시 암호화 적용 (wss:// 사용)
- ws:// 대신 wss://(WebSocket Secure) 사용하여 데이터 암호화
- 예제 (Nginx WebSocket 보안 설정)
server {
listen 443 ssl;
location /ws/ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
}
✅ 5. 웹 애플리케이션 방화벽(WAF) 적용
- WebSocket 메시지 패턴을 분석하여 비정상적인 요청 차단
✅ 6. 정기적인 보안 테스트 수행
- Burp Suite, OWASP ZAP 등을 활용하여 WebSocket 취약점 점검
📌 해시태그
#WebSockets #웹보안 #API보안 #정보유출 #보안취약점 #CSRF #인증우회 #실시간통신
반응형
'보안' 카테고리의 다른 글
🌐 DNS Rebinding: 도메인을 내부 네트워크 IP로 변조하여 내부 시스템 침투 🚨 (0) | 2025.02.20 |
---|---|
🚨 JWT 공격(JSON Web Token Exploitation): 취약한 서명 알고리즘을 악용한 토큰 변조 🔓 (0) | 2025.02.20 |
🚨 Mass Assignment 공격: 숨겨진 필드를 조작하여 관리자 권한 탈취 🔓 (0) | 2025.02.20 |
🔓 BOLA 공격(Broken Object Level Authorization): 인증 취약점을 악용한 데이터 탈취 🚨 (0) | 2025.02.20 |
🚨 GraphQL 공격: Introspection 쿼리를 이용한 내부 데이터 구조 유출 🔍 (0) | 2025.02.20 |