최신 웹 개발 아키텍처에서 가장 중요한 것은 자바스크립트 필터 함수 (Array.prototype.filter())는 함수형 프로그래밍의 초석으로 인정받고 있습니다. 이를 통해 개발자는 선언적이고 깔끔한 코드를 작성하여 데이터 집합을 조작할 수 있습니다.
그러나 공격적인 보안 엔지니어에게 자바스크립트에서 '필터'라는 개념은 위험한 이분법을 나타냅니다. 한편으로는 광범위하게 퍼져 있는 공격의 근본 원인입니다. 클라이언트 측 액세스 제어 취약점. 반면에, 자바스크립트 언어 자체의 유연성은 필터 메서드를 강력하고 가젯 웹 애플리케이션 방화벽(WAF) 및 입력 소독기를 우회하는 데 사용됩니다.
이 가이드는 구문을 뛰어넘습니다. 클라이언트 측 필터링의 아키텍처적 오류를 분석하고, 공격자가 표준 라이브러리 메서드를 무기화하여 코드를 실행하는 방법을 분석하며, 다음과 같은 AI 기반 플랫폼이 어떻게 작동하는지 살펴봅니다. 펜리전트 는 이러한 미묘한 논리적 결함 발견을 자동화하고 있습니다.
구조적 결함: 클라이언트 측 자바스크립트 필터
가장 널리 퍼져 있는 취약점은 자바스크립트 필터 는 언어의 버그가 아니라 보안 모델 구현의 버그입니다. 단일 페이지 애플리케이션(SPA)과 두꺼운 클라이언트(React, Vue, Angular)의 시대에 개발자는 종종 다음과 같이 혼동합니다. 프레젠테이션 와 함께 보안.
"모호성에 의한 보안" 패턴
표준 시나리오를 생각해 보세요: API 엔드포인트가 사용자 목록을 반환합니다. 프런트엔드 개발자는 활성 사용자만 표시하고 관리자는 숨겨야 합니다.
자바스크립트
// 취약한 패턴
fetch('/api/v1/users')
.then(response => response.json())
.then(data => {
// 개발자는 자바스크립트 필터를 사용하여 뷰를 "보안"합니다.
const visibleUsers = data.filter(user => user.role !== 'admin' && user.status === 'active');
renderTable(visibleUsers);
});
일반적인 DAST 스캐너의 경우 이 애플리케이션은 안전해 보입니다. UI에는 관리자 데이터가 표시되지 않습니다. 그러나 Burp Suite 또는 간단한 DevTools를 사용하는 보안 엔지니어는 진실을 알고 있습니다.
공격 벡터: IDOR 및 PII 유출
그리고 자바스크립트 필터 는 신뢰할 수 없는 환경인 사용자의 브라우저에서 실행됩니다. 여기서 취약점은 전체 데이터 세트 가 유선으로 전송되었습니다.
익스플로잇 단계:
- 인터셉트: 공격자가 트래픽을 프록시합니다.
- 검사: 원시 JSON 응답에는 다음과 같은 객체가 포함됩니다.
{ "id": 42, "role": "admin", "pii_ssn": "xxx-xx-xxxx" }. - 바이패스: 공격자는 UI 로직을 완전히 무시합니다.
이것은 실패입니다. 데이터 최소화. 적절한 구현은 데이터베이스 쿼리 수준에서 필터링을 수행합니다(SQL 어디 절)를 사용하여 민감한 바이트가 데이터 센터를 떠나지 않도록 합니다.
구문 무기화: XSS 가젯으로서의 자바스크립트 필터
크로스 사이트 스크립팅(XSS)에 초점을 맞추면 다음과 같은 용어가 사용됩니다. 자바스크립트 필터 는 악성 코드를 차단하는 방어 필터(WAF/세니타이저)라는 새로운 의미를 갖게 됩니다.
공격자는 다음과 같이 차단된 키워드를 사용하지 않고 임의의 코드를 실행하는 데 악용될 수 있는 JavaScript 런타임의 표준 사용 가능한 메서드인 "가젯"을 지속적으로 찾고 있습니다. eval(), 함수()또는 <script>.
생성자 체인 바이패스
WAF는 종종 명백한 싱크를 찾습니다. 하지만 자바스크립트는 동적입니다. 자바스크립트의 Array.prototype.filter 메서드는 함수이며, 자바스크립트의 모든 함수에는 생성자가 있습니다. 함수의 생성자는 기능 객체와 유사하게 작동하는 eval().
WAF가 차단하는 경우 eval() 를 사용하지만 배열 메서드를 허용하는 경우 공격자는 다음을 사용하여 페이로드를 구성할 수 있습니다. 필터 메서드 자체입니다.
바이패스 로직:
[]배열을 생성합니다.[].filter필터 기능에 액세스합니다.[].filter.생성자글로벌기능생성자.Function('code')()코드를 실행합니다.
페이로드:
자바스크립트
// 표준 페이로드(WAF에 의해 차단됨)
eval('alert(1)')
// 자바스크립트 필터 가젯을 사용한 회피
[].filter.constructor('alert(1)')()

표: 일반적인 자바스크립트 필터 회피 기법
| 기술 | 페이로드 구조 | 메커니즘 | 보안 컨텍스트 |
| 생성자 체인 | [].filter.constructor('code')() | 프로토타입 체인을 사용하여 기능 생성자. | 다음에서 키워드 필터를 우회합니다. 평가. |
| 이터레이터 남용 | [].map.constructor('code')() | 필터와 유사하며 모든 배열 프로토타입 메서드와 함께 작동합니다. | 다음과 같은 경우 중복성 필터 를 특별히 모니터링합니다. |
| 문자열 난독화 | [].filter['c'+'onstructor'] | 키워드 '생성자'를 연결된 문자열로 분리합니다. | 정규식 기반 WAF 규칙을 우회합니다. |
| 유니코드 인코딩 | \u0061lert(1) | 함수 이름에 유니코드 이스케이프를 사용합니다. | 자바스크립트 파서는 이를 디코딩하지만 단순 필터는 디코딩하지 않습니다. |
필터가 실패할 때: 프로토타입 오염 (CVE-2019-10744)
객체를 병합할 때는 '필터링'이라는 개념이 매우 중요합니다. 애플리케이션이 JSON 입력을 받아 기존 개체에 병합하는 경우 엄격한 조건 없이 필터링 키를 누르면 프로토타입 오염의 문이 열립니다.
가장 영향력 있는 사례 중 하나는 다음과 같습니다. CVE-2019-10744 널리 사용되는 lodash 라이브러리.
취약점의 해부학
기능 defaultsDeep 는 객체를 재귀적으로 병합하도록 설계되었습니다. 그러나 키를 거부하는 보안 필터를 구현하지 못했습니다. 생성자.
익스플로잇:
공격자는 프로토타입을 가리키는 생성자 속성이 포함된 JSON 페이로드를 제공합니다.
자바스크립트
const payload = '{"생성자": {"프로토타입": {"isAdmin": true}}}';
_.defaultsDeep({}, JSON.parse(payload));
영향력:
입력이 필터링되지 않았기 때문에 할당이 기본 Object.prototype을 오염시켰습니다. 갑자기 JavaScript 런타임의 모든 객체가 isAdmin: true 속성을 상속받았습니다.
애플리케이션에 다음과 같은 인증 로직이 있는 경우:
자바스크립트
if (user.isAdmin) { grantAccess(); }
공격자는 즉시 관리자 액세스 권한을 획득하여 Node.js 컨텍스트에 따라 서비스 거부 또는 RCE를 생성합니다.
수정: 강력한 자바스크립트 필터 객체 키의 경우 블록 목록 __proto__, 생성자및 프로토타입.
자동화된 로직 검색: 펜리젠트 접근 방식
위에서 설명한 취약점인 클라이언트 측 필터링과 프로토타입 오염은 기존의 DAST(동적 애플리케이션 보안 테스트) 도구로는 탐지하기 어려운 것으로 악명이 높습니다.
- 기존 스캐너: 충돌, 오류 코드(500) 또는 단순 반영된 XSS 문자열이 있는지 확인합니다. 그들은 이해하지 못합니다
users.filter()는 민감한 데이터를 숨기고 있습니다. - AI 격차: 이러한 문제를 찾으려면 다음을 이해하는 엔진이 필요합니다. 코드 의미론 그리고 데이터 흐름.
여기에서 Penligent.ai 보안 엔지니어의 워크플로우를 근본적으로 변화시킵니다.
시맨틱 퍼징 및 논리 분석
펜리전트는 패턴 매칭을 뛰어넘는 고급 AI 에이전트를 활용합니다. 대상 애플리케이션을 분석할 때 펜리전트 엔진은 다음을 수행합니다. 컨텍스트 인식 분석:
- 데이터 흐름 검사: 펜리전트는 렌더링된 DOM과 비교하여 API 응답을 모니터링합니다. API가 50개의 필드를 반환하지만 DOM이 5개만 렌더링하는 경우, AI는 잠재적인 자바스크립트 필터 논리 결함을 발견하고 이를 데이터 유출 위험으로 표시합니다.
- 가젯 생성: 펜리젠트는 정적인 XSS 페이로드 목록을 사용하는 대신 환경에서 사용 가능한 오브젝트를 기반으로 페이로드를 동적으로 생성합니다. 다음 사항을 감지하면
Array.prototype.filter를 사용할 수 있지만평가가 차단되면 특정[].filter.생성자바이패스 페이로드. - 프로토타입 퍼징: AI는 프로토타입 오염 벡터로 JSON 엔드포인트를 지능적으로 퍼징하여 애플리케이션 상태를 모니터링하여 예기치 않은 속성 상속이 있는지 확인하고 사용자 지정 코드에서도 CVE-2019-10744 스타일 결함을 식별합니다.
펜리젠트는 '해커의 직관'을 자동화함으로써 보안 팀이 일반적으로 수동 코드 검토가 필요한 심층적인 논리적 결함을 식별할 수 있게 해줍니다.
심층 방어: 런타임 강화
무기화된 자바스크립트 필터 가젯과 논리적 결함을 발견했다면 계층화된 방어 전략을 채택해야 합니다.
1. 황금률: 서버 측 유효성 검사
보안을 위해 클라이언트 측 로직에 의존해서는 안 됩니다. 필터링은 데이터베이스 수준에서 이루어져야 합니다.
- 감사: 모든 API 엔드포인트를 확인하세요. 사용자가 볼 수 있는 권한이 있는 데이터만 반환하는지 확인합니다. 지금 바로.
- DTO: 백엔드에서 데이터 전송 개체를 사용하여 직렬화하기 전에 민감한 필드를 제거하세요.
2. 불변 프로토타입
프로토타입 오염 취약점의 전체 클래스를 제거하려면 애플리케이션 시작 시 표준 객체 프로토타입을 동결하세요.
자바스크립트
// 프로토타입 오염에 대한 방어
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
이렇게 하면 자바스크립트 필터 가 악성 키를 차단하지 못하면 런타임이 수정을 허용하지 않고 오류를 발생시킵니다.
3. 콘텐츠 보안 정책(CSP)
CSP는 최고의 백스톱입니다. 이를 방지하기 위해 [].filter.생성자 익스플로잇을 사용하려면 문자열을 코드로 실행하지 않도록 설정해야 합니다.
추천 헤더:
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
결정적으로, 피하다 추가 'unsafe-eval'. 없이 'unsafe-eval'로 설정하면 브라우저에서 생성된 코드 실행을 거부합니다. 기능 생성자를 생성하여 필터 가젯을 쓸모없게 만듭니다.
4. DOMPurify를 사용한 입력 살균 4.
직접 정규식 필터를 작성하지 마세요. 쉽게 우회할 수 있습니다. 사용 DOMPurify 를 사용하여 HTML 입력을 살균합니다. 샌드박스를 생성하고 HTML을 구문 분석하며 엄격한 허용 목록에 따라 악성 태그/속성을 제거하여 XSS가 DOM에 도달하기 전에 무력화합니다.
결론
용어 자바스크립트 필터 는 기만적입니다. 주니어 개발자에게는 유틸리티일 뿐입니다. 선임 보안 엔지니어에게는 데이터 유출을 확인하라는 신호이자 XSS 회피를 위한 도구이며 입력 유효성 검사를 위한 중요한 체크포인트입니다.
최신 애플리케이션이 점점 더 복잡해짐에 따라 이러한 미묘한 로직 결함을 발견하기 위해 수동 테스트에 의존하는 것은 지속 가능하지 않습니다. 다음과 같은 플랫폼의 AI 기반 자동화와 결합된 심층적인 아키텍처 이해를 활용하세요. 펜리전트 만이 시대를 앞서나갈 수 있는 유일한 방법입니다.

