应用开发漏洞

这里主要针对于基于基础框架使用的开源组件所发现的漏洞提供修复方案。

Apache Shiro 权限绕过漏洞

近日, Apache 官方披露一则 Apache Shiro 权限绕过漏洞,漏洞编号为: CVE-2022-32532。漏洞表示:在 Shiro 1.9.1 之前版本代码中使用了 RegExPatternMatcher 和正则表达式的情况下可能存在权限绕过

漏洞等级:严重

影响组件:org.apache.shiro:shiro-spring-boot-starter

影响版本: Apache Shiro ≤ 1.9.0

修复方案

  • 基础框架修复 (基于waf-parent 进行开发的)
<!-- 方式一:waf-parent 版本升级到 2.2.12-SNAPSHOT 及以上-->

<!-- 方式二:2.2.12-SNAPSHOT 以下版本(2.1.0、1.2.1.RELEASE 等版本均需要修复)-->
<!-- 在相关parent的pom.xml中的properties指定最新的版本(目前最新1.9.1)-->
<properties>
    <shiro.version>1.9.1</shiro.version>
</properties>
  • 自定义开发框架

升级至最新安全版本:https://shiro.apache.org/download.html

参考

https://nosec.org/home/detail/5020.html

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-32532

fastjson存在反序列化漏洞

2022年5月23日,国家网络与信息安全信息通报中心监测发现,阿里巴巴公司开源Java开发组件fastjson存在反序列化漏洞。fastjson被众多java软件作为组件集成,广泛存在于java应用的服务端代码中。攻击者可利用上述漏洞实施任意文件写入、服务端请求伪造等攻击行为,造成服务器权限被窃取、敏感信息泄露等严重影响。

漏洞等级:严重

影响组件:com.alibaba:fastjson

影响版本:fastjson <= 1.2.80

修复方案

升级fastjson注意测试一下使用的功能是否有问题,再发布到生产环境。

  • 基础框架修复 (基于waf-parent 进行开发的)
<!-- 方式一:waf-parent 版本升级到 2.2.0-SNAPSHOT 及以上-->

<!-- 方式二:2.2.0-SNAPSHOT 以下版本(2.1.0、1.2.1.RELEASE 等版本均需要修复)-->
<!-- 在相关parent的pom.xml中的properties指定最新的版本(目前最新2.0.4)-->
<properties>
    <fastjson.version>2.0.4</fastjson.version>
</properties>

1653384589472

  • 自定义开发框架

参考官方修复建议:https://github.com/alibaba/fastjson/wiki/security_update_20220523在新窗口打开

XSS攻击防范

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。

在Vue前端展现时主要是在使用了v-html标签时,会存在直接执行脚本的情况。

XSS常规攻击场景

<!-- 通过直接调用api,把这么一段写入消息内容中 -->
<img src="http://www.xxx.com" onerror='javascript:alert("Hello world!")'>

1597721306016

当这脚本能正常执行,就可以注入其他内容来获取更多用户信息,发送到恶意网站,基础框架针对XSS防范主要分后端防护与前端防护。

后端防护

对于输入的内容在前端如果通过v-html输出时,就需要考虑转码,可以参考下列脚本

// 通过 org.springframework.web.util.HtmlUtils 进行转码
String html="<img src=\"http://www.xxx.com\" onerror=\"alert(1)\">";
String htmlEscape = HtmlUtils.htmlEscape(html);
// 转码后的内容
// &#39;&lt;img src=&quot;http://www.xxx.com&quot; onerror=&quot;alert(1)&quot;&gt;&#39; &lt;p&gt;&lt;strong&gt;ssss2222&lt;/strong&gt;&lt;/p&gt;

前端防护

在不能百分百保证所有输入的内容做过转码或者有些内容本来就需要以html的形式来展现,如发布的新闻通告之类的内容,这时在前端加一个对v-html标签进行拦截通过xss组件过滤,实现xss的攻击防范。

通过v-html标签渲染的内容,在前端如果实现了xss拦截过滤,后端可以不做转码。

# 安装xss包
npm install xss

# 引入xss包并挂载到vue原型上
import xss from 'xss'
Vue.prototype.xss = xss
// 在vue.config.js中覆写html指令
chainWebpack: config => {
    config.module
        .rule("vue")
        .use("vue-loader")
        .loader("vue-loader")
        .tap(options => {
            options.compilerOptions.directives = {
                html(node, directiveMeta) {
                    (node.props || (node.props = [])).push({
                        name: "innerHTML",
                        value: `xss(_s(${directiveMeta.value}))`
                    });
                }
            };
            return options;
        });
}

这样在源码层面就移除了脚本

1597722157883

X-Frame-Options(点击劫持)

点击劫持(ClickJacking)是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。

测试场景

本地新建测试文件. iframe.html, 双击文件浏览器打开, 能正常访问页面

<!DOCTYPE html>
<html>
<head lang="zh">
 <meta charset="UTF-8">
 <title>点击劫持测试</title>
</head>
<body>
 <iframe width="100%" height="700" frameborder="10" 
 src="http://xxx/xxx">
 </iframe>
</body>
</html>

修复方案

以前端vue项目为例

vue项目的nginx配置文件. 添加响应头, 可选参数: DENY;SAMEORIGIN ;ALLOW-FROM

  • DENY: 禁止嵌套
  • SAMEORIGIN: 允许同域名嵌套
  • ALLOW-FROM: 指定来源 如 add_header X-Frame-Options "ALLOW-FROM "; 大多数浏览器里面是无法兼容的,也就是意味着配置是无法生效,没有任何作用的
add_header X-Frame-Options DENY;
server {
    listen       80;
    server_name  localhost;
    server_tokens off;
    location / {
        if ($request_filename ~ .*\.(htm|html)$){
                add_header Cache-Control "no-cache, no-store";
                add_header X-Frame-Options DENY;
        }
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /xxxxxx/index.html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
上次更新:
编辑者: 李贤伟, 黄笑寒