이번 문제는 File_Inclusion이다.
먼저 low레벨과 차이점을 알기 위해 low레벨에서 했던 방법으로 path_traversal 공격을 해서 flag파일을 찾아야한다.
아래 url처럼 ../../으로 경로를 찾아간다.
http://192.168.5.1/dvwa/vulnerabilities/fi/?page=../../hackable/flags/fi.php
하지만 아래처럼 경고가 나오게 되면서 include할 파일을 찾지 못한 것이 보인다.
경고문을 잘 살펴보면 ../../이 필터링 된 것을 알 수 있다.
medium레벨에서는 사실 str_replace() 함수로 ../과 ..\을 필터링하여 path_traversal을 방어한다.
하지만 str_replace()의 특성상 한번만 필터링을 한다.
그렇다면 ..././에서 ../을 필터링하게 되면 ../만 남게 된다는 것이다.
또한 RFI를 방어하기 위해 http://와 https://도 필터링 되어 있다.
이것 역시 hthttp://tp:// 이런식으로 입력을해서 http://가 필터링 되면 http://만 남게 될 것이다.
그럼 직접 필터링을 우회하는 주소를 입력하여 path_traversal을 통해서 fl.php 파일을 include 해보자.
주소는 아래와 같다.
192.168.5.1/dvwa/vulnerabilities/fi/?page=..././..././hackable/flags/fi.php
그렇게 되면 아래처럼 fl.php의 내용이 나오게된다.
low 때처럼 숨겨진 3번과 5번을 보기 위해서 php filter를 사용해야한다.
low레벨을 참고해서 얻은 인코드를 디코딩 하면
이렇게 숨겨진 내용을 볼 수 있다.
문자열을 필터링 해주는 함수는 정말 많기 때문에 거기에 대한 이해가 있어야 우회도 할 수 있다는 내용을 알려주고 있다.