应用安全系列之三十八:注入问题的成因以及预防原理

news2024/9/22 5:36:05

自从有了OWASP TOP的排名依赖,注入问题就一直排名前三,这就说明了注入问题对系统的影响是十分严重的,而且,注入问题一般比较容易被利用。

注入问题产生的根本原因就是程序在接受到请求中的参数时,没有经过严格的验证和正确地使用就直接被使用于解释型语言、结构化查询语言或者标签语言等语言的环境里用作程序执行的一部分。它的发生需要两个条件:1) 数据来源可以被攻击者控制和篡改;2)数据被用做解释性语言、结构化查询语言或者标签语言的一部分。以SQL注入为例,它是结构化的查询语言,当由用户输入作为SQL语句的一部分时,就会产生SQL注入。

了解了注入发生的根本原因之后,关于预防就相对来说比较容易理解了。根据它发生的两个条件,来探索实施方案。第二个条件一般是无法避免的,那就只有解决第一个条件。第一个条件是“数据来源可以被攻击者控制和篡改”,预防方法有:输入验证、特殊字符转义、编码、输出净化以及使用安全的框架或者安全的API。下面逐一介绍它们。

  1. 输入验证

这是最常用的注入预防措施之一,也是相对而言最简单和直接的方法。但是,也是最容易犯错误的一种方法。

错误一:使用黑名单过滤,开发根据自己的理解列出一个黑名单,根据黑名单来验证,对于一些有明确的黑名单列表的漏洞类型,这种方法比较有效;但是,对于一些比较负责的漏洞类型,例如:XSS,可能就比较麻烦。而且,随着技术的发展,黑名单也可能出现变动,例如:有新的HTML标签出现等。在一些情况下,当黑名单字符是合理输入的一部分,这种方法就会彻底失效,例如,SQL禁止输入单引号(‘),但是有些国家或者地区的人名中就含有单引号,例如:O’neal,这整情况就无法限制用户不能输入黑名单中的字符。

错误二:搜索输入的字符串中含有危险字符串直接替换成空,这种做法看似很完美,但是,漏洞百出。我在漏洞修复的Review中,经常发现修复路径遍历漏洞的源代码是把../替换成空,但是当输入中含有:.../.../时,把../替换成空的结果还是../。所以,再任何时候尝试去修复错误是一件非常危险的做法。

  1. 特殊字符转义

针对一些执行环境中的语言的一些特殊字符,相对应的库一般都会提供相应的API对特殊字符进行转义处理,例如:mysql_escape_string,他的核心原理就是使用反斜杠\针对特殊字符进行处理,例如,' 被处理成 \',SQL解析器针对他处理时,会把反斜杠理解为一种个数字符将\’解析为单引号字符,而不是字符串的开头或者结尾,这样就避免了通过单引号注入额外的内容。针对这种处理,apache common lib提供了一个类,用于处理各种情况的转义,具体的API信息可以参考:https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringEscapeUtils.html。

  1. 编码

根据编码的定义:编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。

可以知道,编码就是将信息转换成另外一种形式,而且可以通过解码还原。常用的编码方式有:base64,16进制编码等。

常用到编码的方式的漏洞类型是:XSS和HPP。关于XSS常用的就是HTML编码,将特殊字符<>’”/等以HTML编码的形式输出,浏览器在显示时,会自动进行解码,这样特殊字符就可以显示为原始字符,而不用担心特殊字符会影响原始背景的显示问题。编码一般都在输出的地方使用。也就是说,当输出时可能产生注入问题时,首先要考虑是否有编码方案来保证输出的准确性。

常见的HTML字符和编码方式如下:

关于HPP一般都建议使用URL编码来处理,关于URL编码,可以参考:https://docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html

  1. 输出净化

输出净化主要是当输出不能适用编码方案时的解决方案。当输出的是富文本框时,由于输出的本身就是HTML,这是使用编码就会导致显示不正确。需要根据使用的HTML标签列表,设置一个白名单,但一个标签不在白名单中时,直接将其净化处理,来避免可能的注入问题。

关于HTML的处理,可以参考OWASP ANTISamy或者https://github.com/OWASP/java-html-sanitizer。

  1. 使用安全架构或者安全API

有些语言针对某些情况提供了一些安全架构或者安全API,采用这些安全的架构或者API,就可以有效避免一些注入问题。例如,Java的PrepareSatement类;Java的iBatis或者JPA都提供了方法来避免SQL注入漏洞的产生。不过,在使用这些框架或者API,也需要注意一点:不要自己组装SQL,一旦,使用自组装的SQL,任何框架或者API,都解决不了注入的问题。同时,使用框架时,有时为了灵活性,也提供了一些不安全的方式,这是就需要注意在使用时需要了解哪些方式是安全的,哪些方式是不安全的。例如:MyBatis,参数使用#时系统会安全处理,参数使用$时,就会有风险。总之,使用第三方的框架或者库时,一定要了解清楚用法,才可以避免不必要的注入问题。

关于各种注入的特殊字符和建议处理方案可以参考https://blog.csdn.net/jimmyleeee/article/details/107210402

关于注入问题的处理的时机和方案,最后总结如下:

各种注入类型和产生的时机如下表:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端工程师leetcode算法面试必备-二分搜索算法(下)索算法(下)

一、287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 1、HashMap 在没有其它附加条件的情况下&…

如何处理“WLAN没有有效的IP配置”这一问题?

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;暂无 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的…

svg.js使用教程

在日常web开发过程中&#xff0c;我们会需要显示一些图形化的元素&#xff0c;使用divcss、ps图片是常见的实现方式。 但使用svg来绘制可能更加合适&#xff0c;SVG是可缩放矢量图形&#xff0c;有一些预定义的形状元素&#xff0c;可被开发者使用和操作&#xff1a; 矩形(rec…

图解LeetCode——剑指 Offer 50. 第一个只出现一次的字符

一、题目 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。 二、示例 2.1> 示例 1: 【输入】s "abaccdeff" 【输出】b 2.2> 示例 2: 【输入】s "" 【输出】 限制&#xff1a; 0 < s 的…

Swift(5)

目录 集合类型 数组 ​编辑 合集 合集操作 字典 Where 集合类型 Swift提供了三种主要的集合类型&#xff1a;组合&#xff0c;合集&#xff0c;字典。 数组是有序的值的集合。 合集是唯一值的无序集合。 字典是无序的键值对集合。 数组 Swift数组的类型的完整写法是…

总结如何设计一款营销低代码可视化海报平台

背景 我所在的部门负责的是活动业务&#xff0c;每天都有很多的营销活动&#xff0c;随之而来的就是大量的H5活动页面。而这些H5活动已经沉淀出了比较固定的玩法交互&#xff0c;我们开发大多数的工作也只是在复制粘贴这种大量的重复工作。 在基于此背景下我开始了低代码平台…

【手写 Vuex 源码】第十篇 - Vuex 命名空间的实现

一&#xff0c;前言 上一篇&#xff0c;主要介绍了 Vuex 响应式数据和缓存的实现&#xff0c;主要涉及以下几个点&#xff1a; Vuex 的响应式实现原理&#xff1b;响应式核心方法 resetStoreVM&#xff1b;commit 和 dispatch 的处理&#xff1b; 本篇&#xff0c;继续介绍 …

jdk-concurrentHashMap(1.8)源码学习

上文&#xff1a;jdk-HashMap(1.8)源码学习concurrentHashMap介绍concurrentHashMap是一个高性能、线程安全的HashMap&#xff0c;底层数据结构主要还是以数组链表红黑树实现与HashMap的结构是一致的。concurrentHashMap1.7和1.8的区别&#xff1f;对比名称1.71.8备注线程安全是…

PhysioNet2017分类的代码实现

PhysioNet2017数据集介绍可参考文章&#xff1a;https://wendy.blog.csdn.net/article/details/128686196。本文主要介绍利用PhysioNet2017数据集对其进行分类的代码实现。 目录一、数据集预处理二、训练2.1 导入数据集并进行数据裁剪2.2 划分训练集、验证集和测试集2.3 设置训…

C语言(C语言结构基础使用)

目录 一.结构 1.结构声明 2.初始化结构 3.访问结构成员 4.结构的初始化器 5.定义无结构标记 6.结构数组 7.嵌套结构 8.复合字面量和结构&#xff08;C99&#xff09; 9.伸缩性数组成员 10.伸缩性数组得特殊处理请求 11.匿名结构&#xff08;C11&#xff09; 12.使用结构数组得函…

RiProRiProV2主题美化顶部增加一行导航header导航通知

背景: 有些网站的背景顶部有一行罪行公告,样式不错,希望自己的网站也借鉴过来,本教程将指导如何操作,并调整成自己想要的样式。 比如网友搭的666资源站 xd素材中文网

【C语言必经之路——第11节】初阶指针(2)

五、指针的运算1、指针与整数相加减看一下下面的代码&#xff1a;#include<stdio.h> int my_strlen(char* str) {int count0;while(*str!\0){count;str;//指针加减整数}return count; } int main() {int lenmy_strlen("abcdef");printf("%d\n",len);…

OpenCV实战(10)——积分图像详解

OpenCV实战&#xff08;10&#xff09;——积分图像详解0. 前言1. 积分图像计算2. 自适应阈值2.1 固定阈值的缺陷2.2 使用自适应阈值2.3 其它自适应阈值计算方法2.4 完整代码3. 使用直方图进行视觉跟踪3.1 查找目标对象3.2 完整代码小结系列链接0. 前言 我们知道直方图是通过遍…

方法递归调用

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 ✈️推荐一款模拟面试&#xff0c;刷题神器…

【C++设计模式】学习笔记(4):观察者模式 Observer

目录 简介动机(Motivation)模式定义结构(Structure)要点总结笔记结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金…

渣土车智能识别检测 yolov5

渣土车智能识别检测通过yolov5网络模型深度学习技术&#xff0c;渣土车智能识别检测对禁止渣土车通行现场画面中含有渣土车时进行自动识别监测&#xff0c;并自动抓拍告警。YOLOv5是一种单阶段目标检测算法&#xff0c;该算法在YOLOv4的基础上添加了一些新的改进思路&#xff0…

【Redis场景3】缓存穿透、击穿问题

场景问题及原因 缓存穿透&#xff1a; 原因&#xff1a;客户端请求的数据在缓存和数据库中不存在&#xff0c;这样缓存永远不会生效&#xff0c;请求全部打入数据库&#xff0c;造成数据库连接异常。 解决思路&#xff1a; 缓存空对象 对于不存在的数据也在Redis建立缓存&a…

spark01-内存数据分区数量个数原理

原始代码如下&#xff1a;val conf: SparkConf new SparkConf().setMaster("local[*]").setAppName("wordcount")val scnew SparkContext(conf)val rdd: RDD[Int] sc.makeRDD(List(1,2,3,4)//将处理的数据保存分区文件rdd.saveAsTextFile("output2&…

分布式数据库(ShardingSphere)

单库单表数据量过大导致的问题与应对传统的将数据集中存储至单一数据节点的解决方案&#xff0c;在容量、性能、可用性和运维成本这三方面已经难于满足互联网的海量数据场景。我们在单库单表数据量超过一定容量水位的情况下&#xff0c;索引树层级增加&#xff0c;磁盘 IO 也很…

数据库(六): MySQL的主从复制和读写分离

文章目录一、为什么要使用主从复制和读写分离二、主从复制的原理三、如何实现主从复制3.1 master配置3.2 slave配置3.3 测试主从复制四、读写分离五、缺点一、为什么要使用主从复制和读写分离 注意到主从复制和读写分离一般是一起使用的。目的很简单&#xff0c;就是提高数据库…