웹 침투--64--일반적인 WAF 우회 방법

14237 단어 웹 침투
이 글은 , HTTP , 를 통해 WAF를 우회하는 일반적인 방법을 설명합니다

1. 네트워크 아키텍처 계층


일반적으로 도메인 이름을 통해 클라우드 WAF 주소를 가리킨 후 반대로 에이전트를 실현하고 이 회사의 서버의 실제 IP를 찾으면 돌아갈 수 있다.
구체적인 방법은 다음과 같다.
1. 관련 2급 도메인 이름과 같은 도메인 이름 등록자의 다른 도메인 이름 분석 기록을 찾습니다.
2. 메일 MX 확인 레코드를 보고 실제 서버의 IP 레코드 또는 네트워크 세그먼트(예:
windows에서 명령을 실행할 수 있습니다.
nslookup -qt=mx baidu.com

Linux는 baidu를 보려면 다음과 같은 명령을 실행할 수 있습니다.com 도메인 이름의 MX 확인 IP 주소
dig mx baidu.com

3. 도메인 이름의 역사 해석 기록을 보십시오.이 작업을 수행하는 웹 사이트:
https://securitytrails.com/

4. zmap 등 빠른 스캐닝 도구를 사용하여 전체 인터넷 IP를 스캔하여 사이트의 실제 IP를 찾습니다.
5. SSRF 취약점을 이용하여 웹 사이트의 실제 IP를 역접속합니다.

2. HTTP 프로토콜 레이어


WAF, 웹 서버, 웹 언어 해석 엔진 등 세 가지가 표준 HTTP 해석에 대한 차이를 이용하여 우회할 수 있다.
구체적으로 돌아가는 방법은 다음과 같다.

1. 일부 하드웨어 WAF를 이용하여 SSL 암호화 알고리즘에 대한 지원이 부족하다.


참고 글: SSL/TLS를 남용하여 웹 응용 프로그램 방화벽에 대응하는 테스트 스크립트:abuse-ssl-bypass-waf

2. HTTP 프로토콜 버전을 사용하여 우회


HTTP는 1991년 0.9 버전에서 2015년 2.0 버전으로 발전했습니다. 관련 프로토콜을 지원하지 않는 WAF는 패킷을 해석할 때 문제가 발생하기 때문에 서로 다른 버전의 프로토콜을 보내는 패키지를 통해 일부 WAF를 돌아갈 수 있습니다.

3. URL 인코딩, charset 인코딩, MIME 인코딩 등을 이용하여 우회한다.


IIS ASP는 유사한 인코딩Unicode %u0027을 지원하며 부적합한 URL 인코딩에 대한 문자 삭제도 지원합니다.IIS ASP 쌍s%elect 인코딩의 처리 결과는 select 이고 Nginx의 ngx_unescape_uri 함수는 인코딩 결과slect 입니다.Nginx의 ngx_unescape_uri 함수는% 인코딩을 처리할 때 % 뒤에 있는 첫 번째 문자가 16진수 범위에 있지 않으면 버려집니다 %.그렇지 않으면 16진수 범위 내에 두 번째 문자가 있는지 판단하고 없으면 % 을 버립니다.
HTTP 요청 헤더Content-Type의 인코딩은 내용 인코딩을 지정할 수 있습니다. 이 값은 일반적으로 UTF-8로 인코딩되지만 악성 공격자는 charset, ibm037, ibm500, cp875, ibm1026 등 자주 사용하지 않는 인코딩을 사용하여 돌릴 수 있습니다.예를 들어, Content-Type 헤드의 값은 application/x-www-form-urlencoded;charset=ibm500 또는 multipart/form-data;charset=ibm500,boundary=blah 등입니다.여기에서 Burpsuite의 HTTP Request Smuggler 플러그인을 사용하면 패킷 수정 작업을 간소화할 수 있습니다.
Spring에서 업로드된 파일 이름이 =? 로 시작하여 ?= 로 끝나는 경우 MimeDelegate.decode 를 호출하여 파일 이름을 디코딩합니다.MIME는 메일 프로토콜에 사용되는 인코딩 방식입니다. 업로드 파일 이름을 =?UTF-8?B?YS5qc3A=?=, UTF-8은 문자 인코딩, ?B?는 뒤에 있는 YS5qc3A=는base64로 인코딩할 수 있습니다.스프링 디코딩을 통해 얻은 파일 이름은 a.jsp 이고, 일반적인 WAF는 이전에 처리되지 않았다면 WAF에 파일 이름을 올리면 필터가 돌아가는 문제가 발생할 수 있습니다.

4. 업로드 프로토콜multipart/form-data에 대한 규범에 맞지 않는 해석을 이용하여 돌아갑니다.


PHP 웹 서버 쌍 multipart/form-data 을 예로 들 수 있습니다.
이 프로토콜은 PHP 해석에 결함이 있기 때문에 한 줄에 여러 개의 filename 필드 값이 있으면 PHP 웹 서버는 다음과 같이 마지막 filename 값을 가져옵니다.
Content-Disposition: form-data; name="file1"; filename="a.txt"; filename="a.php";

PHP 웹 서버가 최종적으로 얻은 파일 이름은 a.php 이고 일부 WAF는 첫 번째 filename의 값만 판단하기 때문에 WAF가 업로드한 파일에 대한 필터 검출 기능이 해커에 의해 돌아가고 여기form-data는 있어도 되고 없어도 PHP 웹 서버 획득에 영향을 주지 않는다 filename.
또한 filename 인코딩은 HTTP 요청Content-Type 헤더charset의 영향을 받아 PHP 웹 서버는 이 값에 따라 디코딩 처리를 할 수 있다.이런 것들은 일부 사람들이 조금만 손발을 놀리면 많은 WAF의 파일을 돌려서 필터 검사 기능을 업로드할 수 있다.

5. 기타 협의의 우회


URI 해석 우회: 일부 WAF는 URI와 호환되지 않는 우회를 처리할 수 있습니다. 예를 들어 다음과 같습니다.
GET /xxx/a.jsp?x= &id=union%20all%20select%20@@version HTTP/1.1

HTTP 원본 패키지의 뒤쪽"x="을 공백으로 설정하면 일부 하드웨어 WAF는 뒤쪽&id=union%20all%20select%20@@version 매개변수를 무시하고 WAF를 우회합니다.
또한 HTTP 요청body chunked을 인코딩할 때 주석과 변형 등 비교적 적게 사용되는 HTTP 처리를 사용할 수 있다.
HTTP Host 헤더를 사용하면 도메인 이름 기반 WAF를 우회할 수도 있습니다. 일반적인 Host 헤더 문자열에는 포트 정보가 포함되지 않습니다. 예를 들어 ":80" 또는 ":443" 도메인 이름은 로컬 Host로 대체할 수 있습니다.
Host: localhost:80
Host: 127.0.0.1:80

그 밖에 프로토콜 기반의 우회는 매우 많다. 예를 들어 HPP 우회, 매개 변수 이름의 특수 문자 변환 우회 등이다.

3. 제3자 응용층


제3자 응용층은 주로 데이터베이스, 시스템 명령, 제3자 구성 요소 등 구성 부분이 있다.다음은 이 세 부분의 우회에 대해 구체적으로 설명한다.

1. 데이터베이스의 우회


데이터베이스의 우회 방식은 매우 많은데 주석이 우회하고 인코딩이 우회하며 서로 다른 데이터베이스가 빈칸에 대한 정의가 우회하는 등이 있다.
MySQL의 버전 번호 주석(/*!) 기능을 이용하여 WAF를 우회하는 경우가 가장 많고 WAF를 우회하는 방법도 있다. 예를 들어 공백 대신0xA0, WAF를 우회하는 방법\N, 부동점 등 특수용법을 이용하여 WAF를 우회하는 방법, .e 대체&& 등 키워드와 괄호 주석(예를 들어 and을 이용하여 WAF를 우회하는 등이다.
ySQL에서는 union select{x 1},xx부터 0x01까지의 문자가 공백을 나타낼 수 있습니다.주석과 줄바꿈도 일부 WAF 필터를 돌릴 수 있다. 예를 들어 0x0F1%23%0AAND%23%0A1=1는 URL 디코딩을 거친 후%23 문자, # 문자는 MySQL의 주석부호, #는 URL 디코딩을 거친 후 줄바꿈부호이다.그리고 %0A"." 특수 기호를 이용하여 돌아가는 것은 다음과 같다.
union select xx from.table
union select:top 1 from
and:xx

또한 exec 인코딩을 이용하여 키워드를 돌릴 수 있습니다. 예를 들어 다음과 같습니다.
and 1=0;declare @S varchar(4000) set @S=cast(0x44524f50205441424c4520544d505f44423b as varchar(4000));exec(@S);--

더 많은 데이터베이스에 대한 우회는 sqlmap의temper 플러그인을 참고할 수 있습니다. 플러그인 주소는 다음과 같습니다.https://github.com/sqlmapproject/sqlmap/tree/master/tamper

2. 시스템 명령의 우회

":" 명령의 경우 Linux bash 환경에서 공백을 제거하는 방법은 다음과 같습니다.
cat
cat /etc/passwd을 예로 들면 윈도우즈에서 공백을 바꾸는 방법은 다음과 같다.
ping%CommonProgramFiles:~10,-18%baidu.com
ping%PROGRAMFILES:~10,-5%baidu.com

Linux의 bash 환경에서 키워드를 우회하려면 쌍으로 된 큰따옴표, 큰따옴표 또는 큰따옴표를 삽입할 수 있습니다. 그 중에서 큰따옴표는 반드시 이어서 써야 합니다. 예를 들어 ping baidu.com 를 다음과 같이 쓸 수 있습니다.
c'a't /etc/pass''wd
c""at /e't'c/pass""wd
c""at /e't'c/pas``s``wd

또한 셸 명령의 임의의 위치에 삽입cat /etc/passwd하거나 단어 끝에 삽입$@할 수도 있습니다. 여기$x는 임의의 자모일 수 있습니다. 예를 들어 다음과 같이 쓸 수 있습니다.
c$@at /e$@tc/pas$@swd
cat$x /etc$x/passwd$x
ca$@t /etc$x/passwd$x

인코딩을 통해 키워드를 돌면cat/etc/passwd를 base64 인코딩할 수 있습니다.
echo Y2F0IC9ldGMvcGFzc3dk|base64 -d|sh

와일드카드를 통해 키워드를 돌면 linux bash의 와일드카드는 윈도우즈와 유사합니다. x 는 단일 문자와 사용? 은 여러 문자를 나타내는 쓰기를 지원합니다. 예를 들어 * 명령은 다음과 같은 쓰기를 할 수 있습니다.
/b??/ca? /e?c/pas?wd
/b*/ca* /et*/pas*d
/b??/ca* /e?c/pas*d

이 밖에perl,python,nodejs,php,java 등 스크립트 실행 엔진을 통해 WAF 키워드를 돌릴 수 있습니다.
perl -e '$a="ca";$b="t /et";$c="c/pas";exec($a.$b.$c."swd");'
python -c 'import subprocess;subprocess.call(["ca"+"t","/et"+"c/pa"+"sswd"]);'
php -r 'exec("ca"."t /et"."c/pa"."sswd");'

3, 타사 구성 요소의 우회


일반적으로 WAF에서 사용하는 타사 구성 요소는 PCRE, ISAPI, Libinjection 등입니다.
PCRE는 정규 표현식을 처리할 때 ReDoS 정규 표현식의 서비스 거부 공격을 방지하기 위해 /bin/cat /etc/passwdPCRE_EXTRA_MATCH_LIMIT 옵션을 제공하여 일치 횟수를 제한합니다.PCRE_EXTRA_MATCH_LIMIT_RECURSION의 값은 기본적으로 100만이며, PCRE_EXTRA_MATCH_LIMIT 일치하는 총 횟수를 제한할 수 있습니다.PCRE_EXTRA_MATCH_LIMIT는 주로 매칭 귀속 횟수를 제한하고 모든 매칭에 귀속이 존재하는 것은 아니기 때문에 이 값은 PCRE_EXTRA_MATCH_LIMIT_RECURSION 값보다 작을 때 의미가 있다.
일부 WAF에서는 ReDoS가 기본값보다 작은 값으로 설정되는 것을 방지하기 위해 WAF 필터링 SQL 문장의 정규 표현식을 다음과 같이 작성합니다.
/UNION.+?SELECT/is

이 때PCRE_EXTRA_MATCH_LIMIT의 값은 100만입니다. 그러면 WAF 필터 보호의 SQL 문구를 돌면 다음과 같이 쓸 수 있습니다.
union/*aaa……a*/select

여기에 주석된 문자PCRE_EXTRA_MATCH_LIMIT는 100만 개로 PCRE_EXTRA_MATCH_LIMIT 값이 100만 개라는 제한 조건을 충족시키기 쉬우며 데이터 크기가 1MB 미만이어서 공간을 많이 차지하지 않는다.이 방법에 따라 유사한 WAF 정규 규칙을 많이 우회할 수 있습니다.
ISAPI는 IIS가 제공하는 API 작성 플러그인으로 a 요청 헤더의 데이터를 필터링할 수 있고, PCRE_EXTRA_MATCH_LIMIT 요청한 바디 데이터를 얻을 수 있으며, 대응하는 원형은 ISAPI filter 이다.여기에서 ISAPI extensionpost가 요청한 바디 부분의 데이터를 얻을 수 있지만 최대 48kb의 데이터만 저장할 수 있습니다.총 크기는 HttpExtensionProc(EXTENSION_CONTROL_BLOCK*pECB) 를 통해 얻을 수 있고, 48kb가 넘는 데이터의 동기화 함수 호출 방식은 pECB->lpbData 을 통해 얻을 수 있으며, 비동기화 함수 호출 방식은 pECB->cbTotalBytes 을 통해 얻을 수 있다.
그러나 이렇게 하면 ISAPI 플러그인 WAF에서 48kb가 넘는 데이터를 읽으면 뒤에 있는 ASP가 48kb보다 많은 데이터를 얻지 못하기 때문에 ISAPI 기반의 IIS WAF는 공격 데이터를 48kb 밖으로 내보내 WAF 방어를 돌릴 수 있다.만약post 매개 변수 id에 SQL 주입이 존재한다면, 우리는 48kb의 쓸모없는 데이터를 채운 후에 주입 문장을 쓸 수 있습니다. 아래와 같습니다.
x=aaa...a&id=1%20union%20all%20select%201,1,1,1@@version,1

그 중에서 위의 a 문자가 차지하는 공간은 48kb를 넘는다
Libinjection은 많은 WAF에 사용되고 있으며, 유명한 것은modsecurity입니다.Libinjection은 SQL 문장을 태그화(token화)한 다음 태그화된 문자열을 일치시키기 때문에 같은 우회 방법은 일반적으로 많은 SQL 주입 문장의 필터 규칙을 우회할 수 있다.
자주 사용하지 않는 SQL 함수를 이용하여 Libinjection 필터를 돌릴 수 있습니다. 예를 들어mod(3,2)로 1을 대체하는 SQL 문장은 다음과 같습니다.
mod(3,2) union select mod(3,2),usr,pwd from user --

Fuzz 테스트 기술을 사용하여 Libinjection 필터를 우회할 수도 있습니다. 예를 들어 삽입pECB->ReadClient(...)대괄호를 통해서도 Libinjection 필터를 우회할 수 있습니다. MySQL은 ODBC를 호환하는 전의적 쓰기를 지원합니다. 이에 대응하는 Libinjection 필터를 우회할 수 있는 SQL 문장은 다음과 같습니다.
1'<@=1 or {x (select 1)} --
1 and{`if`updatexml (1,concat (0x3a,(select /*!50000(/*!50000schema_name) from/*!50000information_schema*/.schemata limit 0,1)),1)} -- 

4. 총결산


전반적으로 말하면 WAF에서 발굴만 잘하면 각양각색의 우회 방법을 찾아낼 수 있다.

좋은 웹페이지 즐겨찾기