SQL注入简介及原理

本文介绍了SQL注入的概念,它是一种严重的WEB安全漏洞。通过PHP代码示例展示了如何利用用户输入参数构造恶意SQL语句,影响数据库查询,从而揭示了SQL注入的工作原理。文章还讨论了如何通过测试错误条件(如`and1=1`和`and1=2`)来探测注入点,并提供了实践建议,帮助读者理解和检测SQL注入漏洞。
摘要由CSDN通过智能技术生成

前言

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

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

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

已同步更新至个人博客:https://www.hibugs.net/security/vulnerability/sql-insert/lamar/sql-insert-intro/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入原理是攻击者在用户提交数据时,将恶意的SQL语句注入到应用程序中,从而导致应用程序对数据库的非法操作。攻击者可以通过SQL注入攻击获取数据库中的敏感信息、修改、删除或添加数据等。 防范SQL注入攻击的原理包括以下几点: 1. 数据过滤:在客户端或服务端对输入数据进行过滤,过滤掉特殊字符和SQL关键字,避免攻击者通过输入恶意数据来注入SQL语句。 2. 预编译语句:使用预编译语句可以防止SQL注入攻击。预编译语句是在执行SQL语句之前将SQL语句和参数分离,对参数进行验证和过滤,然后将参数传递给SQL语句执行,从而避免SQL注入攻击。 3. 参数化查询:使用参数化查询可以有效地防止SQL注入攻击。参数化查询是将SQL语句和参数分离,将参数作为占位符传递给SQL语句,然后将参数绑定到占位符上执行SQL语句。 4. 最小化权限:限制数据库用户的权限可以减少SQL注入攻击的影响。将数据库用户的权限最小化,只赋予其必要的权限,可以限制攻击者对数据库的访问。 5. 安全编码:编写安全的代码可以有效地防止SQL注入攻击。编写安全的代码包括正确的输入验证、错误处理、日志记录等。 总之,防范SQL注入攻击的原理是通过数据过滤、预编译语句、参数化查询、最小化权限和安全编码等方式,避免攻击者将恶意的SQL语句注入到应用程序中,从而保护数据库的安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值