【奇安信安全漏洞】XSS漏洞 重定向漏洞解决及产生分析!_奇安信漏洞

本文介绍了DOM型XSS攻击的原理,强调了客户端JavaScript代码对HTML页面重构的潜在风险,重点讲述了如何通过filterForDOMXSS函数对客户端获取的数据进行校验,以防止此类攻击。
摘要由CSDN通过智能技术生成

DOM常用来表示在HTML和XML中的对象。DOM可以允许程序动态的访问和更新文档的内容、结构等。客户端JavaScript可以访问浏览器的文档对象模型。也就是说,通过JavaScript代码控制DOM节点就可以不经过服务器端的参与重构HTML页面。

该类攻击是反射型XSS的变种。它通常是由于客户端接收到的脚本代码存在逻辑错误或者使用不当导致的。比如Javascript代码不正确地使用各种DOM方法(如document.write)和Javascript内部函数(如eval函数),动态拼接HTML代码和脚本代码就容易引发DOM型的跨站脚本攻击。

因此,DOM型XSS与前面两种XSS的区别就在于DOM型XSS攻击的代码不需要与服务器端进行交互,DOM型XSS的触发基于浏览器端对DOM数据的解析来完成,也就是完全是客户端的事情。

应用程序的客户端代码从javaScript、document.location、request url、document.url、document.referrer。。或者其他任何攻击者可以修改的浏览器对象获取数据、如果未验证数据是否存在恶意代码的情况下,就将其动态的更新到页面的DOM节点,应用程序将易于收到基于DOM的XSS攻击。

解决办法:

既然都明确说明了是从客户端获取的数据,需要校验后才可以使用,那思路就清晰了。如何校验呢?也并不是简单的校验字符而已!

示例:

//客户端获取值
var actionValue = $("#action").val();
//filterForDOMXSS函数用来过滤值
var modeFlag = 0
var sanitizedActionValue = filterForDOMXSS(actionValue,modeFlag);
var encodedActionValue = sanitizedActionValue.value;
var url = "../../../ReportAction.do?action=" + encodedActionValue;
window.location.href = url;


//此函数用来自定义校验获取到的值的内容
function filterForDOMXSS(value,modeFlag) {
  var searchStatus = false;
        // 过滤关键词,后续可以继续加
        var crucialword = ['javascript',"eval","alert","onclick","ondbclick","onmousedown","onmouseup","onmouseover","onmouseout","onmousemove","onkeydown","onkeyup","onkeypress","<script+.*>","<p+.*>","<a+.*>","<img+.*>","<h+.*>","<textarea+.*>","<span+.*>","<div+.*>","<td+.*>","<tr+.*>","<th+.*>","<li+.*>","<ul+.*>","<option+.*>","<select+.*>","<del+.*>","<ol+.*>","<label+.*>","<button+.*>","<style+.*>","<em+.*>","<strong+.*>","<strike+.*>","<b+.*>","<s+.*>","<u+.*>","<sub+.*>","<sup+.*>","<small+.*>","<dl+.*>","<dt+.*>","<i+.*>","<pre+.*>","<q+.*>","<blockquote+.*>","<br+.*>","<code+.*>","<cite+.*>","\\$\\(+.*\\)"];
        for(var i = 0;i<crucialword.length;i++){
            var check = new RegExp(crucialword[i],"gi");
            if(check.exec(value)){
                searchStatus = true;
                break;
            }
        }
        if(searchStatus){
            value = value.replace(/javascript/gi,"")
            .replace(/eval/gi,"")
            .replace(/alert/gi,"")
            .replace(/onclick/gi,"")
            .replace(/ondbclick/gi,"")
            .replace(/onmousedown/gi,"")
            .replace(/onmouseup/gi,"")
            .replace(/onmouseover/gi,"")
            .replace(/onmouseout/gi,"")
            .replace(/onmousemove/gi,"")
            .replace(/onkeydown/gi,"")
            .replace(/onkeyup/gi,"")
            .replace(/onkeypress/gi,"")
            // 仅过滤标签模式
            if(modeFlag == 0){
                value = value.replace(/<script+.*>/gi,"")
                .replace(/<p+.*>/gi,"")
                .replace(/<a+.*>/gi,"")
                .replace(/<img+.*>/gi,"")
                .replace(/<h+.*>/gi,"")
                .replace(/<textarea+.*>/gi,"")
                .replace(/<span+.*>/gi,"")
                .replace(/<div+.*>/gi,"")
                .replace(/<td+.*>/gi,"")
                .replace(/<tr+.*>/gi,"")
                .replace(/<th+.*>/gi,"")
                .replace(/<li+.*>/gi,"")
                .replace(/<ul+.*>/gi,"")
                .replace(/<option+.*>/gi,"")
                .replace(/<select+.*>/gi,"")
                .replace(/<del+.*>/gi,"")
                .replace(/<ol+.*>/gi,"")
                .replace(/<label+.*>/gi,"")
                .replace(/<button+.*>/gi,"")
                .replace(/<style+.*>/gi,"")
                .replace(/<em+.*>/gi,"")
                .replace(/<strong+.*>/gi,"")
                .replace(/<strike+.*>/gi,"")
                .replace(/<sub+.*>/gi,"")
                .replace(/<sup+.*>/gi,"")
                .replace(/<small+.*>/gi,"")
                .replace(/<dl+.*>/gi,"")
                .replace(/<dt+.*>/gi,"")
                .replace(/<i+.*>/gi,"")
                .replace(/<pre+.*>/gi,"")
                .replace(/<q+.*>/gi,"")
                .replace(/<blockquote+.*>/gi,"")
                .replace(/<br+.*>/gi,"")
                .replace(/<code+.*>/gi,"")
                .replace(/<cite+.*>/gi,"")
            }else if(modeFlag == 1){
                // 过滤符号模式
                value = value.replace(/</g,"")
                .replace(/&lt;/g,"")
                .replace(/gt&;/gi,"")
                .replace(/\$\(\)/g,"");
            }else if(modeFlag ==2){
                // 全过滤模式,不推荐使用
                value = value.replace(/<\w+.*>/g,"");
            }
            return {"value":value,"status":searchStatus,"Message":"系统监测到有恶意代码输入,请注意您的行为"}
        }else{
            return{"value":value,"status":searchStatus,"Message":""}
        }

在上述修复代码中,我们引入了一个名为filterForDOMXSS()的函数,用于对输入值进行清理和验证。这个函数可以执行以下操作:

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的修复输入验证和文件上传漏洞的示例代码: 1. 输入验证漏洞修复: ```php function validate_input($input) { // 检查输入是否为空 if (empty($input)) { return false; } // 检查输入是否包含非法字符 if (preg_match('/[\'^£$%&*()}{@#~?><>,|=_+¬-]/', $input)) { return false; } // 使用过滤器对输入进行验证 $filtered_input = filter_var($input, FILTER_SANITIZE_STRING); if ($filtered_input !== $input) { return false; } // 检查输入是否符合预期格式 // ... return true; } ``` 上述代码中,我们使用了 PHP 内置的过滤器函数 `filter_var` 来过滤输入中的非法字符,以避免 XSS 攻击等安全漏洞。 2. 文件上传漏洞修复: ```php function upload_file($file) { // 检查文件是否为空 if (empty($file)) { return false; } // 检查文件类型是否符合预期 $allowed_types = array('jpg', 'jpeg', 'png', 'gif'); $file_type = pathinfo($file['name'], PATHINFO_EXTENSION); if (!in_array($file_type, $allowed_types)) { return false; } // 检查文件大小是否符合预期 $max_size = 1024 * 1024; // 1MB if ($file['size'] > $max_size) { return false; } // 检查上传文件的 MIME 类型是否符合预期 $finfo = finfo_open(FILEINFO_MIME_TYPE); $file_mime_type = finfo_file($finfo, $file['tmp_name']); if (!in_array($file_mime_type, $allowed_types)) { return false; } finfo_close($finfo); // 为上传文件生成新的文件名,并存储到安全目录 $new_file_name = uniqid() . '.' . $file_type; $upload_dir = '/path/to/secure/upload/dir/'; if (!move_uploaded_file($file['tmp_name'], $upload_dir . $new_file_name)) { return false; } return true; } ``` 上述代码中,我们使用了 PHP 内置的函数 `finfo` 来检查上传文件的 MIME 类型,以避免文件头伪造等安全漏洞。同时,我们还对上传文件保存的位置进行了限制,以确保文件存储在安全的目录中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值