https://portswigger.net/web-security/file-path-traversal

[File Download ] 공격 및 대응방안 정리

내가 업로드한 파일을 다운받는다는 것은 서버의 다른 파일을 다운받는 것의 가능성도 존재한다.

하지만 이경우는 download. php라는 경로를 입력으로 받아서 경로에 해당하는 파일의 데이터를 보여줌으로써 가능하다. 왜 download.php를 거쳐야하는 것일까 그것은 예제로 설명해줄 것이지만 간단히 말하자면 일반적으로  직접적인 경로로php 파일의 데이터를 불러오면 <?php ?> 라는 부분은 서버측 언어이기때문에 실행되어 반환되게 한다. 즉 우리가 가장 보고싶은 서버측 과의 소통과정이 없기때문에 약점을 파악하는데 어려움이 있다. 그와 대조되는 download.php 같은 경우 파일을 실행해서 가져오는 것이 아닌 읽어주기만 하기 때문에 <?php ?> 쪽 데이터가 보일 수 있게 된다. 그렇기 때문에 download.php라는 중간 단계를 거치는 경우에만 데이터를 전체 다 볼 수 있다.

아래는 예시인데 downlaod.php에서 filepath라는 변수를 Get로 받아서 처리하는 것을 볼 수 있다. 이때 경로를 상위디렉토리의 download.php의 경로를 넣어줬더니 아래와 같이 download.php의 내부 파일 내용이 나온 것을 볼 수 있다.

위와 같이 Download 기법을 통해 다양한 etc/pwd와 같은 데이터를 뽑을 수 있으니 이를 조심해야한다.

하지만 한계도 존재한다. 만약 상위폴더에 여러개의 하위폴더가 존재할경우 여러하위폴더들은 확인 불가하다 우리가 넣을수 있는 경로는 상위폴더로 이동하는 경로만 넣을 수 있기 때문이다.

 

대응 방안

(1) DB 에 파일 저장 CLOB/BLOB

즉 파일 경로를 DB에 저장함으로써 파일 경로를 변경 불가능하게 할 수 있다. 하지만 이경우도 SQL injection이 가능하다면 DB의 내용을 파악하여 DB 내용을 바꾸는 코드를 넣을 수 있다면 우회가 가능하다.

DB 사용 예시:

fileId
select filepath from board where fileId="filePath"
downlaod(filePath)


(2) ../ (디렉토리 트레버져) 공격을 막을 수 있는 필터링

생각해보면 상위디렉토리로 못가게만 하면되는 것이 아닌가? 그렇기 때문에 상위 디렉토리로 가는 ../와 ../와 상응하는 url 코드를 필터링하여 경로를 수정하지 못하게 한다.
내가 추가적으로 생각한 것이지만 만약가능하더라도 주요 php 파일 같은 경우 다른 하위 디렉토리에 저장해놓는다면 php를 파악하지 못하게하여 우회가 불가능하게 만들 수도 있을것 같다.



+ Recent posts