常见的网络攻击主要有xss攻击,csrf攻击和sql注入等。
一、XSS,即 Cross Site Script,中译是跨站脚本攻击。
XSS 攻击是指攻击者在网站上注入恶意的客户端代码,从而在用户使用浏览器进行访问时,获得用户隐私数据的一种行为。
XSS分为 反射型(非持久型)、存储型(持久型)和基于DOM
1.反射型
反射型 XSS 只是简单地把用户输入的数据 “反射” 给浏览器,这种攻击方式往往需要攻击者诱使用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。反射型XSS是一次性的。
比如,在静态页面a.html存在一个恶意链接 攻击者发个虚假中奖的email,诱使用户进入a.html点击这个恶意链接 然后跳转到攻击者的页面,在攻击者的页面执行攻击脚本。
2.存储型
存储型 XSS 会把用户输入的数据 "存储" 在服务器端,当浏览器请求数据时,脚本从服务器上传回并执行。这种 XSS 攻击具有很强的稳定性。
比较常见的一个场景是攻击者在社区或论坛、网站留言上写下一篇包含恶意 JavaScript 代码的文章或评论,文章或评论发表后,所有访问该文章或评论的用户,都会在他们的浏览器中执行这段恶意的 JavaScript 代码。
比如在某论坛的某个贴子下面添加如下评论
“写的不错”
3.基于DOM
只在客户端发生的攻击。 指客户端的恶意脚本可以修改dom,而不依赖于服务器端数据。
XSS的防御:
1.输入检查 对来自用户的输入进行检查,过滤,转义 包括限制用户输入的内容的长度,限制服务器端存储的内容的长度等。
2.输出检查
2.设置cookie的http-only 设置了cookie的http-only属性后,将无法通过js脚本获取cookie
二、csrf攻击,即跨站请求伪造
通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下的操作。
简单来说,就是利用用户保持的登录状态来发起攻击。
比如有一个不做csrf防护的网站A,一个危险的网站B,一次CSRF攻击的流程如下:
1.用户登录网站A,产生cookie。
2.用户在不登出网站A的情况下登入危险网站B
3.B在用户不知情的情况下携带用户的cookie要求访问网站A
4.B使用用户的身份信息登录了网站A
那么B网站要怎么在用户不知情的情况下访问网站A呢?
比如说 网站A的登录接口是一个GET接口,那么可以在B网站加入一个img标签,来进行访问,或者script标签也可以
如果该接口是一个POST接口,就不能通过img src、link href、script src等方式来发出请求。
而需要通过一个iframe,然后在iframe中添加一个表达来发起post请求。
CSRF的防范:
1.请求时附带验证信息。 服务器下发一个随机 Token,每次发起请求时将 Token 携带上,服务器验证 Token 是否有效。
2.禁止get请求更改数据(防止删除等恶意行为)
3.验证码 在一些需要登录的页面 加入验证码
4.referer http请求头有一个referer字段,它可以告诉服务器这个请求的来源页面 但是referer其实是不靠谱的,因为referer可以在客户端被篡改。
三、ssrf (Server-side Request Forge, 服务端请求伪造)。
一般的请求:客户端发起请求,服务器响应。
另外一种请求:客户端发起请求(向服务端提供一个URL),服务端向客户端提供的URL发起请求,然后把获得的响应内容返回给客户端。例如百度识图,谷歌翻译网页,都有用到这种请求。
SSRF的危害:
1) 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息
2) 攻击运行在内网或本地的应用程序(比如溢出)
3) 对内网web应用进行指纹识别,通过访问默认文件实现
4) 攻击内网的web应用,主要是使用GET参数就可以实现的攻击(比如struts2,sqli等)
5) 利用file协议读取本地文件等
其中最后一条的实现方式是用户输入 file://
本地文件协议地址,如果不做判断,程序很可能就会把本地文件读取出来返回给用户,例如 file:///etc/password
服务器系统密码
通用的解决方案:
1) 过滤返回信息。验证远程服务器对请求的响应是比较容易的方法。如果 web 应用是去获取某一种类型的文件,那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。比如请求的是一张图片,如果抓取回来的信息是一段文本,那就不返回。
2) 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态;
3) 禁用不需要的协议 只允许http,https协议(防止利用file协议读取本地文件)
4) 添加内网黑名单,白名单,对输入地址进行限制。
5) 限制端口,限制可以使用的端口为http,https常用的端口(443,80,8080,8090)
四、sql注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
如果后端直接拼接sql语句,那么会存在sql注入的问题
比如说 一个网站的登录表单 需要的登录信息是 用户名username 和 密码 password
后台的sql语句是 `select * from database where username=${username} and password = ${password}`;
这时你不知道用户名和密码 但是你可以在用户名输入 admin or 1 密码框输入 password or 1
这时的sql语句就变成了 select * from datebase where username = admin or 1 adn password = password or 1
等价于 select * from datebase
这样你即时不知道用户名和密码 也能登入这个系统
这只是一种简单的情形,sql注入的情景很多,sql注入的防御主要是在后端来做,我了解的不是很多。前端要做好的主要就是对用户的输入进行过滤。感兴趣的可以自己去了解下sql注入。