1. DNS

# (6)网络安全

1. DNS

1. 针对DNS服务器的攻击

  • 是什么?

    ​ 通过随机生成一些域名,向DNS服务器发起解析,由于DNS本地一般不会有随机生成的域名结果,就会递归往上查询。如果有很多域名解析请求就会导致DNS服务器崩溃。

  • 怎么应对?

    ​ 因为DNS无法判断一个域名到底是恶意的,还是非恶意的,所以还是逃不了应搜尽搜。唯一的解决思路就是判断请求是否恶意,如果短时间某个IP地址发起大量请求,就对其进行限制

    • 对突然发起大量相应频度低(即没什么人搜索的域名)进行带宽限制
    • 对突然发起大量相应频度低(即没什么人搜索的域名)设置低优先级
    • 限制每个IP的域名解析次数

2. DNS劫持

  • 是什么?

    ​ 攻击或者伪造域名解析服务器(DNS),把目标域名解析到错误的地址,导致用户无法正确访问网站,或被引导到冒牌网站,导致被骗的风险。

  • 具体实现方法是?

    • 本地电脑被恶意入侵,本地DNS配置(hosts文件、DNS服务器地址、DNS缓存)

      本地的dns就是hosts,DNS缓存是避免高频次使用网站每次都要查

    • 路由器存在漏洞,被入侵并篡改配置

  • 怎么应对?

    ​ 总的来说,预防大于根治,DNS劫持挺难防范的,做好防范木马,关闭不必要的DNS解析就差不多了。更多的DNS防止劫持方法看这里

2. 中间人攻击

  • prerequisties

    • https
  • 是什么?

    什么是中间人攻击

    ​ 是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方 直接对话,但事实上整个会话都被攻击者完全控制。在中间人攻击中,攻击者可以拦截通讯双方的通话并插入新的内容。中间人攻击是一个(缺乏)相互认证的攻击。

    ​ 大多数的加密协议都专门加入了一些特殊的认证方法以阻止中间人攻击。例如,SSL协议可以验证参与通讯的一方或双方使用的证书是否是由权威的受信任的数字证书认证机构颁发,并且能执行双向身份认证。

  • 具体实现方法

    1. 客户端发送请求到服务端,请求被中间人截获。

    2. 服务器向客户端发送公钥。

    3. 中间人截获公钥,保留在自己手上。然后自己生成一个【伪 造的】公钥,发给客户端。

    4. 客户端收到伪造的公钥后,生成加密hash值发给服务器。

    5. 中间人获得加密hash值,用自己的私钥解密获得真秘钥。同时生成假的加密hash值,发给服务器。

    6. 服务器用私钥解密获得假密钥。然后加密数据传输给客户端。

      ![img](https://upload-images.jianshu.io/upload_images/10170988-93003325e641a498.png?imageMogr2/auto-orient/strip imageView2/2/w/386/format/webp)
  • 怎么应对?

    • 在与server通信前,我们会先查询网站的证书,证书能保证对方就是server,如果证书不正确则有可能被中间人攻击了。

      image-20220419165109285

    • 而这个证书的校验依赖于CA机构,而CA结构是比较权威的机构,一般来说都是选择相信。

    • 至于,证书被伪造之类的,读者有兴趣可以看这个

3. 分布式拒绝服务攻击Ddos

  • 是什么?

    ​ 攻击者发出海量实际上并不需要的互联网流量,致使目标服务器的资源耗尽,从而无法正常提供服务。

  • 具体实现方法是?

    ​ 在古早技术年代,一般需要攻击者的宽带大于目标服务器的宽带,所以你发送的无用请求才能大于人家接受能力。

    ​ 随后,随着技术的发展,攻击者可以操控一些受到恶意软件感染的机器,或者说一些古早机器仍然使用win98,而这些老系统存在一些系统漏洞,可能就不知不觉地被操作了。而这些被操控的机器被叫做僵尸网络。僵尸网络可能存在成千上万个,甚至数十万到数百万,庞大的僵尸网络总能够发出足够的流量冲击你的服务器。

    ​ 除此之外,还有一种伪装服务器IP的方式,向校时服务器发送请求,而目前的时间矫正协议,有一个设计很愚蠢的指令,能够返回600个向校时服务器请求过时间的机器的信息。而校时服务器有很多,且宽带巨大。

    ​ 那使用僵尸网络伪装服务器向校时服务器发送指令,校时服务器就会向目标服务器发出巨大的流量,足以导致任何一个服务器崩溃。这是一个流量放大的操作。

    感兴趣的可以看这个科普视频

  • 怎么应对?

    ​ 其实最先进的DDos攻击可以达到Tb的单位,因为根本就无法识别一个新请求到底是不是恶意的,所以面对所有新的请求都得处理。也就是说DDos方法操作都是基于如何扩容的。

    ​ 而目前的DDos防护都是以G,几G到几百G的,越高越贵。可以说没有绝对能够防住的,都是缓解。好就好在,黑客团队一般都是攻击非法网站为主。

    • 提高宽带:但不是一点钱能搞定的,很贵。

      果壳网彼时只买了不足100M带宽,所在早期机房总带宽也不足40G,攻击带宽都没见过低于10G的(机房的人后来告诉我的)。假设某便宜机房(肯定不在北上广深),带宽价格为100元/M*月,每月按峰值计费。则要买10G带宽顶一下,需要的月费是100万

    • CDN服务:CDN服务可以将对源节点的访问,改变成就近的CDN节点,但是因为CDN节点和源节点的同步问题,当前的分发技术不允许CDN提供商做到动态网页加速,也就是只能CDN服务只能保住静态网页。

    • 分布式集群防御:分布式集群防御的特点是在每个节点服务器配置多个IP地址,并且每个节点能承受不低于10G的DDoS攻击,如一个节点受攻击无法提供服务,系统将会根据优先级设置自动切换另一个节点,并将攻击者的数据包全部返回发送点,使攻击源成为瘫痪状态,从更为深度的安全防护角度去影响企业的安全执行决策。

    • 总的来说,很少有什么好的解决方法,上云由云服务厂家解决是比较好的方法。

    • 更多方法方法查看这里

3.1 SYN攻击

  • 是什么

    ​ SYN攻击是DDos攻击最常见的一种,下面简单介绍一下

  • 具体实现

    • 直接攻击:不伪造IP地址直接发送大量SYN包,屏蔽IP地址即可
    • 伪造ip攻击:伪造IP发送SYN包,如果是伪造IP需要对数据包溯源,除非网络运营商愿意配合,否则不好实现
    • 僵尸网络攻击:使用僵尸网络发送SYN包
  • 怎么应对

    • 如果队列慢的时候,回收最先创建的TCP半开链接
    • cookie,对每一个SYN包都会回复,SYN-ACK数据包,但是之后服务器就会删除该请求,如果再收到ACK包的时候,再重建

4. SQL注入

  • 是什么

    ​ 在网站里面,如果程序没有对用户输入数据的合法性进行判断和处理,就有可能受到SQL注入攻击。因为你的输入数据,是转变为SQL语句到数据库进行查询或者说校验工作的。如果没有对输入数据进行校验,输入数据有可能就夹杂着一些本来不该允许的SQL语句,如查询管理员账户密码、或者说删除数据库等。

  • 具体实现

    • 恶意拼接查询

      • 我们知道,SQL 语句可以查询、插入、更新和删除数据,且使用分号来分隔不同的命令。例如:

        SELECT * FROM users WHERE user_id = $user_id

        其中,user_id 是传入的参数,如果传入的参数值为“1234; DELETE FROM users”,那么最终的查询语句会变为:

        SELECT * FROM users WHERE user_id = 1234; DELETE FROM users

        如果以上语句执行,则会删除 users 表中的所有数据。

    • 利用注释执行非法命令

      • SQL 语句中可以插入注释。例如:

        SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version=$version

        如果 version 包含了恶意的字符串'-1' OR 3 AND SLEEP(500)--,那么最终查询语句会变为:

        SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version='-1' OR 3 AND SLEEP(500)--

        以上恶意查询只是想耗尽系统资源,SLEEP(500) 将导致 SQL 语句一直运行。如果其中添加了修改、删除数据的恶意指令,那么将会造成更大的破坏。

    • 传入非法参数

      • SQL 语句中传入的字符串参数是用单引号引起来的,如果字符串本身包含单引号而没有被处理,那么可能会篡改原本 SQL 语句的作用。 例如:

        SELECT * FROM user_name WHERE user_name = $user_name

        如果 user_name 传入参数值为 G'chen,那么最终的查询语句会变为:

        SELECT * FROM user_name WHERE user_name ='G'chen'

        一般情况下,以上语句会执行出错,这样的语句风险比较小。虽然没有语法错误,但可能会恶意产生 SQL 语句,并且以一种你不期望的方式运行。

    • 添加额外条件

      • 在 SQL 语句中添加一些额外条件,以此来改变执行行为。条件一般为真值表达式。例如:

        UPDATE users SET userpass='$userpass' WHERE user_id=$user_id;

        如果 user_id 被传入恶意的字符串“1234 OR TRUE”,那么最终的 SQL 语句会变为:

        UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE;

        这将更改所有用户的密码。

  • 怎么应对

    • 过滤/检验输入内容,简单来说就是用正则表达式匹配输入内容
    • 参数化运行,就是对SQL语句进行编译,这个是查询的的就只可能执行查询,然后将输入数据转变话参数代入运行,如果参数含有攻击语句,也不会运行。

  • 避免将用户输入直接放入SQL语句
  • 数据库的机密数据,可以加密
  • 设置数据库权限

5. 爬虫攻击

  • 是什么

    ​ 网络爬虫相当于模拟浏览器发送网络请求,然后将这些数据下载到本地。比如说,我想做一个社交网站的群体画像,首先从地区做起吧。而这个社交网站并不开放我们这个搜索,我们只能只能一个一个打开用户,看其注册地址所在。

    ​ 而这个时候就可以用爬虫技术,去模拟我们在浏览器的操作,然后将需要的数据下载下来。而爬虫这种行为,对一些内容网站来说是很反感的,因为其内容数据可能是其安身立命之处。因此有爬虫技术,就有发爬虫技术。

    ​ 而本质上爬虫都是模拟浏览器进行操作,而这个模拟浏览器的行为是不可知的,也就是说,网站不知道这个是正常操作还是爬虫操作,那么反爬虫只能是一种后知后觉的防御机制了。也就是先被爬了,然后感觉到同类数据的请求有异常,比如说短时间内很多,或者一个IP地址发出很多等,然后再去做一些限制操作。

  • 具体实现

    • 爬取网页:
      • 简单来说就是设定url,根据什么规矩去获得url,并进行访问
    • 解析数据:
      • 一般就是使用正则表达式,匹配想要获取的数据。
    • 保存数据:
      • 保存到本地,可以直接保存,或者保存sqlite数据库中
    • 总结:爬虫具体实现的话依赖于库,因为写起来挺繁琐的,主流爬虫方式都是python调用库去爬,找一个爬虫库学就行了。
  • 怎么应对

    • 封IP

    • 封cookie

    • 验证码

6. 总结

​ 上面是常见的一些网络攻击,本文仅做一些介绍。在最后的时候,读者可以看看这个视频进行回顾