【2025版】不得不知的20个SQL注入知识点!从零基础到精通,收藏这篇就够了!

SQL注入是一种常见的Web安全漏洞,主要是由于web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接执行构造的SQL语句。本文将详细探讨SQL注入的原理、危害、分类、防御措施及挖掘方法,并提供一些手工SQL注入的技巧。

一、SQL注入简介

SQL是一种关系型数据库查询的标准编程语言,用于存取数据以及查询、更新、删除和管理关系型数据库。SQL注入则是借助网站上不健全的SQL拼接语句,将攻击者自己的恶意代码拼接到原有的SQL语句中,使其在服务器上执行,从而使攻击者可以对数据库进行网站运营者预料之外的增、删、改、查操作。

二、SQL注入的原理

造成SQL注入的原因主要是由于应用程序在构造SQL查询语句时未正确过滤或转义用户输入的数据,或未使用预编译等方法,造成了攻击者构造的恶意语句被应用程序执行。简单来说,就是用户输入的数据被直接用于构建查询,而不是作为纯粹的数据处理。

例如,以下是一个存在SQL注入风险的代码示例:

String query = "SELECT * FROM products WHERE category = '" + input + "'";   Statement statement = connection.createStatement();   ResultSet resultSet = statement.executeQuery(query);

在上述代码中,用户的输入input被直接拼接到SQL查询语句中。如果攻击者输入' OR '1'='1,则最终的SQL语句可能变为:

SELECT * FROM products WHERE category = '' OR '1'='1'

这将导致查询返回所有products表中的记录,因为'1'='1'始终为真。

三、SQL注入的危害

SQL注入的危害极大,攻击者可以利用这一漏洞对数据库进行各种恶意操作,包括但不限于:

    1. 脱库:查询隐藏数据。企业对于用户数据并不会直接删除,而是通过delete等字段去控制其是否可见。攻击者可以利用SQL注入查询这些隐藏数据。
    1. 新增管理账户:在数据库中新增具有管理员权限的账户,从而完全控制整个系统。
    1. 获取服务器权限:在极端条件下,攻击者甚至可以通过SQL注入获取服务器权限,执行任意命令。
    1. 网页篡改:通过操作数据库对特定网页进行篡改。
    1. 挂马攻击:修改数据库一些字段的值,嵌入恶意软件链接。
    1. 数据破坏:恶意删除或修改数据库中的数据,导致数据丢失或损坏。
四、SQL注入的分类

SQL注入根据不同的标准可以有多种分类方式,以下是一些常见的分类:

    1. 基于攻击原理的分类
  • 报错注入:页面会返回报错信息,或者把SQL语句直接返回在页面中。攻击者可以利用这些报错信息分析SQL语句结构,完成恶意代码的闭合。

  • 联合注入:可以执行UNION SELECT语句,通过联合查询获取其他表中的数据。

  • 延时注入:又叫时间型盲注,通过执行如sleep(5)之类的函数,使存在漏洞的响应明显慢于正常响应。攻击者可以根据响应时间的差异判断注入是否成功。

  • 布尔盲注:不会直接返回查询结果,而是通过应用程序的响应或行为差异来推断查询结果的真假。例如,通过输入id=1 OR 1=1id=1 OR 1=2比较响应差异。

    1. 基于数据类型的分类
  • 数字型注入:当输入的参数为整数时,如果存在注入漏洞,可以认为是数字型注入。数字型注入不需要引号来闭合。

  • 字符型注入:当输入的参数被当做字符串处理时,称为字符型注入。字符型注入通常需要通过引号来闭合。

    1. 基于提交方式的分类
  • GET型注入:通过URL的查询字符串传递恶意参数。

  • POST型注入:通过HTTP的POST请求体传递恶意参数。

  • HTTP头注入:通过HTTP请求头部字段如Cookie值传递恶意参数。

五、SQL注入的防范

解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查,并对数据库配置使用最小权限原则。以下是一些常见的防范措施:

    1. 使用参数化查询或预编译语句

参数化查询是将用户提供的输入作为参数传递给SQL语句,而不是将输入直接拼接到查询语句中。这样可以防止攻击者注入恶意的SQL代码。例如,使用java.sql中的PreparedStatement接口:

PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");   statement.setString(1, input);   ResultSet resultSet = statement.executeQuery();

在上述代码中,用户输入的数据input被作为参数传递给SQL语句,而不是直接拼接到查询语句中。数据库驱动会负责将提供给占位符的参数值转义,确保这些值不会被当做SQL代码执行。

    1. 输入验证和过滤

对所有用户输入的数据进行严格的验证和过滤,确保只有合法和预期的数据才能通过。可以使用白名单过滤或正则表达式验证来限制输入的格式和范围。

    1. 最小化特权

确保应用程序连接数据库时使用的数据库账户具有最小的权限,只能执行必要的操作,并限制对敏感数据的访问。这样可以减少攻击者利用SQL注入漏洞造成的危害。

    1. 使用ORM框架

对象关系映射(ORM)框架可以自动处理查询和参数绑定,减少手动拼接SQL语句的机会,并提供一定程度的安全性。例如,使用Hibernate、MyBatis等ORM框架可以自动处理SQL注入问题。

    1. 避免动态拼接SQL语句

尽量避免在应用程序中动态拼接SQL语句,特别是将用户输入直接拼接到查询语句中。如果必须动态拼接SQL语句,应确保对用户输入进行严格的转义和过滤。

    1. 错误处理和日志记录

正确处理数据库错误,避免将敏感错误信息暴露给攻击者。同时,定期审查和记录应用程序的日志,以便及时发现并响应潜在的注入攻击。

    1. 使用WAF设备

通过WAF设备启用防SQL注入策略,可以进一步增强对SQL注入攻击的防御能力。WAF设备可以监控和过滤HTTP请求,识别和阻止恶意的SQL注入攻击。

六、如何挖掘SQL注入漏洞

挖掘SQL注入漏洞需要一定的技巧和经验。以下是一些常用的挖掘方法:

    1. 单双引号测试

在测试初期,可以尝试在参数值中添加单引号或双引号,查看页面是否报错。如果页面报错并显示SQL语法错误等信息,说明可能存在SQL注入漏洞。

    1. 算术运算测试

在参数值中进行算术运算测试,如将id=2修改为id=1+1,查看返回的数据与之前是否一致。如果一致,说明可能存在SQL注入漏洞。

    1. 布尔条件测试

通过输入布尔条件如OR 1=1OR 1=2,比较两个响应是否有差异。如果存在注入点,前者返回的数据通常会比后者多。

    1. 时间延迟测试

通过执行如sleep(5)之类的函数,查看携带恶意参数的请求响应时间是否比正常请求慢5秒。如果存在注入点,说明攻击者可以利用时间延迟测试判断注入是否成功。

    1. 带外测试

带外测试是指通过其他渠道(如DNS查询、HTTP请求等)接收来自目标系统的响应数据。攻击者可以构造恶意的SQL语句将敏感数据发送到带外平台(如攻击者控制的域名或服务器),然后查看带外平台是否收到了对应的数据。

七、手工SQL注入技巧

一些常见且有效的手工SQL注入技巧:

    1. 识别注入点
  • • 观察页面是否存在传值或查询的地方,如URL中的GET型传参、搜索框、HTTP请求头部字段等。

  • • 通过单引号、双引号、算术运算、布尔条件等测试方法判断是否存在注入点。

    1. 确定数据库类型
  • • 通过报错信息中的关键词(如MySQL的You have an error in your SQL syntax、Oracle的ORA-xxxx等)确定数据库类型。

  • • 使用数据库特有的函数或语句进行探测,如MySQL的version()函数、Oracle的dbms_xdb.getFtpPort函数等。

    1. 获取数据库信息
  • • 使用UNION SELECT语句联合查询其他表中的数据。注意要匹配联合查询的列数和数据类型。

  • • 使用数据库特有的系统表或视图查询数据库信息,如MySQL的information_schema数据库、Oracle的all_tables视图等。

    1. 暴破用户名和密码
  • • 通过布尔盲注或时间延迟注入暴破用户名和密码。可以使用字典攻击或暴力破解工具进行尝试。

  • • 注意要合理设置尝试次数和间隔时间,避免触发目标系统的防御机制。

    1. 绕过WAF设备
  • • WAF设备通常会对常见的SQL注入攻击模式进行监控和防御。为了绕过WAF设备,攻击者可能会采用一些技巧,如:

  • 使用大小写混合:将SQL关键字的大小写混合使用,如SeLeCtUnIoN等,以绕过WAF设备对关键字的敏感检测。

  • 编码转换:对恶意SQL语句进行URL编码、Unicode编码或Base64编码等转换,以绕过WAF设备的过滤规则。

  • 特殊字符替换:使用WAF设备可能无法识别的特殊字符或等价替换,如将空格替换为%00%20+/**/等。

  • 拆分注入:将恶意的SQL语句拆分成多个部分,分别在不同的请求中发送,以绕过WAF设备的单次请求检测限制。

  • 利用HTTP请求特性:通过修改HTTP请求的方法、头部字段或请求体等,构造特殊的请求以绕过WAF设备的检测。

    1. 绕过输入验证
  • • 输入验证是防止SQL注入的重要措施之一。攻击者可能会尝试绕过这些验证机制,如:

  • 绕过长度限制:通过截断、拼接或编码等方式绕过输入长度的限制。

  • 绕过格式限制:通过修改输入数据的格式或类型,绕过对输入格式的验证。

  • 利用逻辑漏洞:分析输入验证的逻辑漏洞,如绕过前端验证直接发送恶意请求到后端。

    1. 利用数据库特性
  • • 不同的数据库系统具有不同的特性和漏洞,攻击者可以利用这些特性进行SQL注入攻击。如:

  • MySQL的information_schema:利用information_schema数据库查询MySQL服务器的元数据,获取表名、列名等信息。

  • Oracle的dbms_sql:利用Oracle的dbms_sql包动态执行SQL语句,绕过常规的输入验证和过滤机制。

  • SQL Server的xp_cmdshell扩展存储过程:在SQL Server中,利用xp_cmdshell执行操作系统命令,获取服务器权限。

    1. 隐藏攻击痕迹
  • • 为了避免被目标系统或安全设备检测到攻击行为,攻击者可能会采取一些措施隐藏攻击痕迹,如:

  • 使用代理服务器:通过代理服务器发送恶意请求,隐藏真实的攻击者IP地址。

  • 清理日志:在攻击成功后,尝试删除或修改目标系统的日志文件,以掩盖攻击行为。

  • 分散攻击:将攻击行为分散到多个请求或时间段内执行,以避免触发目标系统的异常检测机制。

八、总结

SQL注入是一种常见的Web安全漏洞,对Web应用程序的安全构成严重威胁。为了防范SQL注入攻击,需要采取多种措施,包括使用参数化查询、输入验证和过滤、最小化特权、使用ORM框架等。同时,挖掘SQL注入漏洞也需要一定的技巧和经验,包括识别注入点、确定数据库类型、获取数据库信息、暴破用户名和密码等。

题外话

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
侵权,请联系删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值