不得不知的20个SQL注入知识点!务必收藏!

admin 2025年1月26日13:28:17评论8 views字数 4633阅读15分26秒阅读模式

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. 1. 脱库:查询隐藏数据。企业对于用户数据并不会直接删除,而是通过delete等字段去控制其是否可见。攻击者可以利用SQL注入查询这些隐藏数据。

  2. 2. 新增管理账户:在数据库中新增具有管理员权限的账户,从而完全控制整个系统。

  3. 3. 获取服务器权限:在极端条件下,攻击者甚至可以通过SQL注入获取服务器权限,执行任意命令。

  4. 4. 网页篡改:通过操作数据库对特定网页进行篡改。

  5. 5. 挂马攻击:修改数据库一些字段的值,嵌入恶意软件链接。

  6. 6. 数据破坏:恶意删除或修改数据库中的数据,导致数据丢失或损坏。

四、SQL注入的分类

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

  1. 1. 基于攻击原理的分类

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

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

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

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

  2. 2. 基于数据类型的分类

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

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

  3. 3. 基于提交方式的分类

    • • GET型注入:通过URL的查询字符串传递恶意参数。

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

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

五、SQL注入的防范

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

  1. 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. 2. 输入验证和过滤

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

  1. 3. 最小化特权

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

  1. 4. 使用ORM框架

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

  1. 5. 避免动态拼接SQL语句

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

  1. 6. 错误处理和日志记录

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

  1. 7. 使用WAF设备

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

六、如何挖掘SQL注入漏洞

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

  1. 1. 单双引号测试

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

  1. 2. 算术运算测试

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

  1. 3. 布尔条件测试

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

  1. 4. 时间延迟测试

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

  1. 5. 带外测试

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

七、手工SQL注入技巧

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

  1. 1. 识别注入点

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

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

  2. 2. 确定数据库类型

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

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

  3. 3. 获取数据库信息

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

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

  4. 4. 暴破用户名和密码

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

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

  5. 5. 绕过WAF设备

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

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

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

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

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

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

  6. 6. 绕过输入验证

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

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

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

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

  7. 7. 利用数据库特性

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

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

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

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

  8. 8. 隐藏攻击痕迹

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

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

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

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

八、总结

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

原文始发于微信公众号(HACK之道):不得不知的20个SQL注入知识点!务必收藏!

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月26日13:28:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   不得不知的20个SQL注入知识点!务必收藏!http://cn-sec.com/archives/3676674.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息