文章来源:web 应用常见安全漏洞一览 (opens new window)
# SQL注入
SQL注入攻击的核心在于通过给Web应用接口传入一些特殊字符,让Web服务器执行攻击者期望的SQL语句,以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等操作,达到欺骗服务器执行恶意的SQL命令。
SQL注入漏洞属于后端的范畴,但前端也可做体验上的优化。
而如何让Web服务器执行攻击者的SQL语句呢?SQL注入的常规套路在于将SQL语句放置于Form表单或请求参数之中提交到后端服务器,后端服务器如果未做输入安全校验,直接将变量取出进行SQL拼接,数据库查询。
# SQL注入的危害
如果网站存在SQL注入漏洞,相当于将数据库直接暴露在攻击者面前,可想而知危害会有多大了。攻击者利用SQL注入漏洞能实现以下攻击:
- 跳过账户权限验证达到越权。
- 获取数据库关键信息从而进行脱库。
- 在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。
# SQL注入防御方法
数据校验
- 检查输入的数据是否具有所期望的数据格式。
- 使用数据库特定的敏感字符转义函数把用户提交上来的非数字数据进行转义。
数据库权限控制:严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。
日志处理:当数据库操作失败的时候,尽量不要将原始错误日志返回,比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。
# XSS攻击
XSS全称跨站脚本攻击(Cross Site Scripting),为了与重叠样式表CSS区分,换了另一个缩写XSS。简单的说就是攻击者通过在目标网站上注入恶意脚本并运行,获取用户的敏感信息如Cookie、SessionID等,影响网站与用户数据安全。XSS攻击更偏向前端的范畴,但后端在保存数据的时候也需要对数据进行安全过滤。
XSS攻击可以分为3类:存储型(持久型)、反射型(非持久型)、DOM型。
- 存储型:注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。
- 反射型:当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等返回到用户的浏览器上。由于浏览器认为这个响应来自"可信任"的服务器,所以会执行这段脚本。
- 基于DOM的XSS:通过修改原始的客户端代码,受害者浏览器的DOM环境改变,导致有效载荷的执行。也就是说,页面本身并没有变化,但由于DOM环境被恶意修改,有客户端代码被包含进了页面,并且意外执行。
XSS攻击的核心是将可执行的前端脚本代码(一般为JavaScript)植入到网页中,并且浏览器执行了这些代码。常见手段:
- 在HTML中内嵌的文本中,恶意内容以script标签形成注入。
- 在内联的JavaScript中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
- 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
- 在标签的href、src等属性中,包含
javascript:等可执行代码。 - 在
onload、onerror、onclick等事件中,注入不受控制代码。 - 在style属性和标签中,包含类似
background-image:url("javascript:...");的代码(新版本浏览器已经可以防范)。 - 在style属性和标签中,包含类似
expression(...)的CSS表达式代码(新版本浏览器已经可以防范)。
# XSS攻击预防
输入过滤
- 前端输入过滤,但并不可靠,一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。
- 后端保存时过滤,例如
<被转义成<,再次返回给前端时,如果用做html显示则可以显示成箭头,如果只是普通显示或者Vue里面的模板语法也不能满足预期,并且不能正确计算字符串长度
所以,输入过滤能够在某些情况下解决特定的XSS问题,但会引入很大的不确定性和乱码问题。在防范XSS攻击时应避免此类方法。
改成纯前端渲染,把代码和数据分隔开。
在纯前端渲染中,我们会明确的告诉浏览器:下面要设置的内容是文本(
.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。对HTML做充分转义。可借助第三方工具,例如xss (opens new window)
预防DOM型XSS攻击
- 在使用
.innerHTML、.outerHTML、document.write()时要特别小心,不要把不可信的数据作为HTML插到页面上,而应尽量使用.textContent、.setAttribute()等。 - DOM中的内联事件监听器,如
location、onclick、onerror、onload、onmouseover等,<a>标签的href属性,JavaScript的eval()、setTimeout()、setInterval()等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些API,很容易产生安全隐患,请务必避免。所以应避免内联事件。
- 在使用
严格的CSP(Content Security Policy)
- 禁止加载外域代码,防止复杂的攻击逻辑。
- 禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
- 禁止内联脚本执行(规则较严格,目前发现GitHub使用)。
- 禁止未授权的脚本执行(新特性,Google Map移动版在使用)。
- 合理使用上报可以及时发现XSS,利于尽快修复问题。
输入内容长度控制
对于不受信任的输入,都应该限定一个合理的长度。虽然无法完全防止XSS发生,但可以增加XSS攻击的难度。
其他安全措施
- HttpOnly Cookie: 禁止JavaScript读取某些敏感Cookie,攻击者完成XSS注入后也无法窃取此Cookie。
- 验证码:防止脚本冒充用户提交危险操作。
# CSRF攻击
CSRF攻击全称跨站请求伪造(Cross-site Request Forgery):攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
一个典型的 CSRF 攻击有着如下的流程:
- 受害者登录
a.com,并保留了登录凭证(Cookie)。 - 攻击者引诱受害者访问了
b.com。 b.com向a.com发送了一个请求:a.com/act=xx(浏览器会默认携带a.com的Cookie)。a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。a.com以受害者的名义执行了act=xx。- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让
a.com执行了自己定义的操作。
# CSRF攻击防御策略
CSRF自动防御策略:同源检测(Origin和Referer验证)。
CSRF主动防御措施:Token验证(每个请求接口都带Token)或者双重Cookie验证以及配合Samesite Cookie。
双重Cookie
- 在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串。
- 在前端向后端发起请求时,取出Cookie,并添加到URL的参数中。
- 后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。
保证页面的幂等性,后端接口不要在GET页面中做用户操作。
# DDoS攻击
DoS攻击全称拒绝服务(Denial of Service),简单的说就是让一个公开网站无法访问,而DDoS攻击(分布式拒绝服务Distributed Denial of Service)是DoS的升级版。
- 攻击者不断地提出服务请求,让合法用户的请求无法及时处理,这就是DoS攻击。
- 攻击者使用多台计算机或者计算机集群进行DoS攻击,就是DDoS攻击。
像常见的:
- Web服务
- 邮件服务
- 短信服务
- DNS服务
- 即时通讯服务
- TCP连接,SSL连接
# DDos攻击防御策略
- 设置高性能设备
- 保证带宽
- 限流,限制单个用户的流量(包括 IP 等)
- 异常流量的清洗:通过DDoS硬件防火墙对异常流量的清洗过滤,通过数据包的规则过滤、数据流指纹检测过滤、及数据包内容定制过滤等顶尖技术能准确判断外来访问流量是否正常,进一步将异常流量禁止过滤。
- 考虑把网站做成静态页面
- 分布式集群防御:这是目前网络安全界防御大规模DDoS攻击的最有效办法。分布式集群防御的特点是在每个节点服务器配置多个IP地址,并且每个节点能承受不低于10G的DDoS攻击,如一个节点受攻击无法提供服务,系统将会根据优先级设置自动切换另一个节点,并将攻击者的数据包全部返回发送点,使攻击源成为瘫痪状态,从更为深度的安全防护角度去影响企业的安全执行决策。
- IP轮询技术:系统通过IP轮询机制,将从IP池中灵活调取一个新的IP充当业务IP,使攻击者失去攻击目标,以此保证业务在DDoS的攻击下正常运转。
- BGP高防IP
- 运营商过滤:针对反射放大类攻击,都有相同的特点,可以直接在运营商侧进行过滤,不用将流量流入抗D设备,从而使防御与反射放大类压制更有效果。
- 流量预压制:流量预压制/UDP 预压制等能力,从容应对新型的超大流量攻击。
# XEE漏洞
XXE漏洞全称XML外部实体漏洞(XML External Entity),当应用程序解析XML输入时,如果没有禁止外部实体的加载,导致可加载恶意外部文件和代码,就会造成任意文件读取、命令执行、内网端口扫描、攻击内网网站等攻击。
这个只在能够接收XML格式参数的接口才会出现。
解决方案
- 禁用外部实体
- 过滤用户提交的XML数据
# DNS劫持
DNS提供服务用来将域名转换成IP地址,然而在早期协议的设计中并没有太多考虑其安全性,对于查询方来说:
- 我去请求的真的是一个DNS服务器吗?是不是别人冒充的?
- 查询的结果有没有被人篡改过?这个IP真是这个网站的吗?
DNS协议中没有机制去保证能回答这些问题,因此DNS劫持现象非常泛滥,从用户在地址栏输入一个域名的那一刻起,一路上的凶险防不胜防:
- 本地计算机中的木马修改hosts文件
- 本地计算机中的木马修改DNS数据包中的应答
- 网络中的节点(如路由器)修改DNS数据包中的应答
- 网络中的节点(如运营商)修改DNS数据包中的应答
后来,为了在客户端对收到对DNS应答进行校验,出现了DNSSEC技术,一定程度上可以解决上面的部分问题。但限于一些方面的原因,这项技术并没有大规模用起来,尤其在国内,鲜有部署应用。
再后来,以阿里、腾讯等头部互联网厂商开始推出了httpDNS服务,来了一招釜底抽薪,虽然这项技术的名字中还有DNS三个字母,但实现上和原来但DNS已经是天差地别,通过这项技术让DNS变成了在http协议之上的一个应用服务。
# JSON劫持
JSON劫持(JSON Hijacking)是用于获取敏感数据的一种攻击方式,属于CSRF攻击的范畴。
JSON是一种轻量级的数据交换格式,而劫持就是对数据进行窃取(或者应该称为打劫、拦截比较合适。恶意攻击者通过某些特定的手段,将本应该返回给用户的JSON数据进行拦截,转而将数据发送回给恶意攻击者,这就是JSON劫持的大概含义。一般来说进行劫持的JSON数据都是包含敏感信息或者有价值的数据。
解决方案
X-Requested-With标识- 浏览器JSON数据识别
- 禁止Javascript执行JSON数据
# 暴力破解
这个一般针对密码而言,弱密码(Weak Password)很容易被别人(对你很了解的人等)猜到或被破解工具暴力破解。
解决方案
- 密码复杂度要足够大,也要足够隐蔽
- 限制尝试次数
# HTTP报头追踪漏洞
HTTP/1.1(RFC2616)规范定义了 HTTP TRACE方法,主要是用于客户端通过向Web服务器提交TRACE请求来进行测试或获得诊断信息。
当 Web 服务器启用 TRACE 时,提交的请求头会在服务器响应的内容(Body)中完整的返回,其中 HTTP 头很可能包括 Session Token、Cookies 或其它认证信息。攻击者可以利用此漏洞来欺骗合法用户并得到他们的私人信息。
解决方案:
- 禁用HTTP TRACE方法。
# 信息泄露
由于 Web 服务器或应用程序没有正确处理一些特殊请求,泄露 Web 服务器的一些敏感信息,如用户名、密码、源代码、服务器信息、配置信息等。
所以一般需注意:
- 应用程序报错时,不对外产生调试信息
- 过滤用户提交的数据与特殊字符
- 保证源代码、服务器配置的安全
# 目录遍历漏洞
攻击者向Web服务器发送请求,通过在URL中或在有特殊意义的目录中附加../、或者附加../的一些变形(如..\或..//甚至其编码),导致攻击者能够访问未授权的目录,以及在Web服务器的根目录以外执行命令。
# 命令执行漏洞
命令执行漏洞是通过URL发起请求,在Web服务器端执行未授权的命令,获取系统信息、篡改系统配置、控制整个系统、使系统瘫痪等。
# 文件上传漏洞
如果对文件上传路径变量过滤不严,并且对用户上传的文件后缀以及文件类型限制不严,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。
所以一般需注意:
- 在开发网站及应用程序过程中,需严格限制和校验上传的文件,禁止上传恶意代码的文件
- 限制相关目录的执行权限,防范webshell攻击
# 其他漏洞
- SSLStrip 攻击
- OpenSSL Heartbleed 安全漏洞
- CCS 注入漏洞
- 证书有效性验证漏洞
# 业务漏洞
一般业务漏洞是跟具体的应用程序相关,比如参数篡改(连续编号 ID / 订单、1 元支付)、重放攻击(伪装支付)、权限控制(越权操作)等。
# 框架或应用漏洞
- WordPress 4.7 / 4.7.1:REST API 内容注入漏洞
- Drupal Module RESTWS 7.x:Remote PHP Code Execution
- SugarCRM 6.5.23:REST PHP Object Injection Exploit
- Apache Struts:REST Plugin With Dynamic Method Invocation Remote Code Execution
- Oracle GlassFish Server:REST CSRF
- QQ Browser 9.6:API 权限控制问题导致泄露隐私模式
- Hacking Docker:Registry API 未授权访问