一、XSS (cross site script)跨站脚本攻击
首字母"X"是因为 CSS 会与层叠样式表的英文相同所以改用XSS简称。
(一)攻击方式
- 诱导链接(反射型攻击)
攻击方式: 简单的说比如诱导用户打开一个连接,通过连接携带参数可执行脚本,而攻击者知道我们的代码方式,在页面能够执行或渲染,伪造可执行代码窃取用户信息(cookie等本地存储的信息),
通过注入代码:
① 比如url访问 www.mydomain.com/ad?p=<script>alert(document.cookie)</script>
② 恰巧程序代码里面有使用这个p参数做代码执行或渲染,<script>alert(document.cookie)</script>, 此处关键代码是document.cookie, 攻击者可以在打开页面后,获取用户的cookie, 把cookie字符串提交到自己指定的服务器获得cookie数据。
2.表单提交数据库存储,直出渲染
web端通过表单元素输入可执行的脚本内容提交数据库存储。 前端与后端都“未做字符转义”的话,存储在数据的字符,在返回到html页面执行渲染时就会被执行,从而导致客户端用户本地数据泄露
(二)XSS (cross site script)跨站脚本防御
- CSP (Content-security-Policy) 网页安全政策, 白名单形式
设置content-security-policy的方式有两种:
(1) http header 属性 content-security-policy;
① 限制资源加载
content-security-policy:
script-src:外部脚本
style-src:样式表
img-src:图像
media-src:媒体文件(音频和视频)
font-src:字体文件
object-src:插件(比如 Flash)
child-src:框架
frame-ancestors:嵌入的外部资源(比如<frame>、<iframe>、<embed>和<applet>)
connect-src:HTTP 连接(通过 XHR、WebSockets、EventSource等)
worker-src:worker脚本
manifest-src:manifest 文件
default-src: 默认通用限制,比如'self' 限制网站本域名下的资源。 当指定了特殊类型限制后,会使用特殊的指定,比如img-src: https://www.otherdomian.com。
② Url 限制。 网页内的其它网页链接
frame-ancestors:限制嵌入框架的网页
base-uri:限制<base#href> 限制基准
form-action:限制<form#action> 限制表单提交
(2) <meta> 标签
<meta http-equiv="Content-security-policy" content="sth..." />
content内容与上面header部分设定一致。类型多个通过“;”分割,同一类型限制白名单内容通过空格分割。
- httponly cookie
设定浏览器客户端cookie不可访问,只可以被http服务器所读取,防止恶意脚本窃取可读cookie;在设置cookie时设置httponly - 转义字符
对输入文本、输出文本转义字符,避免执行渲染
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(///g, '/')
return str
}
对于特殊情况,比如富文本,需要正常输入、输出渲染的,可以过滤脚本代码 <script>为<script>
二、CSRF (跨站请求伪造)
跨站请求伪造,顾名思义是通过另外的站点伪造请求。
(一)攻击方式
比如访问了某个网站进行了登录A,此时cookie已经存在;然后被一种极具吸引力的图片或内容所吸引,点击进行了访问网站B,而在这个网站做了某些操作比如点击某个按钮或进入页面自动提交表单跳转到 你已登录的网站A页面,进行伪造请求。
攻击条件:
- cookie已产生
用户登录的网站A,本地产生了cookie - 网站未退出
既忙其他事情,或忘记突出登录,cookie依然存在且在有效期 - 网站A没有做CSRF防御
没有针对伪造请求做防御
(二)防御
- Header头信息的Referer属性检查
在某些关键步骤页面的请求增加request header的Referer检验是否是指定的域名页面地址 - 增加验证码或token校验比对
在关键步骤请求接口时增加验证码或token校验 - same site
在设置本地cookie时指定same site, 不随跨域请求携带cookie, 该属性浏览器支持度还不够
三、伪造网站点击
攻击者通过在自己做的网站引入iframe展示目标网站的形式来引诱用户点击。
(一)攻击方式
通过障眼法技术手段,在网站通过iframe展示目标网站, 在网站悬浮透明的遮罩层等,用户点击后是访问了攻击者准备的网站
(二)防御手段
- 服务器响应头设置X-FRAME-OPTIONS属性
通过设置response header的X-FRAME-OPTIONS来防御iframe嵌套网站。
X-FRAME-OPTIONS: DENY | SAMEORIGIN | ALLOW-FROM 三个可选值。
DENY 表示拒绝通过iframe展示。
SAMEORIGIN 表示同域名下允许iframe展示网站。
ALLOW-FROM http://www.mydomain.com;表示允许指定域名下iframe展示网站,多个域名逗号隔开。 - meta标签http-equiv
// meta 标签http-equiv, 强制当前窗口已独立页面显示,防止别人在框架里面引用页面
<meta http-equiv="Window-target" content="_top">
- javascript 脚本防御
对于一些很旧的浏览器,不能支持以上设置,通过js 脚本判断页面窗口是否是top是否是self本身。
代码:
<script>
// 如果自己不是顶部窗口,代表是在iframe内
if (self !== top) {
document.documentElement.style.display = 'none'
}
</script>
四、URL 跳转漏洞
通过一些网站内在实现的跳转url, 使用户访问到目标网站
(一)攻击方式
例如某个网站www.domain.com/link?url=xxxx, 黑客可以通过知名网站链接形式,做点击链接跳板最终跳到指定的网站
(二)防御
- referer 判断来源
- 生成的url 携带token, server 端验证 token ,来确定是不是自己生成的url,而非网站的程序
五、SQL注入
sql注入是攻击者利用sql语句的拼接执行代码的漏洞来做的攻击。
(一)攻击方式
- ' or 1=1, 比如用于某个查询语句 /:id/detail, 而sql语句(select * from order where id = 变量),而攻击者通过控制输入的变量, ' or 1=1 --, 此时为true,就可以使where语句后面代码失效,从而查询所有的订单
- ' -- , “--”为注释的意思,select * from user where username='admin' -- ' and psw='123456'
从-- 开始后面的都会被注释掉,从而可以查询user表为admin的用户信息
(二)防御 - 正则匹配校验是否符合预期
- 变量值过滤转换
- 预编译语句PreparedStatement ? 站位符
- 使用参数化接口方法语句
参考资料: