바로 전 포스팅에서 parse_url의 버그를 이용하여 파라미터 내 값 체크를 우회하는 것을 정리하였다.
https://rootable.tistory.com/entry/websecfr-level-25-writeup-with-parseurl-bug
그런데 오늘 CTF 문제를 풀다 parse_url 관련 문제가 나왔는데 이번엔 파라미터 내 값이 아닌 host를 우회하는 문제가 제출되어 이에 대해 정리도 할겸 포스팅한다.
해당 문제이다. 간단하게 봤을 때 parse_url 을 잘 이용해서 https://localhost/key 를 확인하면 flag를 얻을 수 있을 것 같다.
문제에 접근하여 텍스트 부분에 scheme을 포함하여 작성한 뒤 제출을 누르면 해당 사이트에 접근되는 Link를 만들어준다.
하지만 문제에서 원하는 https://localhost/key에 대한 링크를 만드려고 하면 내부 URL들은 allow되지 않는다고 한다.
이 때 이전 포스팅에서 발견한 parse_url과 관련된 bug들은 query와 관련된 버그이기 때문에 이번 문제를 해결할 때는 도움되지 않는다.
그래서 이와 관련하여 구글링을 한 결과 아래와 같은 버그를 발견하였다.
https://bugs.php.net/bug.php?id=73192
해당 버그는 url이 아래와 같을 때 parse_url이 잘못된 host를 리턴한다고 한다.
- http://example.com:80#@google.com/
- http://example.com:80?@google.com/
위와 같이 작성할 경우 host가 example.com이 아닌 google.com으로 착각하는 버그이다.
이를 이용하여 문제를 해결해보았다.
위의 사진과 같이 버그에서 말한 두가지를 해보았을 때 ?@는 되지 않았지만 #@을 했을 때 parse_url이 host를 잘못 인식하여 내부의 key값을 가져온 것을 볼 수 있다.
해당 버그는 Real World에서 사용될 수도 있다고 판단된다.
아래와 같을 때 잘 활용해보자
- bypass authentication protocol (verify hostname of callback url by parse_url)
- open redirector (verify hostname by parse_url)
- server-side request forgery (verify hostname by parse_url and get_content)
'Hacking Contest' 카테고리의 다른 글
[ByteBandits CTF 2019] Online Previewer 1 (0) | 2019.04.13 |
---|---|
[ByteBandits CTF 2019] EasyPHP (0) | 2019.04.13 |
[2019 Encrypt CTF] vault (0) | 2019.04.03 |
[2019 Encrypt CTF] Sweeeeeet (0) | 2019.04.03 |
[2019 Encrypt CTF] repeaaaaaat (0) | 2019.04.03 |