HTTP Parameter Pollution

HPP Attack

Introduction

HTTP Parameter Pollution(HPP)는 중복된 파라미터를 웹 어플리케이션이 처리하는 방식의 차이를 이용한 공격 방법입니다. 정확하게는 특정 리스크를 가진 공격 방법이라기 보단 다른 취약점으로 연결하기 위한 트릭으로 사용되며, 동일한 이름의 파라미터를 중복으로 전송하여 서비스의 의도하지 않은 처리를 유도하는 방법입니다.

Normal request

GET https://www.hahwul.com/?q=1234 HTTP/1.1

HPP request

GET https://www.hahwul.com/?q=1234&q=4444 HTTP/1.1

Offensive techniques

Detect

특정 기능들에 동일한 이름의 파라미터를 복수로 보내서 반응을 살펴봅니다. 웹 어플리케이션에 따라 처리 방법이 상이하며, 이를 이용하면 2개의 웹 어플리케이션이 다른 파라미터 값을 보도록 유도할 수도 있습니다.

Technology Parsing Result outcome (par1=)
ASP.NET/IIS All occurrences a,b
ASP/IIS All occurrences a,b
PHP/Apache Last occurrence b
PHP/Zues Last occurrence b
JSP,Servlet/Tomcat First occurrence a
Perl CGI/Apache First occurrence a
Python Flask First occurrence a
Python Django Last occurrence b
Nodejs All occurrences a,b
Golang net/http - r.URL.Query().Get("param") First occurrence a
Golang net/http - r.URL.Query()["param"] All occurrences a,b
IBM Lotus Domino First occurrence a
IBM HTTP Server First occurrence a
Perl CGI/Apache First occurrence a
mod_wsgi (Python)/Apache First occurrence a
Python/Zope All occurences in array [‘a’,’b’]

또한 일부는 백엔드에서 Array 형태로 처리되기 때문에 이를 이용하여 IDOR 과 같이 타 권한에 영향을 끼칠 수 있도록 유도할 수 있습니다.

Bypass protection

웹 어플리케이션의 처리 방식, 그리고 HPP를 통해 얻고자 하는 취약점에 따라서 방법이 상이합니다. 한가지 예시를 보여드리면, HPP를 이용해서 Host validation을 우회할 수 있습니다.

일부 서비스는 동일 이름의 파라미터가 존재하는 경우 Array 형태로 처리하게 되는데, @와 함께 HPP 공격코드를 구성해서 아래와 같이 실제 도메인 검증은 우회하고, 공격자가 의도한 페이지로 이동할 수 있도록 구성해볼 수 있습니다.

Request

GET /?url=https://trusted.domain&url=@untrusted.domain

Backend

url: https://trusted.domain,@untrusted.domain

자세한 내용은 해당 포스트를 참고해주세요.

Defensive techniques

HPP로 인한 공격이 발생헀다면, 동일 파라미터를 처리하는 방식에 변화를 주어야합니다. 이는 HPP로 발생하게 되는 여러가지 취약점에 따라 대응 방법이 상이하겠지만, 파라미터단에서 대응이 필요하다면 동일한 이름의 파라미터 값이 들어올 수 있다고 가정하고 개발을 진행해야 합니다.

Tools

  • ZAP, Burpsuite 등 대다수 도구에서 이를 탐지합니다.

Articles

  • https://www.hahwul.com/2021/06/21/bypass-host-validation-with-parameter-pollution/

References

  • https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/HTTP%20Parameter%20Pollution