hacktricks/pentesting-web/proxy-waf-protections-bypass.md

7.4 KiB

프록시 / WAF 보호 우회

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!

HackTricks를 지원하는 다른 방법:

{% embed url="https://websec.nl/" %}

경로 이름 조작을 통한 Nginx ACL 규칙 우회

기술 이 연구에서.

Nginx 규칙 예시:

location = /admin {
deny all;
}

location = /admin/ {
deny all;
}

NodeJS - Express

Nginx Version Node.js Bypass Characters
1.22.0 \xA0
1.21.6 \xA0
1.20.2 \xA0, \x09, \x0C
1.18.0 \xA0, \x09, \x0C
1.16.1 \xA0, \x09, \x0C

Flask

Nginx Version Flask Bypass Characters
1.22.0 \x85, \xA0
1.21.6 \x85, \xA0
1.20.2 \x85, \xA0, \x1F, \x1E, \x1D, \x1C, \x0C, \x0B
1.18.0 \x85, \xA0, \x1F, \x1E, \x1D, \x1C, \x0C, \x0B
1.16.1 \x85, \xA0, \x1F, \x1E, \x1D, \x1C, \x0C, \x0B

Spring Boot

Nginx Version Spring Boot Bypass Characters
1.22.0 ;
1.21.6 ;
1.20.2 \x09, ;
1.18.0 \x09, ;
1.16.1 \x09, ;

PHP-FPM

Nginx FPM configuration:

location = /admin.php {
deny all;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

Nginx는 /admin.php에 대한 액세스를 차단하도록 구성되어 있지만, /admin.php/index.php에 액세스하여 이를 우회할 수 있습니다.

방지 방법

location ~* ^/admin {
deny all;
}

Mod Security 규칙 우회

경로 혼란

이 게시물에서는 ModSecurity v3 (3.0.12 버전까지)이 REQUEST_FILENAME 변수를 부적절하게 구현하여 액세스된 경로를 포함해야 했지만 (매개변수 시작까지), 이 변수가 URL 디코드를 수행하여 경로를 가져오기 때문에 실제로는 /foo%3f';alert(1);foo=와 같은 요청은 mod security에서 경로가 /foo로 가정될 것이지만 %3f가 URL 경로를 끝내는 ?로 변환되므로 서버가 받게 될 실제 경로는 /foo%3f';alert(1);foo=가 됩니다.

변수 REQUEST_BASENAMEPATH_INFO도 이 버그의 영향을 받았습니다.

Mod Security의 2 버전에서도 백업 파일과 관련된 특정 확장자를 가진 파일에 액세스하는 것을 방지하는 보호를 우회할 수 있었던 버그가 발생했습니다. 예를 들어, .bak와 같은 백업 파일과 관련된 특정 확장자를 가진 파일에 액세스하는 것을 방지하는 보호를 우회하기 위해 단순히 점을 URL 인코딩된 %2e로 보내는 것이 가능했습니다. 예를 들어, https://example.com/backup%2ebak.

AWS WAF ACL 우회

형식이 잘못된 헤더

이 연구는 AWS WAF 규칙을 우회할 수 있는 방법으로 HTTP 헤더에 적용된 AWS WAF 규칙을 우회할 수 있었던 "형식이 잘못된" 헤더를 보내는 것이 가능했다고 언급합니다. 이 헤더는 AWS에서 올바르게 구문 분석되지 않았지만 백엔드 서버에서는 올바르게 구문 분석되었습니다.

예를 들어, 다음 요청을 SQL 인젝션을 포함한 헤더 X-Query로 보내는 것:

GET / HTTP/1.1\r\n
Host: target.com\r\n
X-Query: Value\r\n
\t' or '1'='1' -- \r\n
Connection: close\r\n
\r\n

AWS WAF를 우회하는 것이 가능했었는데, 이는 AWS WAF가 헤더 값의 다음 줄이 해당 값의 일부라는 것을 이해하지 못했기 때문이었습니다. 반면 NODEJS 서버는 이를 이해했었습니다 (해당 문제는 수정되었습니다).

참고 자료

{% embed url="https://websec.nl/" %}

제로부터 AWS 해킹을 전문가로 학습하세요 htARTE (HackTricks AWS Red Team Expert)와 함께!

HackTricks를 지원하는 다른 방법: