DVWA之SQL Injection/SQL Injection(Blind)

SQL Injection SQL语句基本知识
由于常见的注入类型为数字型和字符型(根据查询的字段值有无引号决定的)
可通过a’ or 1 = 1#或者a or 1 = 1#(a表示正确输入的值,#为注释)来判断注入类型。
若为数字型sql注入,前者报错或查询不到数据、后者可能查询到所有结果
若为字符型sql注入,前者可能查询到所有结果、后者报错或查询不到数据
将两句payload带入构造的sql查询语句(以本实验为例,a用1代替)

数字型:
select first_name,last_name from users where user_id = 1’ or 1 = 1#
#由于是数字型。‘user_id’的值没有用’‘包围,所以"1’"不能识别为int型
select first_name,last_name from users where user_id = 1 or 1 = 1#
#where语句恒为真(or后面的子句恒为真),所以查询的结果为所有数据

字符型:
select first_name,last_name from users where user_id = ‘1’ or 1 = 1#’
#由于是字符型。‘user_id’的值用’‘包围,且在sql语句中’#'为注释功能。故where子句中条件恒为真
select first_name,last_name from users where user_id = ‘1 or 1 = 1#’
#由于字符型查询右引号缺失,导致报错或查询不到数据

Low 代码分析

<?php

if( isset( $_GET[ 'Login' ] ) ) {
    // Get username
    $user = $_GET[ 'username' ];

    // Get password
    $pass = $_GET[ 'password' ];
    $pass = md5( $pass );

    // Check the database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $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>' );

    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // Get users details
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["avatar"];

        // Login successful
        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
    else {
        // Login failed
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }

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

?>

代码解析&自我理解:
isset()函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false

query变量为直接构造的sql查询语句,没有对用户的输入进行任何的过滤,导致sql注入的存在。

result通过mysqli_query()函数获取数据库查询的结果集。die()函数表示连接数据库失败退出当前脚本。$GLOBALS["___mysqli_ston"]表示数据库的连接语句

mysqli_fetch_assoc($result)从结果集中取出一行作为关联数组,即列名和值对应的键值对。

dvwa1.9中使用的是mysql_numrows()函数返回集行数给num(只对select语句有效)

最后通过while判断若有查询结果且循环执行$row = mysqli_fetch_assoc( $result ),将结果集中每行结果对应的字段值赋值给相应的字段,并遍历输出。
参考地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值