[ 환경 ]
DVWA | v1.9 |
Burp Suite | Community Edition v2024.11.2 |
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
$target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
( $uploaded_size < 100000 ) &&
( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
getimagesize( $uploaded_tmp ) ) {
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
imagedestroy( $img );
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
}
else {
echo '<pre>Your image was not uploaded.</pre>';
}
if( file_exists( $temp_file ) )
unlink( $temp_file );
}
이 코드는 여러 보안 기능을 통해 안전한 파일 업로드를 보장한다. 먼저, Anti-CSRF 토큰 검증을 통해 요청의 신뢰성을 확보하며, MD5 해시와 고유 ID를 사용하여 파일명을 무작위화해 이름 충돌과 파일 예측을 방지한다. 또한, 확장자, MIME 타입, 파일 크기, 그리고 getimagesize( )를 활용하여 업로드된 이미지의 유효성을 철저히 검증한다. 더불어, 이미지 재인코딩을 통해 악의적인 메타데이터가 포함되는 것을 방지하며, 임시 디렉토리를 활용하고 사용 후 이를 삭제하여 임시 파일을 효과적으로 관리한다.
finfo_file()로 실제 MIME 타입을 확인
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $uploaded_tmp);
finfo_close($finfo);
$allowed_mime_types = ['image/jpeg', 'image/png'];
if (!in_array($mime_type, $allowed_mime_types)) {
echo '<pre>Invalid file type!</pre>';
exit;
}
디렉토리 내 실행 파일 방지를 위해 .htaccess 추가 (Apache 기준)
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
PHP 설정으로 업로드 크기 제한
upload_max_filesize = 2M
post_max_size = 8M
DVWA : SQL Injection - Medium level (0) | 2025.01.06 |
---|---|
DVWA : SQL Injection - Low level (0) | 2025.01.05 |
DVWA : File Upload - High level (0) | 2025.01.05 |
DVWA : File Upload - Medium level (0) | 2025.01.05 |
DVWA : File Upload - Low level (0) | 2025.01.05 |