WAF 및 주입 보호
1) API 시대의 WAF 이유
엄격한 검증 및 매개 변수화에도 불구하고 다음과 같은 이유로 주사가 발생합니다
통합의 "긴 꼬리" (레거시 코드, 제휴 웹 후크),
불일치 구문 분석 (프록시 앨범 프레임 워크),
새로운 프로토콜/난독 화 우회 기술.
WAF는 코드 릴리스 전에 조기 거부 및 "가상 패치" 경계를 제공하지만 보안 개발을 대체하지는 않습니다.
2) 위협 모델: API 주입 유형
SQLi/ORMi: 클래식/부울/타임 기반/적층; 지연을 통해 장님.
NoSQLi (Mongo/Elastic): 운영자 '$ ne/$ gt', JSON 주입, regex-DoS.
명령 주입/RCE: 쉘 메타 차라 터, 인수 대체, 안전하지 않은 사막화 → 코드 임원.
XXE: XML의 외부 엔터티/DTD.
SSRF: '169에 액세스하십시오. 254. 169. 254 '/내부 서비스; DNS- 리바인딩.
템플릿 주입: Jinja/Thymeleaf/Handlebar; '{{77}}'.
TP/EL 주입, XPath, 헤더 주입 (자동), 경로 순회.
GraphQL 특정: '_ _ schima' 내성, 쿼리의 깊이/복잡성.
JSON/JS 관련: 프로토 타입 오염 ('_ _ proto _ _', '생성자').
gRPC/원형: 대형 메시지, 스키마 불일치를 통한 현장 밀수.
3) WAF 아키텍처
CDN- WAF 경계: 빠른 지오/ASN 필터링, 기본 봇 제어, 캐시/패딩 방지.
주변 측정기 L7 (NGINX/Envoy/APISIX/Kong): 정확한 구문 분석, 심층 규칙, PDP/한계와의 통합.
사이드카/매쉬 (Envoy WASM/Filter): 서비스 당, 데이터에 가깝고 내부 API에 대해 덜 양성입니다.
권장 사항: 이중 계층 모델 (CDN- WAF + L7 WAF).
4) 파싱, 정규화 및 바이 패스 방지
WAF는 응용 프로그램과 동일한 표준 표현을 확인해야합니다
경로 표준화 ('/a/% 2e% 2e/b '→ 실패),' 겠습니다. 8 '/유니 코드 혼란, NUL 바이트.
단일 디코딩: URL-/HTML-/Unicode-/Base64 계층, 이중 디코딩 금지.
제한 사항: 'max _ headers', 'max _ header _ size', 'max _ body _ size', 'max _ args', JSON 깊이, 멀티 파트 한계, 2x gzip/지퍼 폭탄 금지.
컨텐츠 유형 정책: JSON 엔드 포인트에서만 '응용 프로그램/json'; "폴리 글롯" 을 거부합니다.
5) 규칙 모델
음수 (서명): OWASP CRS (SQLi/XSS/SSRF/Java/Node RCE 등). 빠른 시작.
긍정적 인 (허용 목록): 엄격한 체계 (JSON Schema/Proto), 유형 및 범위; 노선에서.
비정상/점수: "의심스러운" 표시의 합산 → 차단 임계 값.
상황: 'POST/결제' 및 'GET/상태' 에 대한 다른 프로필; 적은 FP.
6) 보호 단위 (번들)
1. 스키마 및 유형: 비즈니스 논리에 대한 JSON 스키마/프로토 타입 검증.
2. 파라 메터 화: 준비된 표현, ORM 바인딩, 연결 금지.
3. 출력 이스케이프: HTM/JS/SQL 컨텍스트.
4. 신체 정책: 컨텐츠 유형, 크기, 멀티 파트 제한, JSON 핸들의 바이너리 금지.
5. WAF 규칙: CRS + 커스텀 네거티브/포지티브.
6. 요율/쿼터/동시성: 무차별/거북이 DDoS 억제, 공공 양식에 대한 보호 캡카/도전.
7. 네트워크 격리: SSRF에 대한 탈출 정책 (RFC1918/메타 데이터/유닉스 소켓 거부).
8. 헤더 위생: 'X-Content-Type-Options: nosniff', 'Content-Security-Policy', 'Referrer-Policy'.
9. GraphQL 가드: 깊이/복잡성의 한계, prod (또는 역할 게이트) 의 내성 금지.
7) 설정 예
7. 1 NGINX + ModSecurity (OWASP CRS)
nginx load_module modules/ngx_http_modsecurity_module.so;
modsecurity on;
modsecurity_rules_file /etc/modsecurity/modsecurity.conf;
modsecurity_rules '
SecRuleEngine On
Подключаем CRS
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/rules/.conf
Позитивные правила: только JSON и ограничение размера
SecRule REQUEST_HEADERS:Content-Type "!@rx ^application/json($;)" "id:10001,phase:1,deny,status:415,msg:'Only JSON allowed'"
SecRequestBodyLimit 1048576
SecRequestBodyNoFilesLimit 1048576
Блок локальных адресов (SSRF)
SecRule REQUEST_HEADERS:Host "@ipmatch 127.0.0.0/8 10.0.0.0/8 169.254.0.0/16 192.168.0.0/16" \
"id:10002,phase:1,deny,status:403,msg:'Blocked private range'"
';
server {
listen 443 ssl http2;
server_name api.example.com;
client_max_body_size 1m;
proxy_request_buffering on; # защита от slow-POST proxy_read_timeout 300ms;
proxy_connect_timeout 100ms;
location /v1/ {
proxy_pass http://app_backends;
}
}
7. 2 특사 HTP WAF (WASM + JSON Schema + SSRF 탈출 거부)
yaml http_filters:
- name: envoy.filters.http.wasm typed_config:
config:
vm_config: { vm_id: waf, code: { local: { filename: /plugins/waf.wasm } } }
configuration:
"@type": type.googleapis.com/google.protobuf.Struct value:
crs_profile: "strict"
deny_patterns: ["(?i)union.select", "(?i)(sleep benchmark)\\s\\("]
json_schema:
"/v1/payments:create": "/schemas/payments_create.json"
- name: envoy.filters.http.router
Egress SSRF guard (L4): deny private ranges from gateway filter_chains:
- filters:
- name: envoy.filters.network.tcp_proxy typed_config:
stat_prefix: egress cluster: internet access_log: [...]
tunneling_config:
hostname: "%REQ(:authority)%"
transport_socket:
name: envoy.transport_sockets.tls
7. 3 APISIX: 유형 제한 및 난독 화 방지
yaml routes:
- uri: /v1/
plugins:
cors: { allow_origins: "https://app.example.com" }
request-validation:
body_schema:
{"type":"object","properties":{"amount":{"type":"number","minimum":1}},"required":["amount"]}
uri-blocker:
block_rules: ["..","%2e%2e","%2f..","\\x00"] # traversal/NULL proxy-rewrite:
headers:
set:
X-Content-Type-Options: "nosniff"
8) 오 탐지 조정 및 감소 (FP)
"잡음" 합법적 인 매개 변수에 대한 사용자 정의 허용 목록
경로당 프로파일: 적절한 경우에만 엄격한 규칙 (예: '/검색 '허용 '/'%').
그림자/보고서 전용: 블록 앞에 로그 응답; 메트릭의 A/B 비교.
점수: 표시기 합계> 임계 값 인 경우에만 차단하십시오.
실험: 새로운 규칙에 대한 트래픽의 작은 비율 → 자동 롤백.
9) 관찰 및 발생률
(PHP 3 = 3.0.6, PHP 4)
로그 (샘플링): 규칙, 요청의 일부 (편집), 'trace _ id', '테넌트', '경로', 이유. PII/비밀을 위장하십시오.
대시 보드: 최고 규칙/경로, FP 클러스터, 릴리스 후 역학.
사건: 아티팩트 저장 (페이로드, 필요한 경우 pcap), RCA 제품 및 "가상 패치".
10) 테스트 및 혼돈 시나리오
WAF 바이 패스 인클로저 (SQLi/XSS/SSRF), 이중/삼중 유니 코드 혼합 인코딩.
구문 분석 차이: 프록시와 프레임 워크가 분기 될 수있는 페이로드 전송 (매개 변수 중복, 배열, ';' vs '&').
느린 POST/대형, 지퍼 폭탄, 멀티 파트 형태, 잘못된 경계.
GraphQL: 깊이/복잡성 생성기, 한계 점검 및 시간 초과.
11) 안티 패턴
"CRS를 켜고 잊어 버렸습니다": 경로를 따라 조정하지 않고 계획없이.
원시 요청 기관 및 PII가있는 로그.
정규화/크기 제한이 없습니다. 분석을위한 DoS.
'콘텐츠 유형 '/문자 검사 → 폴리 글 로트 공격 건너 뛰기.
클라우드 메타 데이터에 대한 출구 필터 → SSRF가 없습니다.
외부 및 내부 API에 대한 하나의 공통 프로파일.
"파트너에 대한" 제어되지 않은 예외 → 주변의 구멍.
12) iGaming/Finance의 세부 사항
결제/출력 핸들에 대한 강화 된 프로필: 작은 신체 제한, 엄격한 체계, 계정/IBAN/PAN 필드 거부 목록 (마스킹, 형식 확인).
PSP/KYC의 웹 후크: HMAC 서명/상호 TLS, 개별 WAF 프로필, 재생 방지.
봇 등록 및 보너스 남용을 방지하기위한 Geo/ASN 필터 및 행동 제한.
사고 로그는 관할권별로 저장할 수없는 (감사) 것입니다.
13) Prod 준비 점검표
- 이중 계층 WAF (CNC + L7), 단일 정규화 및 크기 제한.
- OWASP CRS 활성화, 경로 당 사용자 정의 규칙; 쓰기 펜에 JSON 스키마/프로토 파이.
- 컨텐츠 유형/문자 정책; 이중 디코딩이 허용되지 않습니다.
- 개인 대역/메타 데이터를위한 SSRF 배출 블록; DNA 리 바인딩 보호.
- 공개 양식의 요율/쿼터/동시성 및 봇 방지 (도전 과제).
- 그림자/보고서 전용 → 카나리아 → 시행; SLO 및 FP에 의한 자동 롤백.
- 마스킹이있는 메트릭/로그/트레일; 대시 보드 "최고 규칙 "/FP.
- 가상 패치 및 RCA 플레이 북; 정기적 인 우회 테스트.
- PSP/KYC 웹 후크, 결제 펜 및 내부 API에 대한 별도의 프로파일.
14) TL; DR
계층별 보호 구축: 정규화 및 제한 → 체계/유형 → 매개 변수화 → WAF (CRS + caste) → 속도/봇 필터 → SSRF 탈출 블록. 경로당 조정, 섀도우 → 카나리아에서 새로운 규칙 실행, 메트릭/FP 모니터링 및 코드 수정 전에 "가상 패치" 를 만듭니다. 결제/웹 후크 경로-별도의 엄격한 프로필, HMAC/mTLS 및 최소 트러스트 창.