【业务安全04】万能用户名及万能密码

1 实验介绍

1.1 实验目的

  1. 由于网页服务端对代码的过滤不够严谨,可能会存在万能用户名或万能密码绕过的风险。
  2. 加深对网页代码和SQL代码的理解。

1.2 实验环境

  1. 实验靶场——虚拟机:本节实验靶场是在win2008系统上基于phpstudy搭建的一个简单网站,win2008及phpstudy的安装过程可以参考《win2008R2SP1+WAMP环境部署》,网站的搭建过程可以参考《综合实验:一个简单丑陋的论坛网站》。
  2. 本实验在该论坛的登录页面进行实验。
    在这里插入图片描述
  3. 该网站对登录账号密码的验证代码如下所示。
<meta charset = "utf-8">
<?php
include "../inc/dblink.inc.php";
?>
<?php
if (isset($_POST['userSubmit'])){
	//var_dump($_POST);
	$sql = "select * from users where name = '".$_POST['userName']."' and password ='".md5($_POST['userPass'])."'";
    //echo $sql;
	if ($results = mysqli_query($link,$sql)){
		if (mysqli_num_rows($results) > 0){
			setcookie ('name',$_POST['userName'],time()+3600,"/");
			echo "登录成功,请返回<a href = '../index.php'>首页</a>或<a href = './index.php'>个人中心</a>";
		}else{
			echo "账号或密码错误,请<a href = './login.php'>重新输入</a>";
		}
	}else{
		die(mysqli_error($link));
	}
}else{
    echo "请输入账号密码";
}
?>
<html>
<form method = "post" target = "_blank">
用户名:<input type = "text" name = "userName"><br>
密码:<input type = "password" name = "userPass"><br>
<input type="submit" name="userSubmit" value="登录">
</form>
</html>
<?php
mysqli_close($link);
?>

2 实验

2.1 实验分析

  1. 上述代码第8行用于在数据库中检验客户端输入账号密码是否存在,而能否登录成功关键在于第10行 if 语句判断条件是否为真,也就是说只要构造的用户名或密码能让SQL语句能成功查询并返回结果,就能实现登录。
  2. 由于SQL语句采用的是单引号闭合的方式,因此所构造的语句需要注意屏蔽前后的单引号,采用不同用户名及密码的组合进行实验结果如下。
用户名密码结果分析
aaa’ or 1=1#随意成功采用单引号屏蔽变量前的单引号,采用#注释掉变量后续语句
aaa’ or ‘1’='1随意失败因为and的优先级比or的优先级高,
语句先执行'1'='1' and password = '随意'语句得到false,
再执行name = 'aaa' or false,结果还是false,
所以SQL语句无法查询到内容,登录失败.
a’ or ‘1’='1随意成功与上一组合不同的是,此处a是刚好碰到数据库中有该用户名,
所以or语句执行成功,适合用于爆破特定用户名
随意aaa’ or 1=1#失败由于密码字段在代码中被MD5编码过,无法实现语句构造的功能
随意aaa’ or ‘1’=‘1’失败同上
  1. 当后台代码对输入参数进行过滤转换时,需要注意思考之前学过的各种绕过技巧。

2.2 实验过程

  1. 在登录界面输入用户名aaa' or 1=1#,密码随意,如下,点击登录。
    在这里插入图片描述
  2. 可以看到成功登录。
    在这里插入图片描述
  3. 点击个人中心,可以看到目前登录的账户是数据库中注册的第一个账号。
    在这里插入图片描述

3 总结

  1. 加深理解SQL语句构造与绕过;
  2. 掌握万能用户名与密码检测的方法。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 SQL Server 中,用户的用户名和密码是存储在系统表中的。可以使用以下 SQL 查询查看已定义的 SQL Server 登录名和密码: ``` SELECT name, password_hash FROM sys.sql_logins WHERE type_desc = 'SQL_LOGIN'; ``` 请注意,此查询仅适用于 SQL Server 登录名,而不适用于 Windows 身份验证。如果想查看 Windows 身份验证的用户名和密码,需要查看操作系统的用户和组。 ### 回答2: 在SQL Server中,我们可以通过以下几种方法来查看用户名和密码: 1. 使用系统存储过程:系统存储过程`sp_help_revlogin`可以显示所有登录名及其对应的密码哈希值。执行以下命令可以获得该存储过程的文本定义: ```sql sp_helptext 'sp_help_revlogin' ``` 然后执行该存储过程即可查看用户名和密码哈希值。 2. 查询系统表:我们可以查询系统表`sys.syslogins`来获取用户名和密码。以下是示例查询语句: ```sql SELECT name, password FROM sys.syslogins ``` 该查询将返回所有登录名和对应的密码哈希值。 需要注意的是,尽管可以查看密码的哈希值,但出于安全考虑,SQL Server不存储明文密码。因此,无法直接从数据库中获取明文密码。密码哈希值是通过加密算法对密码进行转换得到的,以增加安全性。 请注意,在查询用户密码时,务必确保权限和安全性。只有具有足够权限的用户才能执行上述的查询操作。为了保护用户密码的安全性,我们应该使用适当的加密手段来存储和管理用户密码。 ### 回答3: 在SQL Server中,我们可以通过以下方法查看用户名和密码。 1. 使用系统存储过程:在SQL Server中,有一个存储过程可以用来查看登录用户的用户名和密码。这个存储过程是sys.sp_help_revlogin。你可以执行以下命令来查看用户名和密码: EXEC sp_help_revlogin; 这个存储过程将返回一个结果集,包含所有登录用户的用户名、密码以及密码的哈希值。 2. 使用系统视图:SQL Server中有一个系统视图sys.sql_logins,可以用来查看所有登录用户的信息,包括用户名和密码。你可以执行以下查询语句来查看用户名和密码: SELECT name, password_hash FROM sys.sql_logins; 这个查询将返回一个结果集,包含所有登录用户的用户名和密码的哈希值。 需要注意的是,因为密码通常会进行哈希处理后存储在数据库中,所以无法直接查看明文密码。上述方法只能查看密码的哈希值。如果需要重置密码或者修改用户的密码,可以使用ALTER LOGIN语句来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值