当前位置: 首页 > news >正文

【网络安全】SQL注入

        如果文章不足还请各位师傅批评指正!

        想象一下,你经营着一家咖啡店,顾客可以通过店内的点单系统下单。这个系统会根据顾客的输入,向后厨发送指令,比如“为顾客A准备一杯拿铁”。

        然而,如果有个不怀好意的顾客,在点单时输入了“给我一杯拿铁;再给所有顾客免费升级到特大杯”,那么后厨可能会按照这个指令执行,导致你的咖啡店损失惨重。

        在网络安全领域,这种类似的情况就是SQL注入。SQL注入是指攻击者在Web应用程序中输入恶意的SQL代码片段,这些代码片段会与原本的数据库查询语句合并执行,从而欺骗数据库执行非授权的操作。就好比在正常的订单系统中偷偷加入了一些额外的指令,让数据库按照攻击者想要的方式去执行。

一、什么是 SQL 注入

        SQL 注入是一种常见的网络攻击手段,它专门针对程序员在编写代码时的疏忽。

        你在网上注册了一个账号,填写用户名和密码后点击提交。正常情况下,网站会将你输入的信息发送到数据库进行验证,看看用户名是否存在,密码是否正确。但如果网站对用户输入的数据没有进行严格的检查,黑客就有机会在你输入的内容里添加一些特殊的 SQL 语句。比如,在用户名框里输入 “' or '1'='1”(别小看这串字符,它可是有大 “威力” 的),这时候网站传给数据库的查询语句就可能变成了 “SELECT * FROM users WHERE username = ' ' or '1'='1' AND password = ' 你输入的密码 '” 。由于 “1'='1” 这个条件永远成立,黑客就能绕过密码验证,轻松登录系统,获取他们不该得到的数据,这就是 SQL 注入的可怕之处!

二、SQL 注入的类型

(一)联合查询注入

        这种注入方式就像是黑客找到了网站数据显示的 “秘密通道”。

        当网站有明确的数据回显位置时,黑客就能利用它来获取各种信息。比如说,有一个学生信息查询网站,输入学生 ID 就能显示学生的姓名、年龄等信息。黑客发现这个网站存在注入漏洞后,就可以通过 “order by” 语句来判断数据库表的列数,假设发现有 3 列。接着,他们使用 “union select” 语句,构造出类似 “-1' union select 1,user (),database () --+” 这样的攻击语句(这里的 “-1” 是为了让原查询不返回数据,“user ()” 和 “database ()” 是 SQL 函数,分别用于获取数据库的使用者和当前数据库名),网站就会把数据库的使用者和数据库名显示出来,黑客就这样轻松获取到了敏感信息。

(二)报错注入

        有些网站比较 “粗心”,虽然没有给黑客提供数据回显的位置,但却没有屏蔽数据库的报错信息,这就给了黑客可乘之机。

        报错注入就是利用这一点,通过一些特殊的函数让数据库报错,然后从报错信息中获取数据。例如 “updatexml ()” 函数,黑客在访问网站时输入 “?id=1' and updatexml (1,concat (0x7e,(select user ()),0x7e),1) --+” ,数据库就会报错,而报错信息里会显示出当前数据库的使用者信息。就好像黑客故意在数据库里制造混乱,然后从混乱中找到他们想要的东西。

(三)布尔盲注

        布尔盲注就像是黑客在和网站玩猜谜游戏。

        当网站关闭了错误回显和数据回显,但页面会根据输入的对错发生变化时,黑客就可以用这种方法。比如一个登录页面,正常输入用户名和密码,页面会提示 “登录成功” 或 “用户名或密码错误” 。黑客通过构造 “and 1=1” 和 “and 1=2” 这样的语句,如果输入 “and 1=1” 时页面显示正常,输入 “and 1=2” 时页面有变化,就说明存在注入点。然后,他们利用 “substr ()”“ascii ()” 等函数,结合二分法来逐个猜解数据库里的数据。这就好比黑客每次问网站一个关于数据的 “小问题”,根据网站的回答来慢慢拼凑出完整的数据。

(四)时间盲注

        时间盲注是最 “狡猾” 的一种注入方式。

        当网站没有任何形式的回显,连错误信息都不显示时,黑客就会利用睡眠函数来判断注入是否成功。在 MySQL 里有个 “Benchmark ()” 函数可以用来测试性能,黑客会构造类似 “?id=1' and if (ascii (substr (user (),1,1))>1, sleep (5),0) --+” 的语句。如果页面加载时间明显变长了 5 秒,就说明这个语句被执行了,也就意味着存在注入点。这就好像黑客在网站上偷偷设置了一个 “定时器”,通过观察网站的反应时间来获取信息。

(五)堆叠注入

        堆叠注入在 MySQL 上不太常见,但在 Mssql 中比较多见。

        它就像是黑客找到了一条能直接进入数据库的 “捷径”,可以用分号分割来执行多个语句。比如,黑客输入 “root';DROP database user;”,服务器生成的 SQL 语句就会变成 “select * from user where name='root';DROP database user;” ,这样第一条语句查询数据,第二条语句就能把整个 user 数据库删除,危害极大。

三、注入点方式类型

(一)数字型注入

        这种注入发生在网站对数字类型的参数处理不当的时候。

        比如一个商品详情页面,URL 可能是 “xxx.com/product?id=1” ,这里的 “id” 就是数字型参数。如果网站没有对这个参数进行严格验证,黑客就可以尝试在 “id” 参数后添加特殊的 SQL 语句,如 “xxx.com/product?id=1; DROP TABLE products;”(当然,实际情况中可能需要根据数据库类型和网站架构进行调整),这样就有可能导致商品信息表被删除。

(二)字符型注入

        字符型注入通常出现在处理字符串参数的地方,比如登录页面的用户名和密码输入框。

        就像前面提到的万能密码 “' or '1'='1” ,就是利用了字符型注入的漏洞。黑客在输入框中输入特殊字符和 SQL 语句,让数据库的查询逻辑发生改变,从而达到非法访问的目的。

(三)搜索型注入

        搜索框也是黑客经常攻击的目标。

        当你在网站的搜索框里输入关键词时,如果网站没有对输入进行过滤,黑客就可以输入特殊的 SQL 语句。比如,在搜索框输入 “' or 1=1 --” ,原本的搜索语句可能就会变成 “SELECT * FROM articles WHERE title LIKE '%' or 1=1 -- %'” ,这样黑客就能获取到所有文章的信息,而不仅仅是符合搜索关键词的文章。

四、如何预防SQL注入攻击?

(一)输入验证

对用户输入的数据进行严格的验证和过滤,确保输入中不包含恶意的SQL代码。就像咖啡店要仔细检查顾客的订单,确保没有不合理的要求一样。

(二)使用预编译语句

预编译语句(如PreparedStatement)可以在执行前对SQL语句进行编译,将用户输入作为参数传递,这样用户输入就不会改变SQL语句的结构,从而有效防止SQL注入。

(三)限制数据库权限

为Web应用程序设置专用的数据库用户,并严格限制该用户的权限,使其只能执行必要的操作。这就像是给咖啡店的员工设置权限,让他们只能接触和操作自己职责范围内的事物,避免因权限过大而引发问题。

(四)隐藏错误信息

避免将详细的数据库错误信息直接显示在页面上,而是显示友好的错误提示。这样可以防止攻击者从错误信息中获取敏感信息,就像咖啡店的后厨出现问题时,不会直接把错误的订单细节展示给顾客,而是由店员出面友好地解释情况。

五、SQL相关靶场

        用心的小伙伴可以发现我在主页自己搭建sqllab搭建报错,问题应该出在数据库冲突,还没解决,总之新手伙伴们可以试下这个在线连接,网上也可以找到相关通关教程。

        在线靶场:https://sqli-labs.bachang.org/

        sql-libs是一个专门用于学习和测试SQL注入的开源平台,它提供了一系列的注入场景和关卡,帮助开发者和安全测试人员深入理解SQL注入的原理和防范方法。

        再次感谢!是小白是小白是小白,如果文章不足还请师傅批评指正。感谢~

http://www.xdnf.cn/news/399187.html

相关文章:

  • pdf 不是扫描件,但却无法搜索关键词【问题尝试解决未果记录】
  • 用短说社区搭建的沉浸式生活方式分享平台
  • Redis+Caffeine构建高性能二级缓存
  • Python邮件处理(使用imaplib和email库实现自动化邮件处理)
  • Kubernetes控制平面组件:Kubelet详解(一):API接口层介绍
  • 自主添加删除开机启动项
  • tinyint(3)数据类型讲解
  • stm32之BKP备份寄存器和RTC时钟
  • 基于Python的高效批量处理Splunk Session ID并写入MySQL的解决方案
  • Hadoop 的代理用户(Proxy User)​ 功能解释
  • 配置hosts
  • 推理加速新范式:火山引擎高性能分布式 KVCache (EIC)核心技术解读
  • 深入理解Embedding Models(嵌入模型):从原理到实战(下)
  • 【机器人】复现 UniGoal 具身导航 | 通用零样本目标导航 CVPR 2025
  • SpringBoot校园失物招领信息平台
  • Shell脚本编程3(函数+正则表达式)
  • [特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
  • Modbus协议介绍
  • springboot旅游小程序-计算机毕业设计源码76696
  • Unity ML-Agents实战指南:构建多技能游戏AI训练系统
  • 在Ubuntu系统下编译OpenCV 4.8源码
  • react-diff-viewer 如何实现语法高亮
  • 一小时学会Docker使用!
  • 树莓派4基于Debian GNU/Linux 12 (Bookworm)开启VNC,使用MobaXterm连接VNC出现黑屏/灰屏问题
  • 笔记本电脑升级实战手册【扩展篇1】:flash id查询硬盘颗粒
  • 十四、继承与组合(Inheritance Composition)
  • 【Linux网络编程】HTTPS协议原理
  • 杨校老师项目之基于SSM与JSP的鲜花销售系统-【成品设计含文档】
  • node版本.node版本、npm版本和pnpm版本对应
  • 深入理解目标检测中的关键指标及其计算方法