加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

浅谈PHP安全规范

发布时间:2018-10-15 10:42:58 所属栏目:评论 来源:littlepotato
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 一、前言 php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市

我们首先看到这个代码中使用的验证手段( 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

  1. <?php  
  2.  
  3. if( isset( $_POST[ 'Upload' ] ) ) {  
  4.     // Check Anti-CSRF token  
  5.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  
  6.  
  7.     // File information  
  8.     $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];  
  9.     $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);  
  10.     $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];  
  11.     $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];  
  12.     $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];  
  13.  
  14.     // Where are we going to be writing to?  
  15.     $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';  
  16.     //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';  
  17.     $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;  
  18.     $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );  
  19.     $temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;  
  20.  
  21.     // Is it an image?  
  22.     if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&  
  23.         ( $uploaded_size < 100000 ) &&  
  24.         ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&  
  25.         getimagesize( $uploaded_tmp ) ) {  
  26.  
  27.         // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)  
  28.         if( $uploaded_type == 'image/jpeg' ) {  
  29.             $img = imagecreatefromjpeg( $uploaded_tmp );  
  30.             imagejpeg( $img, $temp_file, 100);  
  31.         }  
  32.         else {  
  33.             $img = imagecreatefrompng( $uploaded_tmp );  
  34.             imagepng( $img, $temp_file, 9);  
  35.         }  
  36.         imagedestroy( $img );  
  37.  
  38.         // Can we move the file to the web root from the temp folder?  
  39.         if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {  
  40.             // Yes!  
  41.             echo "<pre><a href='file:///%24%7Btarget_path%7D%24%7Btarget_file%7D'>${target_file}</a> succesfully uploaded!</pre>";  
  42.         }  
  43.         else {  
  44.             // No  
  45.             echo '<pre>Your image was not uploaded.</pre>';  
  46.         }  
  47.  
  48.         // Delete any temp files  
  49.         if( file_exists( $temp_file ) )  
  50.             unlink( $temp_file );  
  51.     }  
  52.     else {  
  53.         // Invalid file  
  54.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';  
  55.     }  
  56. }  
  57.  
  58. // Generate Anti-CSRF token  
  59. generateSessionToken();  
  60.  
  61. ?> 

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读