淘优惠

淘优惠

java常见的代码漏洞 java编程漏洞解析

热门文章 0
java常见面试题及答案,java常见设计模式,java常见异常类型,java常见的数据类型
1.健康监控Actuator暴露端口2.SSRF漏洞攻击3.富文本XSS攻击4.暴力破解短信验证码登录5.恶意短信轰炸骚扰用户6.低版本Fastjson导致RCE漏洞7.SQL注入漏洞8.水平越权信息泄露9.权限绕过漏洞 ? Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块,借助于Actuator开发者可以很方便的对应用系统的某些监控指标进行查看,统计等。 ? 在springboot项目中引入Actuator: 漏洞问题: ? 系统启动后,我们通过访问Actuator暴露的一些端口,可以获取到信息,这样也就存在信息暴露的风险,,以下是一些暴露的端口。 (1)http://ip+port/actuator ? 通过http://ip+port/actuator可以访问到系统暴露的端点集合,每一个端点都可以进行调用,例http://127.0.0.1:9876/api/actuator,查询结果如下: (2)http://ip+port/actuator/env ? 通过http://ip+port/actuator/env可以访问到系统配置环境信息,包含properties中数据库用户名、密码等敏感信息,例http://127.0.0.1:9876/api/actuator/env,查询结果如下: (3)http://ip+port/actuator/heapdump ? 通过http://ip+port/actuator/heapdump可以下载堆转储文件,在浏览器中执行此请求,会下载一份文件: ? 然后利用heapdump_tool工具可以从此headdump文件中提取出数据库等敏感信息: 解决方案 1.在properties中禁止某些端口的访问,例如: 此时再访问禁止的端口,显示404: 2.在properties中完全禁用actuator,例如: 此时再访问actuator的端口,都显示404: ? 在项目开发中,有些需求是前端配置ip或者url信息,服务端通过此配置信息进行远程调用。例如系统提供前端页面配置数据库的链接信息: 系统支持前端页面配置获取第三方token的链接信息,通过服务端去调用获取的场景: 漏洞问题: ? 可以对外网服务器所在的内网、本地进行端口扫描,获取一些服务的banner信息;攻击运行在内网或本地的应用程序(比如溢出);利用ftp、file协议读取本地文件等。 (1)扫描内网服务器开放的端口 ? 数据库链接配置:通过配置内网服务器的ip、端口信息,点击测试连接数据库,当此ip不存在或者端口不存在时,接口返回的报错速度会非常快;当访问到存活ip的存活端口,那么返回的时间会有非常大的差别。 不存在的端口,执行时间: 存活ip、存活端口,执行时间: (2)访问内网文件 ? 服务器调用第三方系统配置链接信息:当接口地址配置ftp或file时,可以访问到服务器的文件信息。 解决方案: 1.禁止host配置为内网地址; 2.统一错误信息,避免用户可以根据错误信息来判断远端服务端的端口状态; 3.禁用不需要的协议,仅允许http和https请求,防止ftp、telnet、file、ldap等协议引起的问题; 4.对url进行非法特殊字符校验,防止CRLF(换行符\r )攻击; 5.对确实需要访问的内网ip、端口进行白名单的配置。 (1)校验url方法: (2)配置内网白名单 properties配置文件中配置白名单集合: 加载配置的白名单集合: (3)校验host和port是否合法 (4)统一错误处理,不返回具体报错信息 ? 在项目中,有些输入框的文本内容需要带有样式、引入图片等需求,传统的input输入框没法满足,这时候就需要引入富文本编辑器,前端显示富文本的时候使用html标签。例如: 漏洞问题: ? 当富文本内容包含一些前端js的alert、script等字符时,在进行文本回显的时候,浏览器会执行上述脚本,从而劫持用户会话、危害网站、插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器等。 (1)恶意弹窗 ? 在富文本中包含以下恶意js脚本: ? 在富文本回显的时候,出现弹框: 服务端解决方案: 1.引入jsoup过滤前端提交过来的富文本 ? jsoup是一款java的HTML解析器,可直接解析某个URL地址、HTML文本内容。java引入jsoup的方式:在pom.xml中引入jar包: ? 调用jsoup提供的API进行字符过滤: 2.当Safelist.relaxed()提供的白名单不够用时,进行扩展 ? 首先来看下Safelist.relaxed()定义的白名单集合: addTags(String … tags):参数的内容表示html标签(元素)的白名单; addAttributes(String tag,String … attributes):表示指定标签允许配置哪些属性; addProtocols(String tag,String attribute,String … protocols):表示指定标签的指定属性允许使用哪些协议。 ? 当默认的白名单不满足需求时,可以在既有的基础上添加新的白名单,例如: ? 测试结果如下: 前端解决方案 1.引入js-xss过滤待显示富文本 ? 前端将数据渲染到页面呈现之前,先对内容进行过滤,推荐使用js-xss,官网:http://jsxss.com。 (1)在Node.js上使用 安装: 使用: (2)在浏览器器上使用 引入文件: 使用: ? 现在越来越多的网站支持通过手机号+验证码的方式登录系统,验证码一般4位或者6位数字。 漏洞问题: ? 当不法用户输入某个已知的其他用户的手机号,点击获取验证码,然后使用程序生成符合位数的验证码进行暴力登录,破解成功后即可获得合法用户的权限,甚至可以破解管理员的密码进而控制整个站点。 解决方案: 1.使用验证码进行验证登录; 2.生成短信验证码时,设置失效时间、可以验证的剩余次数(每次验证数量减1,数量小于0则删除); (1)生成验证码 ? 验证码存放到redis中,设置失效时间、设置可以验证的剩余次数。 (2)校验验证码 ? 判断是否有给此手机号发送过验证码,没发送过直接验证失败;有发送过验证码,判断输入的验证码是否等于redis中存放的,若是相等,则校验通过,删除redis中的记录;若是不相等,则剩余次数减1,然后判断剩余次数是否小于0,小于0,则删除redis中的记录,验证失败,若是大于0则提示验证码错误。 ? 现在越来越多的网站支持通过手机号+验证码的方式登录系统,验证码一般4位或者6位数字。 漏洞问题: ? 当不法用户输入某个已知的其他用户的手机号,点击获取验证码,或者用程序循环去跑发送短信验证码的接口,导致此手机号的用户被短信轰炸,受到骚扰。 解决方案: 1.前端进行控制 ? 在点击了获取验证码后,前端隐藏此按钮或者让此按钮灰显不能点击,然后出现一个倒计时的标签,等倒计时结束后才允许点击获取验证码按钮。 2.服务端进行控制 ? 只是前端进行控制,也会存在绕过倒计时限制进行接口调用的情况,例如使用其他api工具直接调用接口。服务端需要对发送短信的接口进行限制,这里使用redis来存已发送的验证码。当某个手机号请求发送验证码,先从redis中查看是否在有效期内给此号码发送过验证码,若发送过,则提示已经发送过,不再重复发送;若不存在,则新生成一个验证码,发送到此手机号上,并存到redis中。 ? Fastjson是java的一个库,可以将java对象通过toJSONString()转化为json格式的字符串,也可以将json格式的字符串通过parseObject()转化为java对象。 ? 在springboot中引入fastjson: 漏洞问题: ? 前端使用json格式把参数传递到服务端,服务端在进行反序列化(json格式转为java对象)的时候,会进入parseField方法,进入该方法后,会调用setValue(object,value)方法,这里会执行构造的恶意代码,最终造成代码执行。Fastjson采用黑白名单的方法来防御反序列化漏洞,导致当不法用户不断发掘新的反序列化类时,就算在autoType关闭的情况下仍然可以绕过黑白名单防御机制,造成远程命令执行漏洞。 解决方案: 1.更新Fastjson到最新版本 ? 在<=1.2.68版本中,攻击者可以通过精心构造的json请求,远程执行恶意代码,所以把Fastjson版本更新到最新版解决此问题。 ? 在开发的接口中,存在需要前端输入参数,服务端根据参数组织sql查询数据的情况。 漏洞问题: ? 若是服务端对用户输入数据的合法性没有判断或过滤不严,攻击者可以在事先定义好的查询语句结尾添加上额外的sql语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务执行非授权的任意查询,从而进一步得到响应的数据信息。 (1)sql拼接参数传递问题 ? 对于mybatis,组织参数到sql中,可以使用KaTeX parse error: Expected 'EOF', got '#' at position 16: {}进行参数的拼接,也可以使用#?{}进行参数的占位,当进行sq…{}修饰的会把参数值原样拼接到sql中;#{}修饰的会使用占位符?占位,并把参数值作为参数传递进去,当参数为字符串类型时,会默认给参数值加上单引号。 ? 例如以下查询sql: 若参数值id=1 or 1=1,则经过编译后的sql为: 此时会查询出所有的用户数据,导致信息泄露。 (2)没法使用#{}设置参数的order by排序字段 ? 当sql的查询结果支持多种方式排序,且排序字段和排序方式由前端进行传递时,若是我们使用#{}的方式来占位参数,编译出来的sql是错误的,编译之后会给此排序字段加上单引号。 ? 例如以下查询sql: 若参数值orderFiled = ‘created_time’,order=‘desc’,经过编译后的sql为: 此sql是有问题的,排序字段和排序方式不能加单引号。那只能使用${}进行sql拼接的方式,此时若参数值orderFiled = ‘created_time’,order=‘desc,(SELECT*FROM(SELECT+SLEEP(3)UNIONSELECT+1)a)’,经过编译后的的sql为: 此时mysql会被恶意查询拖延时间,甚至拖垮mysql服务器。 解决方案: 1.sql组织时尽量使用#{}占位符代替${}拼接符; 2.动态字段排序order by这样没法使用#{}的情况,可以使用以下两种方式处理: ①代码中判断:服务端收到参数后,对参数的值进行校验,判断是否属于允许的值,允许才放行;校验通过后拼接sql即可使用${}的方式。 ②组织sql时判断:判断参数的值是否等于系统约定的值,等于才进行拼接,不等于使用默认的排序方式。 ? 服务端给出的接口,基本都是根据参数查询、删除、更新、添加数据,用得比较多的是根据某个id去操作数据,而出于性能考虑,id一般都采用整数自增的方式,这样就会存在id被枚举的情况。 漏洞问题: ? 若是对某条记录的操作不加权限的验证,直接返回此参数对应的记录或者修改记录,则会越权操作本来不属于此用户的记录,导致信息会被恶意用户盗取甚至篡改其他合法用户的信息。 (1)通过枚举访问资源 ? 有些场景下,用户发布一个对外的链接地址(不需要登录直接访问),此链接对应的资源只想让他熟悉的人知道,用户会把此链接单独发给他信赖的人。若是此链接地址的结尾是一个自增型的整数,则用户通过枚举结尾,就能轻松访问到其他用户发布的链接资源。 ? 例如以下的链接地址: (2)越权查询记录 ? 用户使用系统时,可以通过浏览器查看调用了哪些接口,以及各个接口传递的参数。若是对访问的记录不加权限验证,则可能出现越权查看其他用户记录的情况。 ? 例如以下的接口访问数据: 当枚举id的值进行访问,没加权限验证,则可以越权访问记录。 解决方案: 1.对外公开的链接资源,结尾地址使用uuid,避免被枚举; 2.对于系统资源权限的验证,可以结合着项目当中引入的框架来定,例如使用spring security,在接口上使用注解的方式加上权限的标识,在管理后台对用户进行权限的分配,一般都是用户与角色挂钩,角色与菜单和权限挂钩; 3.对于比较细粒度的权限校验,可以结合着redis来实现,判断此记录是否属于此人的资源,属于才让访问,不属于则抛出异常。可以在记录产生的时候直接加到redis中,并且与某个用户进行关联,当操作此记录的时候,再从redis中取出,看此用户是否有权限操作。 ? 在项目开发中,会有一些需求要等第一步校验通过,返回成功状态码之后,才进行第二步的操作。例如访问一个带密码的链接,需要先等密码验证通过后才加载资源。 漏洞问题: ? 当第一步校验后,抓包修改返回值,然后放包,即可绕过权限进行第二步的加载,导致攻击者访问未经授权的资源。 (1)抓包修改校验结果访问资源 ? 对于需要密码访问的链接,随便输入密码,对校验结果进行抓包,修改状态值为通过, 然后放包,即可查看到资源。 解决方案: 1.校验密码是否正确的时候,生成一个uuid的会话状态码,以此uuid+这个链接id作为redis的key值,把校验结果作为value存放到redis中,并设置过期时间为3秒,然后把校验结果和uuid状态码返回给前端; 2.执行第二步的时候,需要把第一步的uuid值、链接id作为参数传到服务端,服务端根据这两个参数组织redis的key,查询redis是否有此记录,若是没有,直接返回,说明是伪造参数或者已经过期;若是存在,则判断第一步校验的结果状态值,通过则放行,否则返回。 (1)第一步校验密码逻辑 (2)第二步获取资源逻辑

mac studio


收藏 查看我的收藏 有用+1 已投票 播报 编辑 锁定 讨论 上传视频 特型编辑 消息认证码(带密钥的hash函数) 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! MAC是指消息认证码(带密钥的Hash函数):密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。构造方法由M.Bellare提出,安全性依赖于Hash函数,故也称带密钥的Hash函数。消息认证码是基于密钥和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。 中文名 消息认证码 外文名 Message Authentication Code 提出者 M.Bellare 类    型 保密工具 相关视频查看全部 1 基本介绍 2 计算方式 编辑 播报 消息认证码 消息认证码(带密钥的Hash函数):密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。构造方法由M.Bellare提出,安全性依赖于Hash函数,故也称带密钥的Hash函数。消息认证码是基于密钥和消息摘要所获得的一个值,可用于数据源发认证和完整性校验。在发送数据之前,发送方首先使用通信双方协商好的散列函数计算其摘要值。在双方共享的会话密钥作用下,由摘要值获得消息验证码。之后,它和数据一起被发送。接收方收到报文后,首先利用会话密钥还原摘要值,同时利用散列函数在本地计算所收到数据的摘要值,并将这两个数据进行比对。若两者相等,则报文通过认证。 编辑 播报 消息验证码有两种计算方式 [1]  :一种是利用已有的加密算法,如DES等直接对摘要值进行加密处理;另一种是使用专门的MAC算法。HMAC,它基于MD5或者SHA-1,在计算散列值时将密钥和数据同时作为输入,并采用了二次散列迭代的方式,实际计算方法如下:HMAC(K,M)=H(KopadOH(KipadOM))其中K是密钥,长度应为64字节,若小于该长度,则自动在密钥后面用“0”填充补足。M是消息;H是散列函数;opad和Ipad分别是由若干个0x5c和0x36组成的字符串;表示异或运算,O表示连接操作。 参考资料 1    消息验证码的原理   .博客[引用日期2015-04-27]

oppo r7sm收不到验证码 oppo手机收不到国外验证码


展开全部 若您使用的是OPPO/一加手机,出现收不到验证码的情况,可参考以下步骤进行排查:一、单个软件接收不到验证码若单个软件接收不到验证码,建议您对比其他手机看看是否可正常接收验证码:1、若其他手机也不能收到验证码,可能为三方应用服务问题,您可以联系对应软件方反馈。2、若其他手机可以收到验证码,建议您备份资料后,尝试将软件卸载重装,重启手机后看看能否恢复。3、若以上方法均未能解决您的问题,请携带购机发票、保修卡和手机前往就近的OPPO官方服务中心检测处理。二、多个或所有软件接收不到验证码1、开启过骚扰拦截、黑名单、信息拦截等功能:您可以尝试将骚扰拦截、黑名单、信息拦截等功能关闭,看看是否能够接收验证码。关闭黑名单、骚扰拦截:(1)ColorOS 11及以上系统机型:进入「信息>右上角“:”骚扰拦截>右上角“:”拦截规则」,进行设置。(2)ColorOS 11以下系统机型:进入「设置>安全>骚扰拦截>点击黑名单/信息拦截」,关闭黑名单、骚扰拦截。关闭免打扰:进入「设置>(声音与振动)>免打扰」,点击关闭。2、未开启骚扰拦截、黑名单、信息拦截等功能:如果您未办理过携号转网业务,建议您尝试换机、换卡测试,若确定是手机卡问题,建议您联系运营商处理。若是手机问题,建议您携带相关购机凭证前往就近的OPPO官方服务中心检测。3、若您近期内办理过运营商携号转网业务,短信功能需要一定的时间才可以激活生效,建议您咨询运营商确认具体的生效时间哦。