[보안관제] X-Requested-With 헤더와 정오탐 판별

728x90

X-Requested-With 헤더란

  • X-Requested-With 헤더는 주로 웹 애플리케이션에서 AJAX (Asynchronous JavaScript and XML) 요청임을 서버에 알리기 위해 사용
  • 즉, 이 헤더가 포함된 요청은 일반적인 웹페이지 전체를 불러오는 것이 아니라, 페이지의 특정 부분만 동적으로 업데이트하기 위해 전송되었음을 의미
  • 활용예시: 사용자가 웹사이트의 '더 보기' 버튼을 클릭하거나, 스크롤을 내려 새로운 콘텐츠(예: 뉴스 기사, 상품 목록)를 로드

 

AJAX 정상적인 통신 흐름 예시

아래는 X-Requested-With: XMLHttpRequest 헤더가 정상적으로 사용되는 대표적인 시나리오입니다.
 
1. 사용자 행동: 사용자가 웹사이트의 '더보기' 버튼을 클릭하거나, 스크롤을 내려 새로운 콘텐츠(예: 뉴스 기사, 상품 목록)를 로드하려고 합니다.
 
2. 클라이언트 요청 (JavaScript):HTTP

  • 사용자의 브라우저에 내장된 JavaScript 코드가 실행됩니다.
  • 이 코드는 서버로 비동기 HTTP 요청을 생성합니다. 이때, 요청 헤더에 X-Requested-With: XMLHttpRequest를 포함시킵니다.
  • 이 헤더는 "이 요청은 웹페이지 전체를 새로고침하려는 것이 아니라, JavaScript에 의해 생성된 비동기 요청입니다"라는 것을 서버에 알려주는 깃발 역할을 합니다.클라이언트 요청 (JavaScript):HTTP
  • 요청 헤더 예시: 
  • GET /api/articles?page=2 HTTP/1.1 Host: example.com X-Requested-With: XMLHttpRequest Content-Type: application/json

3. 서버 응답: JSON

  • 서버는 X-Requested-with 헤더를 보고 이 요청이 AJAX 요청임을 인지합니다.
  • 따라서 완전한 HTML 페이지 전체를 보내는 대신, 요청에 필요한 데이터만 간결한 형태(주로 JSON 또는 XML)로 응답합니다.
  • 만약 이 헤더가 없다면, 서버는 일반적인 페이지 요청으로 오인하여 불필요한 전체 HTML 코드를 보낼 수도 있습니다.
  • 응답 본문 예시 (JSON):
    {
      "articles": [
        {"title": "새로운 기사 1", "author": "김기자"},
        {"title": "새로운 기사 2", "author": "이기자"}
      ]
    }
    ​

4. 클라이언트 처리 (JavaScript):

  • 브라우저는 서버로부터 받은 JSON 데이터를 파싱 합니다.
  • JavaScript는 이 데이터를 사용하여 현재 페이지의 HTML 구조(DOM)를 동적으로 변경하여 새로운 콘텐츠를 사용자에게 보여줍니다. 이 과정에서 페이지 새로고침은 발생하지 않습니다.

 

정탐/악성 판단을 위한 핵심 체크리스트

1. 헤더 값 자체의 형태

  • ✅ 정상 (정탐): 헤더 값이 거의 항상 XMLHttpRequest라는 표준적인 문자열입니다. 이는 jQuery, Axios 등 대부분의 표준 라이브러리가 자동으로 붙여주는 값입니다.
    GET /api/posts/next?current=123 HTTP/1.1
    Host: my-blog.com
    X-Requested-With: XMLHttpRequest
    Accept: application/json
    ​
  • ❌ 비정상 (악성 의심): F5 문서의 WireX 악성코드처럼, 값이 asdfg, 12345 등 의미 없는 무작위 문자열이거나 아예 비어있다면, 이는 정상적인 라이브러리를 통해 생성된 요청이 아닐 가능성이 매우 높습니다.
    GET /?query=attack HTTP/1.1
    Host: target-server.com
    X-Requested-With: asjdfk234
    User-Agent: Mozilla/5.0
    ​

2. 요청에 담긴 데이터 (Payload)의 내용

  • ✅ 정상 (정탐): 요청에 담긴 데이터가 서비스의 기능에 부합합니다. 예를 들어, '2페이지 더 보기' 요청에 {"page": 2} 와 같이 예상 가능한 정상적인 값이 들어있습니다.
    POST /api/search HTTP/1.1
    Host: nice-shop.com
    X-Requested-With: XMLHttpRequest
    Content-Type: application/json
    
    {"query": "노트북", "page": 2, "sort": "price_asc"}
    ​
  • ❌ 비정상 (악성 의심): 데이터가 비정상적이거나 공격 시도로 보입니다.
    • 수량 조작: {"quantity": -99} 처럼 논리적으로 말이 안 되는 값
    • SQL 인젝션: {"id": "1' OR '1'='1"} 과 같은 공격 구문
    • 데이터 부재: 데이터를 보내야 하는 요청인데 아무 데이터도 없는 경우
      POST /api/v1/login HTTP/1.1
      Host: insecure-bank.com
      X-Requested-With: XMLHttpRequest
      Content-Type: application/json
      
      {"user_id": "admin' OR '1'='1", "password": "password"}
      
       

3. 트래픽의 행동 패턴

  • ✅ 정상 (정탐): 사용자의 행동(클릭, 스크롤 등)에 맞춰 필요할 때 한 번씩 요청이 발생합니다. 트래픽 발생 주기가 비규칙적이고 자연스럽습니다.
    11:20:05 - GET /api/feed?offset=10 요청 (스크롤)
    
    11:20:12 - GET /api/feed?offset=20 요청 (다시 스크롤)
    
    11:20:19 - POST /api/posts/like 요청 ('좋아요' 클릭)
    ​
  • ❌ 비정상 (악성 의심):
    • 대량 발생 (DDoS): 특정 IP나 여러 IP에서 짧은 시간 동안 동일한 요청이 수백, 수천 건씩 쏟아져 들어옵니다.
    • 규칙적인 발생: 사람의 행동이라고 보기 어려울 정도로 1초에 한 번씩 정확하게 요청이 계속 발생합니다.
      11:22:01.100 - POST /api/login ({"user":"a","pass":"1234"})
      
      11:22:01.200 - POST /api/login ({"user":"b","pass":"1234"})
      
      11:22:01.300 - POST /api/login ({"user":"c","pass":"1234"})
      ​

4. 요청이 도달하는 주소 (API Endpoint)

  • ✅ 정상 (정탐): 요청이 도달하는 URL 주소가 실제로 AJAX 통신을 사용하도록 개발된 유효한 API 주소입니다. (예: /api/comments, /ajax/load_more)
    GET /api/v2/mail/unread-count HTTP/1.1
    Host: my-mail-service.com
    X-Requested-With: XMLHttpRequest
    ​
  • ❌ 비정상 (악성 의심): AJAX 기능이 전혀 없는 엉뚱한 주소(예: /main.html, /images/logo.png)로 해당 헤더를 포함한 요청이 들어옵니다. 이는 서버가 어떻게 반응하는지 떠보려는 스캐닝 공격일 수 있습니다.
    GET /static/css/main.css HTTP/1.1
    Host: some-website.com
    X-Requested-With: XMLHttpRequest
    ​

 
참고자료

Wirex Android DDoS Malware Adds UDP Flood

As quickly as attackers commandeer IoT devices to build more “thingbots,” they continue to evolve their attack types and functionality.

www.f5.com

 

728x90