开源组件漏洞
常见的有Structs2 远程命令执行漏洞、COMMONS FILEUOLOAD 远程拒绝服务漏洞、FASTJSON 远程命令执行漏洞、APACHE SHIRO 远程命令执行漏洞,具体的漏洞列表及单个解决方案可以参见各个组件官网说明。
解决方案
1、实际开发中建议采用通用研发组件,统一组件使用及引用规范。
2、将可信的参数预定义到一个map中,在需要时进行匹配,当匹配不到时,就按默认的执行。
源代码安全漏洞
1、语言自身漏洞
常见类型:
Java 原生态反序列化漏洞:反序列化将字节流还原成对象,如果应用对不可信数据进行了反序列化处理,攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,可能带来任意代码执行。
2、业务逻辑漏洞
1)越权类漏洞
安全缺陷:攻击者可以越权操作(增删查改)其他用户的数据。信息安全三要素:保密性、完整性、可用性。这三个要素越权都能破坏:查看破坏保密性, 修改破坏完整性,删除破坏可用性。
常见类型:
水平越权
同级别权限的用户访问其他用户的资源。操作服务端数据时,服务端未验证数据是否归属于请求用户,使得攻击者可操作其他用户数据,导致水平越权漏洞。
垂直越权
低级别权限的用户访问高级别权限的资源,又称为权限提升,主要是由于应用程序没有做权限控制或仅通过JS在前端进行权限控制,导致攻击者猜测到管理页面或绕过前端验证达到权限提升的目的。常出现在后台管理中。
测试方法:
换Cookie:使用两个账号的cookie或者直接切换账号,发送同一个请求包,看相应内容是否相同
换资源ID:关注有特定标识字段的接口,修改该字段的值为非本用户的id,看是否得到响应
解决方案:
开启业务鉴权。如下两种场景:
1、据当前登录用户信息进行业务处理
关键在于
a、使用正确的方式获取用户pin :禁止从Get、Post 参数、Cookie 参数以及Header 头中获取pin 的值,所有获取当前用户身份的方式都应该从session中获取,不以任何客户端传递的明文数据作为鉴权方式。
b、对用户的权限进行校验:任何和账户相关的增删改查都要用当前用户身份去约束。
2、基于业务资源数据进行业务处理的场景
建议
a、安全编码
b、业务系统设计关键编号应设计为不可预测类型(如UUID),尽量避免使用递增数字类型编号,用户可见索引字段尽量设置成无规律
c、资源数据的获取需要增加风控,如采用划分角色进行防御
d、对请求来源、请求频率进行限制,在访问数据库之前进行拦截
e、对敏感数据的增删改查导出等需要增加日志记录并定期审计
2)SQL注入漏洞
安全缺陷:应用程序直接将用户输入的内容拼接到SQL语句中执行。在特定条件下,攻击者可以查询数据库中任何数据,同时可以直接获取数据库服务器的系统权限。如操作数据库中数据、拖库、在数据库服务器上执行操作系统命令、DRUID检测(泄露数据库的库表和SQL语句等敏感信息)。
常见类型:
SQL处理时采用拼接模式${param}
解决方案:采用预编译模式#{param}
a、select * from table_A where id =#{id}
b、like concat('%',#{param},'%'}
c、in
#{item}
d、order by 在java层面做映射
3)XSS跨站脚本攻击
Cross Site Script, 跨站脚本漏洞 ,通常发生在客户端,攻击者在Web页面中插入恶意JavaScript代码(也包括VBScript和ActionScript代码等),用户浏览此页面时,会执行这些恶意代码,从而使用户受到攻击。
安全缺陷:未做数据校验或任何数据处理即展示在前端。如数据展示对客户输入校验规则不足,导致可以通过相关编码或者特殊标签来绕过,进而实现XSS攻击。攻击者可以利用此漏洞开展信息窃取、网络钓鱼、蠕虫攻击、内网探测、插入广告、劫持流量、恶意跳转等攻击。
常见类型:
类型 | 介绍 | 触发方式 | 是否经过后端 | 是否经过数据库 |
反射型 | 攻击者发送一个URL给用户并诱导其访问,浏览器会执行页面嵌入的恶意脚本,从而达到恶意攻击的目的 | 受害者点击链接 | √ | × |
存储型 | 攻击者利用应用程序提供的添加、修改数据功能,将恶意数据存储到服务器中,当其他用户浏览展示该数据的页面时,浏览器会执行页面嵌入的恶意脚本,从而达到恶意攻击的目的。 | 访问对应页面 | √ | √ |
DOM | 在Html页面中,未通过规范JavaScript直接操作用户输入的数据,当攻击者插入一段恶意代码,在页面最终展示会执行恶意脚本,从而达到恶意攻击的目的 | 访问对应页面 | × | × |
解决方案:
位置 | 方案 |
前端 | 1、用户可控的输入不可信,建议实施安全编程技术确保正确过滤用户提供的数据,并编码所有用户提供的数据以防以可执行的格式向终端用户发送攻击脚本。 2、禁止向HTML页面输出未经安全过滤或未正确转义的用户数据。 |
服务器端 | 1、在maven中引入XSS防护方案。 2、在服务器端调用并处理入参,输出在CSS中的服务器。 |
Velocity模板 | 1、配置resource路径下velocity.properties 文件中的userdirecttive 2、在mvc-servlect.xml(或spring-servlet.xml)中配置configLocation参数为:classpath:velocity.properties 3、在不同的位置进行输出转义 |
4)文件上传漏洞
安全缺陷:Web 业务系统在处理用户上传文件时 ,未对扩展名进行验证。同时如果用户上传文件的路径、名扩展成为可控数据,就会导致直接脚本木马到 Web 服务器上,直接控制 Web服务器。
编码缺陷:
对上传的文件类型没有校验
设定的文件保存在web目录下,路径不安全
对文件后缀名的校验仅在前端进行,没有再服务器端进行验证
未对http请求头的content-type 字段进行校验
未对http请求中的扩展名进行验证
解决方案:
禁止将文件(含临时存缓存文件)存储在web应用程序目录
使用文件后缀白名单
禁止上传html\html\swf 等可被浏览器解析的文件
文件格式强制转换
对文件进行重命名且不可预测
5)任意文件读取漏洞
安全缺陷:根据读取URL获取文件在网站上的绝对路径,读取文件。
编码缺陷:
将待下载文件直接返回给客户端
解决方案:
校验用户下载文件夹是否为指定文件夹
6)CSRF跨站请求伪造
安全缺陷:Cross-Site Request Forgery 跨站请求伪造,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作。
编码缺陷:
前端表单缺失CSRF防护相关代码
服务器端缺失对获取referer信息的校验
服务器端缺失对CSRF防御的相关代码
漏洞使用:
表单提交时,捕获HTTP请求,修改Referer,执行请求,生成CSRF 请求
解决方案:
验证HTTP Referer 字段
在业务请求中添加token 并验证
7)URL跳转漏洞
安全缺陷:Web业务系统接收到用户提交的URL参数后,未对URL参数进行“可信 URL”校验,就向用户浏览器返回跳转到该不可信URL。
常见类型:
钓鱼攻击,攻击者向用户发送一个存在URL跳转的链接,用户点击链接后跳转至钓鱼网站页面。
编码缺陷:
从客户端传入完整或部分URL参数:
1、未校验传入参数的URL协议
2、未校验传入参数的URL域名是否合法
3、未判断host中是否包含\(URL.getHost()存在绕过行为)
解决方案:
1、host做绕过判断:url.replace('\\','/')
2、判断域名是否在白名单之内
3、请求某个固定业务接口
使用白名单策略限制请求地址协议
使用白名单策略限制请求地址端口
使用白名单策略限制请求域名或者IP地址,禁止使用通配域名
禁止请求地址可以解析到内网地址
禁止使用301、302等重定向
8)XXE漏洞
安全缺陷:XML External Entity XML 外部实体注入,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。
漏洞危害:
可以导致SSRF,危害内网安全
可导致DoS攻击,影响服务器正常运行
可读取服务器文件,泄露服务器数据。
解决方案:
禁用外部实体
DocumentBuilderFactory 禁用DTDS
SAXParserFactory 禁用DTDS
9)CORS跨域资源共享漏洞
Cross-origin Resource Sharing跨域资源共享,使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或相应是成功还是失败。
解决方案:
设置 Access-Control-Allow-Origin 及Origin 白名单域名
携带Coolie时才允许设置Access-Control-Allow-Credentials 并设置精细化白名单
仅允许特定域发起跨域请求
10)JSONP漏洞
JSON with Padding是 JSON的一种使用模式,用于解决主流浏览器的跨域数据访问问题。跨域的JSON接口如果未校验请求来源就会存在JSONP劫持漏洞,从服务器返回的关键信息就可能被恶意站点通过跨域加载的方式获取。
常见类型:
JSONP跨越资源共享:JS从其他域名获取资料
解决方案
验证JSON文件调用的来源,如校验http头部的referer 处于白名单内
URL referer = new URL(request.getHeader("Referer")); String host = referer.getHost();
11)SSRF服务器端请求伪造漏洞
Server-Side Request Forgery 服务器端请求伪造,通过攻击者构造的由服务器端发起请求。攻击目标通常是从外网无法访问的内部系统。
编码缺陷:
服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。
漏洞危害
扫描内部网络
向内外部主机发送精心构造的数据包
DOS:请求大文件,始终保持连接
解决方案
1、必须使用白名单策略限制请求地址协议,原则上仅允许http、https 协议
2、必须使用白名单策略限制请求地址端口,原则上仅允许80、443等常规端口
3、建议使用白名单策略限制请求地址域名或IP地址,禁止使用通配域名
4、禁止请求地址可以解析到内网地址
5、禁止301、302等重定向
12)信息泄露
安全缺陷:
泄露用户隐私
网络劫持时会泄露敏感信息
泄露项目相关信息,被攻击者定向渗透
常见类型:
用户敏感数据未脱敏
敏感信息明文传输
配置文件敏感路径外网可以访问
项目后门工具对外
服务器报错信息
解决方案:
敏感信息脱敏,并做加密处理
13)暴力破解
常见类型:
利用穷举法,将密码进行逐个推算直到找到真正的密码