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注入和其原理!

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

292人评论了“SQL注入简介及原理”

发表评论

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

Scroll to Top