HTTP 파라미터 오염 취약점은 서버단과 클라이언트 단 에서 설명이 가능하다.
[서버단]
https://backend.example/doTransfer.php
파라미터 : toAccount=9844&amount=1000&fromAccount=12345
이를 toAccount=9844&amount=1000&fromAccount=12345&toAccount=99999
[클라이언트 단]
<? $val=htmlspecialchars($_GET['par'],ENT_QUOTES); ?>
<a href="/page.php?action=view&par='.<?=$val?>.'">View Me!</a>
이러한 php 소스가 있다고 하자
http://host/page.php?par=123%26action=edit 이라고 par의 인자값을 전달하면
<a href="/page.php?action=view&par=123&action=edit">View Me!</a>
위와 같이 action 값이 view 가 아니라 edit 으로 변경되는 경우도 있다
위 자료(https://www.owasp.org/index.php/Testing_for_HTTP_Parameter_pollution_(OTG-INPVAL-004))를 보면 어느 파라미터가 유효한지 확인 할 수 있다. 즉, 같은 이름으로 중복 파라미터가 제공되도록 해서는 안된다. 아래 사례를 보면 꽤 위험한 취약점 임을 알 수 있다.
(사례)
Twitter Unsubscribe Notifications
트위터에서 온 이메일을 unsubscribe 하기 위해 버튼을 눌를 때, 다음과 같은 url이 사용된다.
- https://twitter.com/i/u?t=1&cn=bWV&sig=657&iid=F6542&uid=1134885524&nid=22+26
해커는 UID 를 변경해보았지만, 에러페이지가 리턴된다.
HPP 취약점을 이용하여 기존 UID 파라미터 앞에 새로운 파라미터값을 삽입한 후 전달하면 성공이 된다. 즉 다른 사람의 계정의 메일링이 해지가 되는 것이다.
- https://twitter.com/i/u?iid=F6542&uid=2321301342&uid=1134885524&nid=22+26
비슷한 사례로, twitter 에서는 사용자를 팔러우하거나 좋아요를 하거나 리트윗을 하거나 트윗을 하거나 할 수 있는데 이러한 4개 행위에 대해서 HPP 취약점이 있었다.
예를 들면, 팔로우 하기 위한 URL이 다음과 같이 변경될 수 있다.
- https://twitter.com/intent/follow?screen_name=twitter&screen_name=test1234
또 다른 시나리오는 다음과 같다
정상적인 흐름
- read.jsp?num=7 -> board.jsp?cmd=read&num=7
공격 흐름
- read.jsp?num=7%26cmd=delete
- board.jsp?cmd=read&num=7&cmd=delete
# 참고
- web-hacking-101
- https://www.owasp.org/index.php/Testing_for_HTTP_Parameter_pollution_(OTG-INPVAL-004)
- https://ericrafaloff.com/parameter-tampering-attack-on-twitter-web-intents/