OWASP TOP10系列之#TOP1# A1-注入类「建议收藏」

OWASP TOP10系列之#TOP1# A1-注入类「建议收藏」OWASPTOP10系列之#TOP1#注入类提示:本系列将介绍OWASPTOP10安全漏洞相关介绍,主要针对漏洞类型、攻击原理以及如何防御进行简单讲解;如有错误,还请大佬指出,定会及时改正~文章目录OWASPTOP10系列之#TOP1#注入类前言一、注入类漏洞是什么?二、什么情况下会产生注入类漏洞问题?三、如何预防?四、具体示例1.SQL注入2.OS命令注入3.XPath注入总结前言在OWASP(开放式Web应用程序安全项目)公布的10项最严重的Web应用程序安全风险列表的在

大家好,又见面了,我是你们的朋友全栈君。

OWASP TOP10系列之#TOP1# A1-注入类

提示:本系列将介绍OWASP TOP10 安全漏洞相关介绍,主要针对漏洞类型、攻击原理以及如何防御进行简单讲解;如有错误,还请大佬指出,定会及时改正~



前言

在OWASP(开放式Web应用程序安全项目)公布的10项最严重的Web 应用程序安全风险列表的在 2013、2017 的版本中都是第一名


一、注入类漏洞是什么?

注入类漏洞是利用应用程序弱点,通过恶意字符将恶意代码写入数据库,获取敏感数据或进一步在服务器执行命令
几乎任何数据源都可以是注入向量,比如环境变量、参数以及用户信息等等,当攻击者可以向程序发送恶意数据时,就会出现注入缺陷
注入缺陷非常普遍,尤其是在代码中。一些更常见的注入有SQL、NoSQL、OS命令、对象关系映射(ORM)、LDAP和表达式语言(EL)或对象图导航库(OGNL)注入
检查代码时很容易发现注入缺陷,源代码检查是检测应用程序是否易受注入攻击的最佳方法,紧随其后的是对所有参数、头、URL、cookie、JSON、SOAP和XML数据输入进行彻底的自动化测试。还可以使用包括静态源(SAST)、动态应用程序测试(DAST)工具以及IAST(交互式应用安全测试),以在生产部署之前识别引入的注入缺陷。

二、什么情况下会产生注入类漏洞问题?

1 应用程序不会验证、过滤或清理用户提供的数据;
2 在对象关系映射(ORM)搜索使用恶意数据参数,用于提取额外的敏感记录;
3 恶意数据被直接使用或连接,比如SQL或执行CMD命令时,在动态查询、命令或存储过程中使用
包含结构数据和恶意数据。

三、如何预防?

1 将数据与命令和查询分开,使用安全的API,提供参数化接口并正确使用对象关系映射工具(ORM)
2.对服务器端输入进行验证,必要时需要对特殊字符进行转义、正则匹配等

四、具体示例

1.SQL注入

攻击者修改浏览器中的 ‘id’ 参数值以发送:’ 或 ‘1’=‘1
http://example.com/app/accountView?id=’ or ‘1’=’1

更改两个查询的含义以返回帐户表中的所有记录。
更危险的攻击可能会修改或删除数据,甚至调用存储过程

String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" 
+ request.getParameter("id") + "'");

2.OS命令注入

以下的代码使用系统属性 APPHOME 来确定它的安装目录,然后根据指定目录的相对路径执行初始化脚本
(错误代码)
示例语言: Java

String home = System.getProperty("APPHOME");
字符串 cmd = home + INITCMD;
java.lang.Runtime.getRuntime().exec(cmd);

上面的代码允许攻击者通过修改系统属性 APPHOME 指向包含恶意版本的 INITCMD 的不同路径,以应用程序的提升权限执行任意命令。因为程序不会验证从环境中读取的值,如果攻击者可以控制系统属性 APPHOME 的值,那么他们就可以欺骗应用程序运行恶意代码并控制系统。

3.XPath注入

与SQL 注入类似,当网站使用用户提供的信息为 XML 数据构建 XPath 查询时,就会发生 XPath 注入攻击。通过故意向网站发送格式错误的信息,攻击者可以找出 XML 数据的结构,或者访问他们通常无法访问的数据。如果 XML 数据用于身份验证(例如基于 XML 的用户文件),他们甚至可以提升他们在网站上的权限。

查询 XML 是使用 XPath 完成的,XPath 是一种简单的描述性语句,允许 XML 查询定位一条信息。与 SQL 一样,您可以指定要查找的某些属性和要匹配的模式。对网站使用 XML 时,通常接受查询字符串上的某种形式的输入,以标识要在页面上定位和显示的内容。必须清理此输入以验证它不会弄乱 XPath 查询并返回错误的数据。

XPath 是一种标准语言;它的符号/语法总是独立于实现的,这意味着攻击可能是自动化的。没有不同的方言,因为它发生在对 SQL 数据库的请求中。

因为没有级别访问控制,所以可以获取整个文档。我们不会遇到任何限制,正如我们可能从 SQL 注入攻击中了解到的那样。

比如
假设我们在网页上有一个用户身份验证系统,该系统使用此类数据文件来登录用户。一旦提供了用户名和密码,软件可能会使用 XPath 来查找用户:

<?xml version="1.0" encoding="utf-8"?>
<Employees>
   <Employee ID="1">
      <FirstName>Arnold</FirstName>
      <LastName>Baker</LastName>
      <UserName>ABaker</UserName>
      <Password>SoSecret</Password>
      <Type>Admin</Type>
   </Employee>
   <Employee ID="2">
      <FirstName>Peter</FirstName>
      <LastName>Pan</LastName>
      <UserName>PPan</UserName>
      <Password>NotTelling</Password>
      <Type>User</Type>
   </Employee>
</Employees>
String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username") + "' And
        Password/text()='" + Request("Password") + "']";

使用普通的用户名和密码,此 XPath 可以工作,但攻击者可能会发送错误的用户名和密码并在不知道用户名或密码的情况下选择 XML 节点,如下所示:

Username: blah' or 1=1 or 'a'='a
Password: blah

FindUserXPath becomes //Employee[UserName/text()='blah' or 1=1 or
        'a'='a' And Password/text()='blah']

Logically this is equivalent to:
        //Employee[(UserName/text()='blah' or 1=1) or
        ('a'='a' And Password/text()='blah')]

在这种情况下,只有 XPath 的第一部分需要为真。密码部分变得无关紧要,用户名部分将匹配所有员工,因为“1=1”部分。

XPath 注入防御
1.使用XPath 变量解析器
2.就像避免 SQL 注入的技术一样,您需要使用参数化的 XPath 接口(如果可用),或者转义用户输入以使其安全地包含在动态构造的查询中。如果您在动态构造的 XPath 查询中使用引号来终止不受信任的输入,那么您需要在不受信任的输入中转义该引号,以确保不受信任的数据无法尝试脱离该引用的上下文。在以下示例中,单引号 (’) 用于终止 Username 和 Password 参数。因此,我们需要将此输入中的任何 ’ 字符替换为该字符的 XML 编码版本,即 &apos。

String FindUserXPath;
FindUserXPath = "//Employee[UserName/text()='" + Request("Username").Replace("'", "&apos;") 
        + "' And Password/text()='" + Request("Password").Replace("'", "&apos;") + "']";

另一个更好的缓解选项是使用预编译的 XPath 1 查询。预编译的 XPath 查询已经在程序执行之前预设,而不是在用户输入添加到字符串后即时创建。这是一条更好的路线,因为您不必担心错过本应转义的字符

总结

本文主要介绍OWASP TOP10系列之#TOP1# 注入类,并对常见的SQL注入、CMD注入以及XPath注入简单介绍案例,仅供参考,欢迎指正~~

链接: OWASP-注入类参考链接.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146043.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DELL服务器数据恢复成功案例[通俗易懂]

    DELL服务器数据恢复成功案例[通俗易懂]DELLEqualLogicPS6100采用虚拟ISCSISAN阵列,为远程或分支办公室、部门和中小企业存储部署带来企业级功能、智能化、自动化和可靠性。以简化的管理、快速的部署及合理的价格满足了分支办公室和中小企业的存储需求,同时提供全套企业级数据保护和管理功能、可靠的性能、可扩展性和容错功能,是中型企业级存储的起点产品,但某些物理故障或其他操作都可能会对卷或存储造成破坏,因此对系列存储的数…

    2022年6月30日
    25
  • 关于MSHTML_Html格式

    关于MSHTML_Html格式本文翻译自http://msdn.microsoft.com/workshop/browser/mshtml/overview/overview.aspMSDNHome>MSDNLibra

    2022年8月2日
    5
  • 八皇后问题详解(四种解法)[通俗易懂]

    八皇后问题详解(四种解法)[通俗易懂]如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问题,最后一句“计算机发明后就有一万种方式解决这个问题”读起来也让程序猿们很快活。闲话少说,开始阐述我的思路:最无脑的解法一定是八个for遍历,浪费了太多的计算资源在各种无用功上面,我们稍微构思一下:首先如何决定下一个皇后能不能放这里可以有两种思路,第一种是尝试维护一个8*8的二维矩阵,每次找到一个空位放下一个皇后就把对应行列对

    2022年6月30日
    26
  • 深入理解java注解的实现原理(转载)

    深入理解java注解的实现原理(转载)转自 深入理解 java 注解的实现原理今天将从以下 4 个方面来系统的学习一下 java 注解 什么是注解 注解的用途 注解使用演示 注解的实现原理 1 什么是注解注解也叫元数据 例如我们常见的 Override 和 Deprecated 注解是 JDK1 5 版本开始引入的一个特性 用于对代码进行说明 可以对包 类 接口 字段 方法参数 局部变量等进行注解一般

    2025年6月18日
    3
  • 桶排序算法c语言_哪种排序算法最快

    桶排序算法c语言_哪种排序算法最快在前几回我们已经对冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、归并排序、堆排序、计数排序做了说明分析(具体详情可在公众号历史消息中查看)。本回,将对桶排序进行相关说明分析。一、排序算法系列目录说明冒泡排序(BubbleSort)插入排序(InsertionSort)希尔排序(ShellSort)选择排序(SelectionSort)快速排序(Quick…

    2025年8月9日
    4
  • java 字符 几个字节_java中字符串占几个字节「建议收藏」

    java 字符 几个字节_java中字符串占几个字节「建议收藏」首先,char为Java的基本类型,基本类型所占的字节数是固定的,如int占4字节,double占8字节,这可以使得Java在不同的平台上所占类型固定,很好地保证了Java的可移植性。因此,Java中char类型固定占2个字节。(注:char类型也可以存储一个汉字)。其次,String采用一种更灵活的方式进行存储。在String中,一个英文字符占1个字节,而中文字符根据编码的不同所占字节数也不同。…

    2022年6月26日
    59

发表回复

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

关注全栈程序员社区公众号