前言
SQL注入是一个非常复杂的漏洞,并且它也是WEB安全中严重的安全漏洞。因此我们普遍将SQL注入作为第一个学习的漏洞——学会利用、挖掘以及修复。
ps:由于SQL注入比较复杂,会导致笔记篇幅过长,所以我会将其分为多篇文章进行发布。这样不容易打击大家的学习积极性 😃
SQL简介
危害
-
数据库信息泄露
-
网页篡改
-
网站被挂马
-
数据库被恶意操作
-
让别人拿到webshell
-
随意添加系统用户
-
…
原理
- 网站的动态数据需要联动MySQL
-
需要接收参数根据不同的参数返回不同的数据
-
这里由于需要接收前台参数(用户输入的参数),返回给后台,后台再进行处理,所以导致,我们有机会可以将恶意的SQL语句通过传参的方式传递给后台,进行一些敏感信息的查询
-
利用简易php代码,搭建并演示SQL注入原理
php代码
<?php
# 参数
$serverName = 'localhost';
$username = 'root';
$password = 'root';
$databaseName = 'learn';
# 建立连接并登录
$conn = new mysqli($serverName,$username,$password,$databaseName);
if($conn->connect_error)
die('连接失败:'.$conn->connect_error);
# 发送请求
$id = $_GET['id'];
$sql = "select * from web_info where id=$id";
if($datas=$conn->query($sql)){
if($datas->num_rows){
while($data_row = $datas->fetch_assoc())
echo 'id:'.$data_row['title'].'<br/>content:'.$data_row['content'];
}
}
# 关闭连接
$conn->close();
?>
我们主要看第14行$sql变量
- 这里我们使用$id去接收用户传进来的值,根据用户需要的不同的id值,来返回不同的数据
- 当id输入1时,返回的是id为1的数据
- ?id=1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SrAd4pYy-1678706747346)(null)]
- 返回id为1的数据
- 当id输入为2时,返回的是id为2的数据
- ?id=2
- 我们分析id为1和2时的SQL语句
- id=1:
select * from web_info where id = 1;
- id=2:
select * from web_info where id = 2;
- id=1:
- 但如果这个时候我们将$sql替换
$sql = "select * from web_info where id=1"
- 这时候id固定死了值为1,不管我们从前端传入什么id值,都不会改变$sql语句中的id值
- 这个时候我们id再次分别输入
?id=1
?id=2
这时候我们发现不管我们前端传入id值为1还是2,返回的数据都是id为1的数据
- 正是因为我们将$sql中SQL语句中的id值固定死为1,而不是根据前端传入的数据的改变而改变
这说明存在注入点(存在SQL漏洞)的前提是,你传递的参数在后台有被接收并且使用
- 正如上面最开始的那样,$sql中的SQL语句中的id是通过接收前端传入的id,再带入数据库中查询
- 换句话来说就是会根据传递的参数不同,代入查询的语句也不同
所以如果说你传入的数据后台都不鸟你或者过滤掉了,那么就根本不能传入恶意SQL语句,并执行,也就不存在SQL注入的漏洞
为什么使用and 1=1 和 and 1=2 去探测是否存在注入点(网站是否存在SQL漏洞)?
首先我们从上面简易代码的演示中,可以得知。只有当你从前端传入的数据会被传递到后台,并且被使用带入查询才可能存在注入漏洞。既然是这样我们就需要知道从前端的数据是否会被用作数据库查询。
能够最直白反应我们传入的数据是否有被带入数据库查询的方法,就是传入错误的数据让他出错,查看页面会不会出错。
与逻辑
说到这里我们就不得不来说一说与逻辑了。
首先and它是属于与逻辑,与逻辑的规则就是:
- 真 and 真 = 真
- 真 and 假 = 假
- 假 and 假 = 假
综上,可以看出。与逻辑就是and左右必须都为真才会是正确,而当and任意一边出现错误时,整个结果都为错。
所以当我们传入?id=1 and 1=1
时SQL语句为:select * from web_info where id = 1 and 1=1;
,此时,and左边id=1为真,and右边1=1也为真,显示为正确。
当我们传入?id=1 and 1=2
时SQL语句为:select * from web_info where id = 1 and 1=2;
,此时,and左边id=1为真,and右边1=2为假,这时候就会出现错误。
当我们传入会导致带入数据库查询产生错误的参数时,会导致数据库查询出错,也会导致页面返回错误,由此我们就可以判断出该网站存在SQL注入漏洞。
实践
继续使用刚才使用简易php代码搭建的存在SQL注入的网页,进行上述讲解的实践。
我们首先传入?id=1 and 1=1
我们发现页面是正常显示
但当我们传入?id=1 and 1=2时
页面回显错误。
由此我们可以得出结论,检测该网站是否存在注入漏洞,本质上就是找到可以传入数据并让其带入数据查询的地方,传入错误的参数让其出错,通过是否正常返回判断SQL注入漏洞是否存在。
举一反三
并且我们也可以举一反三得出,并不是只可以使用and 1=2才能检测是否存在注入漏洞,只要是最终带入查询会出现错误即可。比如我们可以写?id=1eagnaigsog,随便乱写一通都是可以。只要能够引起查询出错都是可以。
建议多去尝试,不要因为一种方法发现没有就放弃。
结束语
到此你已经简单的了解了SQL注入和其原理!
希望我的文章能够帮助到你 😃
已同步更新至个人博客:https://www.hibugs.net/security/vulnerability/sql-insert/lamar/sql-insert-intro/