参考:
XSS
cross-site script.跨站脚本,XSS。
浏览器端运行非法的 HTMl 或 script 标签进行的一种攻击。
可能造成的影响:
- 利用虚假输入表单骗取用户个人信息
- 利用脚本窃取用户的 Cookie 值,帮助攻击者发起恶意请求
- 显示伪造的文章或图片
原理:恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。
分类:
-
非持久性XSS。通过发送恶意脚本代码参数的URL,URL地址被打开的时候,特有的恶意代码参数被解析执行。
特点:
- 不经过服务器存储,直接通过Http的get或者post就能发起
- 需要诱骗点击之后发生
- 可以通过document.cookie等方式获取到敏感信息
防止:
-
Web渲染的所有内容和数据都必须来自服务端
-
不要从
URL
,document.referrer
,document.forms
等DOMAPI直接获取数据渲染。 -
不要使用
eval
,document.write()
,innerHTML
,document.createElement()
等可执行字符串的方式 -
对字段做
encodeURI
处理转义的目的是将一些构成 HTML 标签的元素转义,比如
<
,>
,空格
等,转义成<
,>
,
-
持久性XSS(存储性XSS)
一般用于表单提交的功能,利用XSS将代码内容注入数据库持久存储,前端页面获得从数据库中读出的注入代码时,将其渲染执行。
需要条件:
- post请求提交表单后段没有转义直接入库,返回时也没做转义
- 前端获取到数据没做转义直接渲染成DOM
特点:
- 持久性,植入在数据库中
- 盗取信息,危害面广
XSS 防御
-
Content-Security-Policy 。通过配置规则,明确告诉浏览器哪些外部资源可以加载和执行。(CSP)
- 设置 HTTP Header 中的 Content-Security-Policy
- 设置 meta 标签的方式
例子:
- 只允许加载本站资源:
Content-Security-Policy: default-src 'self'
- 只允许加载 HTTPS 协议图片:
Content-Security-Policy: img-src https://*
- 允许加载任何来源:
Content-Security-Policy: child-src 'none'
-
转义字符。对于输入输出的内容进行转义,引号,尖括号斜杠这些。何内容写到页面之前都必须加以
encode
,避免把html tag
弄出来。 -
HttpOnly Cookie,预防XSS攻击窃取用户cookie最有效的防御手段。设置了 HttpOnly 属性的 cookie 不能使用 JavaScript 经由
Document.cookie
属性、XMLHttpRequest
和Request
APIs 进行访问。
CSRF
Cross site Request Forgery,跨站请求伪造。利用用户已登录的身份,在用户不知情的情况下,以用户名义完成非法操作。
完成CSRF攻击需要的条件:
- 用户登录A站点,在本地记录了cookie
- 没有登出A站点,即Cookie生效的情况下,访问了恶意攻击提供的危险站点B(B要求访问A)
- 站点A没有做CSRF防御
CSRF 防御
- sameSite,对Cookie设置sameSite属性,表示Cookie不随着跨域请求发送,可以减少CSRF攻击。(该属性不兼容所有浏览器)
- Referer Check,Referer信息告诉服务器是从哪个页面链接过来的,通过检查http包头referer的值是不是这个页面,来判断是不是CSRF攻击
- Anti-SCRF-Token。请求时在HTTP 请求中以参数的形式加入一个随机产生的token,服务器建立一个拦截器来验证这个token,会进行校验该请求当中的token和cookie当中的token值是否都存在且相等,才认为这是合法的请求。
- 验证码。核心步骤增加验证码,增加验证码实际上就是添加了一个请求参数。
- 对Cookie设置HttpOnly。
SQL 注入
就是通过把 SQL
命令插入到 Web
表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL
命令。
例如,我们之前预想的SQL 语句是:
SELECT * FROM user WHERE username='admin' AND psw='password'
然后,恶意攻击者输入的用户名是
admin' --
结果 SQL 语句变成了如下形式:
SELECT * FROM user WHERE username='admin' --' AND psw='xxxx'
在 SQL 中,
' --
是闭合和注释的意思,-- 是注释后面的内容的意思,所以查询语句就变成了:SELECT * FROM user WHERE username='admin'
然后密码随意输入都可以,就可以登入系统了,这就是一个SQL注入
包含以下过程:
- 获取用户请求参数
- 拼接到代码当中
- SQL语句按照我们构造参数的语义执行成功
SQL 注入的本质是数据和代码未分离,数据当作代码来执行。
危害:
- 获取数据库信息
- 获取服务器权限,读取敏感文件
SQL注入防御
- 严格控制Web应用的数据库操作权限
- 后端代码检查输入的数据是否符合预期
- 对进入数据库的特殊字符转义
- 不要使用拼接SQL语句,使用数据库提供的参数化查询接口
点击劫持
本质上是一种视觉欺骗。将需要攻击的网站内嵌到自己的网页中,将iframe设置为透明,再透出一个按钮诱导点击。
特点:
- 隐蔽性高,骗取用户操作
- UI-覆盖
原理:登录A网站后,被诱导打开第三方的网站,第三方的网站通过 iframe 引入了A网站页面的内容,在第三方的网站点击某个按钮,实际上触发的是A网站的按钮。
例如:在已经登录的网站,诱导点击某按钮,可能实际上就是关注了某人。
点击劫持防御
-
X-FRAME-OPTIONS。是一个HTTP响应头,可以设置不同的值防御 iframe 的嵌套劫持点击。
- DENY 页面不允许通过 iframe 的方式现实
- SAMEORIGIN,页面可以在相同域名下通过 iframe 显示。
- ALLOW-FAROM,页面可以在任意来源的 iframe 中显示。
-
JS 手动防御,当通过 iframe 的方式加载页面的时候,直接不显示任何内容。(window.self)
if (self != top) { alert('在iframe中'); }
<hr/ >
URL 跳转漏洞
借助未验证的URL跳转,将应用引导到不安全的第三方区域,导致的安全问题。
其原理是构建恶意链接(链接需要进行伪装,尽可能迷惑),发在QQ群或者是浏览量多的贴吧/论坛中。安全意识低的用户点击后,经过服务器或者浏览器解析后,跳到恶意的网站中。
如:
http://gate.baidu.com/index?act=go&url=http://t.cn/RVTatrd
http://qt.qq.com/safecheck.html?flag=1&url=http://t.cn/RVTatrd
实现方式:
- Header头跳转
- JavaScript跳转
- META标签跳转
URL跳转漏洞防御
- Referer,确定URL参数进入的来源,避免用户自己生成跳转链接
- 验证Token。在生成的链接里加入用户不可控的Token对生成的链接进行校验
OS命令注入攻击
SQL注入是针对数据库的,而OS命令注入则是针对操作系统的。OS命令通过Web应用,执行非法的操作系统命令达到攻击的目的。
命令注入可以向shell发送命令,让Windows或者Linux系统的命令行启动程序。通过命令注入可执行系统上安装的各种程序。
例子:
// 以 Node.js 为例,假如在接口中需要从 github 下载用户指定的 repo
const exec = require('mz/child_process').exec;
let params = {/* 用户输入的参数 */};
exec(`git clone ${params.repo} /some/path`);
如果 params.repo 传入的是 https://github.com/admin/admin.github.io.git 确实能从指定的 git repo 上下载到想要的代码。
但是如果 params.repo 传入的是 https://github.com/xx/xx.git && rm -rf /* && 恰好你的服务是用 root 权限起的就糟糕了。
OS命令注入防御
- 对前端提交内容规则限制
- 调用系统命令前对传入参数进行命令行参数转义过滤
- 不要直接拼接命令语句,借助工具做拼接和转移预处理
<hr/ >
扩展:DDoS
Distributed Denial of Service,分布式拒绝服务。利用大量的请求造成资源过载,导致服务不可用。
其原理都是造成资源过载,导致服务不可用
网络层DDoS和应用层DDos