我们首先看到这个代码中使用的验证手段( strtolower( $uploaded_ext ) == “jpg” || strtolower( $uploaded_ext ) == “jpeg” || strtolower( $uploaded_ext ) == “png” ) && ( $uploaded_size < 100000 ) && getimagesize( $uploaded_tmp )。
首先判断文件名结尾是不是’jpg’,'jepg’,'png’类型,然后调用getimagesize()函数获取图像大小,其实就是判断图像格式是否规范。
函数细节可以参看官网表述:http://php.net/manual/zh/function.getimagesize.php。 然后文件大小也进行了判断。所以这里主要存在两个限制条件,首先必须以特定文件名结尾,然后文件格式还得满足特定的图片格式。但是这样的代码虽然加大攻击难度,在一些条件成立的条件下,仍旧可以进行攻击,上传shell,首先图片格式可以伪造,在元数据中包含webshell,然后找到一个文件包含漏洞,就可以成功实现攻击,上传shell。
(4) Impossible level
- <?php
-
- if( isset( $_POST[ 'Upload' ] ) ) {
- // Check Anti-CSRF token
- checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
-
- // File information
- $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' ];
-
- // Where are we going to be writing to?
- $target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
- //$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
- $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;
-
- // Is it an image?
- 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 ) ) {
-
- // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
- 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 );
-
- // Can we move the file to the web root from the temp folder?
- if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
- // Yes!
- echo "<pre><a href='file:///%24%7Btarget_path%7D%24%7Btarget_file%7D'>${target_file}</a> succesfully uploaded!</pre>";
- }
- else {
- // No
- echo '<pre>Your image was not uploaded.</pre>';
- }
-
- // Delete any temp files
- if( file_exists( $temp_file ) )
- unlink( $temp_file );
- }
- else {
- // Invalid file
- echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
- }
- }
-
- // Generate Anti-CSRF token
- generateSessionToken();
-
- ?>
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|