前端安全系列二(DNS劫持、SQL注入、DDOS攻击、点击劫持)

2,343 阅读9分钟

原文:www.lishuaishuai.com/security/13…

一、DNS劫持

DNS劫持又称域名劫持,是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址从而实现用户无法访问目标网站的目的。

1.1 什么是DNS劫持

域名劫持就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP地址或者什么也不做使得请求失去响应,其效果就是对特定的网址不能访问或访问的是假网址。

域名劫持一方面可能影响用户的上网体验,用户被引到假冒的网站进而无法正常浏览网页,而用户量较大的网站域名被劫持后恶劣影响会不断扩大;另一方面用户可能被诱骗到冒牌网站进行登录等操作导致泄露隐私数据。

DNS可以有本机DNS劫持、路由DNS劫持、攻击DNS服务器。

1.2 原理

域名解析(DNS)的基本原理是把网络地址(域名,以一个字符串的形式)对应到真实的计算机能够识别的网络地址(IP地址,比如216.239.53.99 这样的形式),以便计算机能够进一步通信,传递网址和内容等。

由于域名劫持往往只能在特定的被劫持的网络范围内进行,所以在此范围外的域名服务器(DNS)能够返回正常的IP地址,高级用户可以在网络设置把DNS指向这些正常的域名服务器以实现对网址的正常访问。所以域名劫持通常相伴的措施——封锁正常DNS的IP。 如果知道该域名的真实IP地址,则可以直接用此IP代替域名后进行访问。比如访问谷歌 ,可以把访问改为http://216.239.53.99/ ,从而绕开域名劫持。

1.3 解决办法

  1. 加强本地计算机病毒检查,开启防火墙等,防止恶意软件,木马病毒感染计算机
  2. 改变路由器默认密码,防止攻击者修改路由器的DNS配置指向恶意的DNS服务器
  3. 企业的话可以准备两个以上的域名,一旦一个域名挂掉,还可以使用另一个
  4. 用HTTP DNS 代替 Local DNS

二、SQL注入

2.1 什么是SQL注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

2.2 SQL注入的特点

  1. 广泛性

任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞。

  1. 隐蔽性

SQL注入语句一般都嵌入在普通的HTTP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。

  1. 危害大

攻击者通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也影响重大。

  1. 操作方便

互联网上有很多SQL注入工具,简单易学,攻击过程简单,不需要专业知识也能自如运用。

2.3 SQL注入的危害

如果网站存在 SQL 注入漏洞,相当于将数据库直接暴露在攻击者面前,可想而知危害会有多大了。攻击者利用 SQL 注入漏洞能实现以下攻击:

  • 跳过账户权限验证达到越权
  • 获取数据库关键信息从而进行脱库
  • 在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。

2.4 SQL注入如何防御

2.4.1 数据校验

其实漏洞的主要原因还是没有对用户输入的数据进行过滤,所以对来自用户的数据(GET, POST, cookie 等)最好做到以下两种过滤校验:

  • 检查输入的数据是否具有所期望的数据格式。这种在参数是数字的时候特别有效,如果攻击者选择在参数中插入内容的话则会被转换成 NaN 导致攻击失败。
  • 使用数据库特定的敏感字符转义函数把用户提交上来的非数字数据进行转义。在 ThinkJS 中封装了 escapeString() 方法可以对敏感字符进行转义,其原理则和 PHP 的 mysql_escape_string() 方法是一致的。

2.4.2 权限限制

严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。**请记住永远不要使用超级用户或所有者帐号去连接数据库!**当数据库被攻击时将损伤限制在当前表的范围是比较明智的选择。通过权限限制可以防止攻击者获取数据库其它信息,甚至利用数据库执行 Shell 命令等操作。

2.4.3 日志处理

当数据库操作失败的时候,尽量不要将原始错误日志返回,比如类型错误、字段不匹配等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。除此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显然,日志并不能防止任何攻击,但定期审计数据库执行日志可以跟踪是否存在应用程序正常逻辑之外的 SQL 语句执行。日志本身没用,要查阅其中包含的信息才行。毕竟,更多的信息总比没有要好。

三、DDoS攻击

3.1 什么是DDoS攻击

分布式拒绝服务攻击(英文意思是Distributed Denial of Service,简称DDoS)是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击,其中的攻击者可以有多个。

3.2 DDoS的种类

详细介绍

  • 基于自动化程度分类

    • 手工的DDoS攻击
    • 半自动化的DDoS攻击
    • 自动化的DDoS攻击
  • 基于系统及协议的弱点分类

    • 洪水攻击
    • 扩大攻击
    • 利用协议的攻击
    • 畸形数据包攻击
  • 基于攻击速率分类

  • 基于影响力进行分类

  • 基于入侵目标分类

  • 基于攻击路线分类

  • 基于攻击特征分类

3.3 如何防御DDoS

关于防御方式有很多种,这里不详细介绍。

防御原则:

在响应方面,虽然还没有很好的对付攻击行为的方法,但仍然可以采取措施使攻击的影响降至最小。对于提供信息服务的主机系统,应对的根本原则是:

尽可能地保持服务、迅速恢复服务。由于分布式攻击入侵网络上的大量机器和网络设备,所以要对付这种攻击归根到底还是要解决网络的整体安全问题。真正解决安全问题一定要多个部门的配合,从边缘设备到骨干网络都要认真做好防范攻击的准备,一旦发现攻击就要及时地掐断最近攻击来源的那个路径,限制攻击力度的无限增强。网络用户、管理者以及ISP之间应经常交流,共同制订计划,提高整个网络的安全性。

四、点击劫持

点击劫持(ClickJacking),又称界面伪装攻击,攻击者一般通过透明的iframe(目标网站),覆盖在攻击者的网页上,并诱导用户进行操作。这种一般会利用XSS或CSRF漏洞来进行攻击。解决方案是通过设置HTTP头 X-Frame-Options ,来防止网页被Iframe加载。它有三个值:

DENY:浏览器会拒绝当前页面加载任何frame页面 SAMEORIGIN:frame页面的地址只能为同源域名下的页面 ALLOW-FROM origin:允许frame加载的页面地址

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>点击劫持演示</title>
    <style>
        iframe {
            width: 900px;
            height: 250px;
        
            /*设置为绝对路径,并且置于真实按钮之上*/
            position: absolute;
            top: -135px;
            left: -740px;
            z-index: 2;

            /*隐藏*/
            filter: alpha(opacity=0);
        }

        button {
            position: absolute;
            top: 10px;
            left: 10px;
            z-index: 1;
            width: 120px;
        }
    </style>
</head>
<body>
<iframe src="http://www.163.com" scrolling="no"></iframe>
<button>点我</button>
</body>
</html>