如图所示,我们注册了一个 的用户名,所有能看到此用户名字的页面,都会弹出当前浏览器的 Cookie,如果代码的逻辑是将 Cookie 发送到攻击者的网站,攻击者就能冒充当前用户进行登录了。
XSS 攻击方式有很多,所有和用户交互的地方,都有可能存在 XSS 攻击。例如:
所有 input 框。
window.location。
window.name。
document.referrer。
document.cookie。
localstorage。
...
由于页面中与用户交互的地方非常多,肯定还有一些 XSS 的攻击方式没有被发现,而一旦被黑帽子发现,就可能造成严重的影响,所以我们务必引起重视。
1)XSS 攻击影响
被 XSS 攻击成功后,攻击者就可以获取大量的用户信息,例如:
识别用户 UA。识别用户浏览器扩展。识别用户浏览过的网站。(通过 CSS 的 Visited 属性。)获取用户真实的 IP。(通过 WebRTC 等。)盗取 Cookie(伪造用户登录,窃取用户资料。)XSS 钓鱼。(向页面注入一个登录弹窗,让用户认为是网站内的登录弹窗(其实是钓鱼网站的),一旦用户登录,账号密码就泄露给了钓鱼网站。)
2)XSS 攻击防御
目前来说,XSS 已经得到了互联网行业的重视,许多开发框架都内置了安全的 HTML 渲染方法。
我们也可以自定义进行一些安全配置。
配置 HTTP 中的 http-only 头,让前端 JS 不能操作 Cookie。输入检查,在用户提交数据时,使用 XssFilter 过滤掉不安全的数据。输出检查,在页面渲染的时候,过滤掉危险的数据。
简单就是说需要:禁止js操作cookie、提交时检查html、输出时检查html(可以通过转码)
2、CSRF 攻击
CSRF(Cross-site request forgery)跨站请求伪造,是一种利用用户身份,执行一些用户非本意的操作。
比如:
用户先登录了服务器 B,然后去访问服务器 C。服务器 C 通过恶意脚本,冒充 A 去调用服务器 B 上的某个功能,对于服务器 B 来说,还以为这是 A 发起的请求,就当作正常请求处理了。
试想一下,如果 C 冒充 A 进行了一次转账,必定会造成大量的经济损失。
1)CSRF 防御方式
防御 CSRF 主要有以下几种方式:
a、验证码Referer 检查
每一次请求都要求用户验证,以确保请求真实可靠。即:利用恶意脚本不能识别复杂的验证码的特点,保证每次请求都是合法的。
b、Referer 检查
检查发起请求的服务器,是否为目标服务器。即:HTTP 请求中的 Referer 头传递了当前请求的域名,如果此域名是非法服务器的域名,则需要禁止访问。
c、Token
利用不可预测性原则,每一请求必须带上一段随机码,这段随机码由正常用户保存,黑帽子不知道随机码,也就无法冒充用户进行请求了。
(学习视频分享:php视频教程)
3、点击劫持
点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击。
就像一张图片上面铺了一层透明的纸一样,你看到的是攻击者的页面,但是其实这个页面只是在底部,而你真正点击的是被攻击者透明化的另一个网页。
1)点击劫持防御
由于点击劫持主要通过 iframe,所以在防御时,主要基于 iframe 去做。
方案一:frame busting
if (self !== top) { // 跳回原页面 top.location = self.location; }
正常网站使用 JS 脚本判断是否被恶意网站嵌入,如:博客网站监测到被一个 iframe 打开,自动跳转到正常的页面即可。
方案二:使用 HTTP 中的 x-frame-options 头,控制 iframe 的加载,它有 3 个值可选:
DENY,表示页面不允许通过 iframe 的方式展示。SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示。ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示。
配置 iframe 的 sandbox 属性:sandbox = "allow-same-origin" ,则只能加载与主站同域的资源。
(二)服务端攻击
服务器端的攻击的方式也非常多,这里列举几个常见的。
SQL 注入攻击文件上传漏洞登录认证攻击应用层拒绝服务攻击webServer 配置安全
1、SQL 注入攻击
SQL 注入和 XSS 一样,都是违背了数据和代码分离原则导致的攻击方式。
如图所示,我们利用 SQL 注入,就能在不需要密码的情况下,直接登录管理员的账号。
攻击的前提是:后端只用了简单的拼接 SQL 的方式去查询数据。
// 拼接出来的 sql 如下:select * from user where username = 'admin' or 1=1 and password = 'xxx' // 无论密码输入什么,这条 sql 语句都能查询到管理员的信息
除此之外,SQL 注入还有以下几种方式:
a、使用 SQL 探测,猜数据库表名,列名。
通过 MySQL 内置的 benchmark 探测数据库字段。如:一段伪代码 select database as current if current[0]==='a',benchmark(10000,'猜对了') 如果表明猜对了,就延迟 10 s 并返回成功。
b、使用存储过程执行系统命令
通过内置的方法或存储过程执行 shell 脚本。如:xp_cmdshell、sys_eval、sys_exec 等。
c、字符串截断
如:MySQL 在处理超长的字符串时,会显示警告,但会执行成功。注册一个 admin + 50 个空格的用户,会触发截断,最终新增一个 admin 用户,这样就能拥有管理员权限了。
1)SQL 注入防御
防止 SQL 注入的最好的办法就是,不要手动拼接 SQL 语句。
最佳方案,使用预编译语句绑定变量:通常是指框架提供的拼接 SQL 变量的方法。这样的语义不会发生改变,变量始终被当成变量。严格限制数据类型,如果注入了其他类型的数据,直接报错,不允许执行。使用安全的存储过程和系统函数。
2、CRLF 注入
在注入攻击中,换行符注入也是非常常见的一种攻击方式。
如果在 HTTP 请求头中注入 2 个换行符,会导致换行符后面的所有内容都被解析成请求实体部分。攻击者通常在 Set-Cookie 时,注入换行符,控制请求传递的内容。
3、文件上传漏洞
上传文件是网页开发中的一个常见功能,如果不加处理,很容易就会造成攻击。
通常有以下几种 DDOS 攻击方式:
SYN Flood 洪水攻击
利用 HTTP 3 次握手机制,消耗服务器连接资源。
如:攻击者发起大量的 HTTP 请求,但并不完成 3 次握手,而是只握手 2 次,这时服务器端会继续等待直至超时。这时的服务器会一直忙于处理大量的垃圾请求,而无暇顾及正常请求。
Slowloris 攻击
以非常低的速度发送 HTTP 请求头,消耗服务器连接资源。
如:攻击者发送大量 HTTP 请求,但每个请求头都发的很慢,每隔 10s 发送一个字符,服务器为了等待数据,不得始终保持连接,这样一来,服务器连接数很快就被占光了。
HTTP POST DOS
发送 HTTP 时,指定一个非常大的 Content-Length 然后以很长的间隔发送,消耗服务器连接资源。
CC 攻击
针对一些非常消耗资源的页面,不断发起请求。
如:页面中的某些页面,需要后端做大量的运算,或者需要做非常耗时的数据库查询。在大量的请求下,服务器的 CPU、内存等资源可能就被占光了。
Server Limit DOS
通过 XSS 注入一段超长的 Cookie,导致超出 Web 服务器所能承受的 Request Header 长度,服务器端就会拒绝此服务。
ReDOS
针对一些缺陷的正则表达式,发起大量请求,耗光系统资源。
1)应用层拒绝服务攻击防御
对于应用层拒绝服务攻击,目前也没有特别完美的解决方案,不过我们还是可以进行一些优化。
应用代码做好性能优化合理使用 Redis、Memcache 等缓存方案,减少 CPU 资源使用率。网络架构上做好优化后端搭建负载均衡。静态资源使用 CDN 进行管理。限制请求频率服务器计算所有 IP 地址的请求频率,筛选出异常的 IP 进行禁用。可以使用 LRU 算法,缓存前 1000 条请求的 IP,如果有 IP 请求频率过高,就进行禁用。
其实,处理 DDOS 核心思路就是禁用不可信任的用户,确保资源都是被正常的用户所使用。
三、WebServer 配置安全
我们在部署 web 应用的时候,经常会用到 Nginx、Apache、IIS、Tomcat、Jboss 等 Web 服务器,这些服务器本身也存在一些安全隐患,如果配置不当,很容易收到攻击。
在配置 Web 服务器时,可以参考以下几点:
1、以用户权限运行 Web 服务器
遵守最小权限原则,以最小权限身份运行 Web 服务器,限制被入侵后的权限。
2、删除可视化后台
运行 Tomcat、Jboss 等 Web 服务器时,默认会开启一个可视化的运营后台,运行在 8080 端口,并且第一次访问是没有认证的。
攻击者可以利用可视化后台,远程加载一段 war 包或者上传木马文件,进行控制,所以我们需要删除可视化平台。
3、及时更新版本
主流的 Web 服务器,每隔一段时间就会修复一些漏洞,所以记得及时更新版本。