登录方面代码简易分析及可能产生的问题
登录主要产生的问题无非就是三大类:
- SQL注入(万能密码)
- Cookie伪造
- Session劫持
一.SQL注入
造成SQL注入的主要原因基本上都是过滤不严,造成可以进行sql语句的拼接.
<meta charset="UTF-8">
<form action="" method="post">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="提交">
</form>
<?php
include ('..\..\config.php');
$username=$_POST['username'];
$password=md5($_POST['password']);
$sql="select * from sy_adminuser where username='$username' and password='$password'";
//此处还可能触发SQL注入等系列相关
echo $sql."<br>";
$res = mysqli_query($con,$sql);
if(mysqli_fetch_row($res)){
echo "登录成功";
header("Location:/index.php");
setcookie("usr",$username);
}else{
echo "登录失败";
}
?>
**此处便可在输入框中进行SQL拼接,假设输入的内容为如下,则拼接后逻辑判断都为真,因此便能骗过机制进而进入后台。 **
' or 1=1;#
拼接后:
$sql="select * from sy_adminuser where username='' or 1=1;#and password='$password'";
二.Cookie伪造
个人理解的Cookie无非就是一种存储于客户端一种登录凭证,不同身份的人自然凭证也不同,就像身份牌一样。而Cookie伪造便是去通过伪造Cookie进而骗过服务器的验证。
某CMS登录界面
<?php
ob_start();
require '../inc/conn.php';
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox'];
if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$users = mysql_fetch_array($result);
if (!mysql_num_rows($result)) {
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}else{
$passwords=$users['password'];
if(md5($password)<>$passwords){
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}
//写入登录信息并记住30天
if ($checkbox==1){
setcookie('user',$user,time()+3600*24*30,'/');
}else{
setcookie('user',$user,0,'/');
}
echo "<script>this.location='?r=index'</script>";
exit;
}
exit;
ob_end_flush();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<!-- Title and other stuffs -->
<title>登录 - 熊海CMS后台管理系统</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="">
<!-- Stylesheets -->
<link href="style/bootstrap.css" rel="stylesheet">
<link rel="stylesheet" href="style/font-awesome.css">
<link href="style/style.css" rel="stylesheet">
<link href="style/bootstrap-responsive.css" rel="stylesheet">
<!-- HTML5 Support for IE -->
<!--[if lt IE 9]>
<script src="js/html5shim.js"></script>
<![endif]-->
<!-- Favicon -->
<link rel="shortcut icon" href="../images/favicon.ico">
</head>
<body>
<!-- Form area -->
<div class="admin-form">
<div class="container">
<div class="row">
<div class="col-md-12">
<!-- Widget starts -->
<div class="widget worange">
<!-- Widget head -->
<div class="widget-head">
<i class="icon-lock"></i> 管理登录
</div>
<div class="widget-content">
<div class="padd">
<!-- Login form -->
<form method="post" class="form-horizontal" action="">
<!-- Email -->
<div class="form-group">
<label class="control-label col-lg-3" for="inputEmail">帐号</label>
<div class="col-lg-9">
<input type="text" name="user" class="form-control" id="inputEmail" placeholder="user">
</div>
</div>
<!-- Password -->
<div class="form-group">
<label class="control-label col-lg-3" for="inputPassword">密码</label>
<div class="col-lg-9">
<input type="password" name="password" class="form-control" id="inputPassword" placeholder="Password">
</div>
</div>
<!-- Remember me checkbox and sign in button -->
<div class="form-group">
<div class="col-lg-9 col-lg-offset-3">
<div class="checkbox">
<label>
<input type="checkbox" name="checkbox" value="1"> 记住一个月
</label>
</div>
</div>
</div>
<div class="col-lg-9 col-lg-offset-2">
<button type="submit" class="btn btn-danger" name="login" value="yes">登录</button>
<button type="reset" class="btn btn-default">重置</button>
</div>
<br />
</form>
</div>
</div>
<div class="widget-foot">
不是管理员? <a href="/">返回首页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- JS -->
<script src="js/jquery.js"></script>
<script src="js/bootstrap.js"></script>
</body>
</html>
其后台验证:
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
从中可以看出其后台验证相对比较鸡肋,只判断了Cookie中的user字段是否为空,若不为空便让其登录后台。因此这里可以采取Cookie伪造(即让user为任意值),进而触发一个未授权登录漏洞。
三.Session
Session机制是另一种验证机制,其与Cookie不同的是其是存储于服务端。也就是说每次需要客户端和服务端相对应才能验证成功,且不可进行修改伪造。而每次又会参生唯一字段SessionID。Session的周期便是每次会话启动开始到结束(即浏览器的访问url开始到关闭)。
登录界面
<form action="" method="POST">
帐号:<input type="text" name="user">
密码:<input type="password" name="pass">
<input type="submit" value="提交">
</form>
<?php
header("Content-Type:text/html;charset=utf-8");
include('..\..\config.php');
$username=$_POST['user'];
$password=md5($_POST['pass']);
$captcha=$_POST['captcha'];
//echo $password;
$sql="select * from sy_adminuser where username='$username' and password='$password'";
echo $sql;
$result=mysqli_query($con,$sql);
while($row=mysqli_fetch_row($result)){
session_start(); //启动Session
$_SESSION['username'] = $row[1];
//echo $_SESSION['username'];
header('Location: index.php');
}
?>
后台验证:
<?php
/**
2022年1月13日16:10:56
* 功能:Session验证
* 登录验证时的Session的验证是存储在服务端的一种验证,且存活的周期为客户端与服务端之间
* 建立连接到,浏览器关闭,且每次都是动态的。因此大多采用的策略便是会话劫持操作。
**/
header("Content-Type:text/html;charset=utf-8");
session_start();
$username = $_SESSION['username'];
if ($username == 'admin'){
echo "进入管理员界面!";
}else{
echo "进入非管理员界面!";
}
?>
为什么会出现Cookie和Session机制?
因为服务器需要对登录的人的身份进行一个验证,再对不同权限的人执行不同的操作。
还有其他登录时可能产生的问题?
有验证码也不是绝对安全的,还可能因程序员验证码周期处理不当进而导致验证码复用问题,且验证码也能通过Python中OCR技术或是云打码平台进行识别。
**才疏学浅,如有谬误,不吝赐教,谢谢!**
|