loader image

SQL注入简介及原理

前言

SQL注入是一个非常复杂的漏洞,并且它也是WEB安全中严重的安全漏洞。因此我们普遍将SQL注入作为第一个学习的漏洞——学会利用、挖掘以及修复。

ps:由于SQL注入比较复杂,会导致笔记篇幅过长,所以我会将其分为多篇文章进行发布。这样不容易打击大家的学习积极性 🙂

image-20230313191227645

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

image-20230313180330212

  • 返回id为1的数据
  • 当id输入为2时,返回的是id为2的数据
    • ?id=2

image-20230313180439002

  • 我们分析id为1和2时的SQL语句
    • id=1:select * from web_info where id = 1;
    • id=2:select * from web_info where id = 2;
  • 但如果这个时候我们将$sql替换
    • $sql = "select * from web_info where id=1"
    • 这时候id固定死了值为1,不管我们从前端传入什么id值,都不会改变$sql语句中的id值
  • 这个时候我们id再次分别输入

?id=1

image-20230313180558190

?id=2

image-20230313180607852

这时候我们发现不管我们前端传入id值为1还是2,返回的数据都是id为1的数据

  • 正是因为我们将$sql中SQL语句中的id值固定死为1,而不是根据前端传入的数据的改变而改变

这说明存在注入点(存在SQL漏洞)的前提是,你传递的参数在后台有被接收并且使用

  • 正如上面最开始的那样,$sql中的SQL语句中的id是通过接收前端传入的id,再带入数据库中查询
  • 换句话来说就是会根据传递的参数不同,代入查询的语句也不同

所以如果说你传入的数据后台都不鸟你或者过滤掉了,那么就根本不能传入恶意SQL语句,并执行,也就不存在SQL注入的漏洞

为什么使用and 1=1 和 and 1=2 去探测是否存在注入点(网站是否存在SQL漏洞)?

首先我们从上面简易代码的演示中,可以得知。只有当你从前端传入的数据会被传递到后台,并且被使用带入查询才可能存在注入漏洞。既然是这样我们就需要知道从前端的数据是否会被用作数据库查询。

能够最直白反应我们传入的数据是否有被带入数据库查询的方法,就是传入错误的数据让他出错,查看页面会不会出错。

与逻辑

说到这里我们就不得不来说一说与逻辑了。

首先and它是属于与逻辑,与逻辑的规则就是:

  1. 真 and 真 = 真
  2. 真 and 假 = 假
  3. 假 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

image-20230313183033827

我们发现页面是正常显示

但当我们传入?id=1 and 1=2时

image-20230313183144821

页面回显错误。

由此我们可以得出结论,检测该网站是否存在注入漏洞,本质上就是找到可以传入数据并让其带入数据查询的地方,传入错误的参数让其出错,通过是否正常返回判断SQL注入漏洞是否存在。

举一反三

并且我们也可以举一反三得出,并不是只可以使用and 1=2才能检测是否存在注入漏洞,只要是最终带入查询会出现错误即可。比如我们可以写?id=1eagnaigsog,随便乱写一通都是可以。只要能够引起查询出错都是可以。

建议多去尝试,不要因为一种方法发现没有就放弃。

结束语

到此你已经简单的了解了SQL注入和其原理!

希望我的文章能够帮助到你 🙂

1,325人评论了“SQL注入简介及原理”

  1. Hello! Someone in my Facebook group shared this website with us so I came to give it a look. I’m definitely enjoying the information. I’m bookmarking and will be tweeting this to my followers! Excellent blog and excellent design.

  2. Greetings! I know this is kinda off topic but I was wondering which blog platform are you using for this website? I’m getting sick and tired of WordPress because I’ve had problems with hackers and I’m looking at alternatives for another platform. I would be great if you could point me in the direction of a good platform.

  3. Nice read, I just passed this onto a friend who was doing a little research on that. And he just bought me lunch because I found it for him smile Thus let me rephrase that: Thank you for lunch! “Bill Dickey is learning me his experience.” by Lawrence Peter Berra.

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to Top