如何应对Web软件攻击

Web攻击概述

​ Web应用程序具有的众多优点,对于用户来说,其不受操作系统或设备的影响的高兼容性,用户免于安装的高便捷性与灵活性,以及对于用户较低的设备需求,Web应用。而对于企业来说,Web应用减少了软件盗版,降低了对于应用的支持和维护。这些因素共同造成当下Web应用程序的广泛使用以及巨大的影响力。

​ 在过去的2021年中移动用户平均使用互联网的时间为 155 分钟,而桌面用户为 37 分钟,但随之而来的是日益复杂且密集的Web软件攻击。Check Point Research (CPR) 报告称,2022 年第二季度全球网络攻击创历史新高,与 2021 年第二季度相比增加了 32%。全球每个机构平均每周所遇攻击次数最高达到 1200 次。因此对于我们来说,了解面向Web编程的主要软件基本方法,以及如何在代码开放层面进行防御就变得至关重要。目前的Web程序的结构主要由三部分组成,分别为客户端、应用服务器、数据库服务器,其中浏览器端与应用服务器端采用请求/响应模式的方式进行交互。因此从攻击对象上来说,Web软件攻击可以大体上分为三类,即Web客户端攻击、Web服务器攻击、HTTP协议攻击。本文将从这三个方面,以及挑选一个其他类型的攻击方式,来叙述如何防范Web攻击。

Web客户端攻击

XSS跨站脚本

​ Precise Security最近的一项研究发现,XSS攻击是最常见的网络攻击,约占所有攻击的40%。但其实大多数的XSS攻击都不是很复杂,一般为业余的网络犯罪分子使用他人创建的脚本执行的。跨站点脚本攻击的目标一般是站点的用户,而不是web应用程序本身。跨站脚本攻击一般分为三类,分别为存储型跨站脚本攻击、标题反射型跨站脚本攻击、以及DOM型跨站脚本攻击。

​ 较为常见的为前两者,其中存储型跨站脚本攻击的数据流向为客户端、服务端、数据库、服务端、客户端,而标题反射型跨站脚本攻击的数据流向为客户端、服务端、客户端。这两种方式都为跨站脚本诱使Web站点执行本来不属于它的代码,而这些行代码由攻击者提供、为用户浏览器加载,攻击者利用这些代码执行来获取客户端的敏感信息。

​ 从本质上讲,XSS漏洞终究原因是由于网站的Web应用对用户提交请求参数未做充分的检查过滤。其可能被用于的攻击方式有Cookie窃取、会话劫持、网络钓鱼、信息刺探、网页挂马、XSS蠕虫等。

​ 从编程角度上上来说,对于任意的输入数据都应该进行验证,以有效检测攻击;也就是说,某个数据被接受之前,必须使用一定的验证机制来验证所有输入数据,如长度、格式、类型、语法等;常见的方法,比如黑名单验证,就是将一些常见的字符,如(如"<" ">"或类似"script"的关键字)进行过滤,效果比较好;不过,该方式也有局限性,很容易被XSS变种攻击绕过验证机制。而且对于任意的输出数据,要进行进行适当的编码,防止任何已成功注入的脚本在浏览器端运行;数据输出前,确保用户提交的数据已被正确进行编码;可在代码中明确指定输出的编码方式(如ISO-8859-1),而不是让攻击者发送一个由他自己编码的脚本给用户用。

Web服务器攻击

注入攻击

​ 开放Web应用安全项目(OWASP)在其最新的十大研究中将注入漏洞列为网站的最高风险因素。SQL注入方法是这类网络罪犯最常用的做法。SQL注入攻击一般利用SQL语法,这就导致凡是基于SQL语言标准的数据库软件都可能受到攻击。根据SQL注入点类型的不同,可以分为字符型SQL注入、数字型SQL注入; 根据注入时是否有错误信息输出,可以分为基于错误信息SQL注入。如当网页的错误信息出现mysql_fetch_array()这一特殊函数,则后台一定是MySQL数据库系统的,以及SQL盲注入。在执行注入攻击时,攻击者插入一段代码,揭示隐藏的数据和用户输入,为数据修改提供帮助,绕过身份鉴别机制,执行命令,提升权限,写入木马程序等。

​ 注入攻击的高风险性来自于它是通过正常用户端进的,因此不能被防火墙等手段进行阻拦,只能通过程序来控制。形成注入漏洞的条件有:内部存在命令执行函数的调用、用户输入数据作为参数传递给命令执行函数、输入参数未做任何过滤或转义。

​ 因此在前端页面应该校验用户的输入数据,如限制用户输入的类型、范围、格式、长度等,并且使用参数化查询,使用参数而不是将用户输入嵌入到SQL语句中,即直接拼接SQL语句。在后端应该避免动态SQL语句,而是使用存储工程查询语句、最小化数据权限。同时也应该避免以明文展示对于数据库敏感的、重要的数据,以及屏蔽数据库查询中的出错信息,以避免攻击者从这类方式制定攻击策略。

路径遍历攻击

​ 路径遍历攻击不像之前的注入攻击那样常见,但对任何web应用程序来说仍然是一个相当大的威胁。也可以将路径攻击看作注入攻击的一个子类,因为路径遍历攻击以web根目录为目标,访问目标文件夹外未授权的文件或目录。攻击者试图在服务器目录中注入移动模式,以便在层次结构中向上移动。一次成功的路径遍历可能会危及站点的访问、配置文件、数据库以及同一物理服务器上的其他网站和文件。

HTTP协议攻击

中间人攻击

​ 中间人攻击在那些数据从用户传输到服务器时没有加密的网站中很常见。这是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。

​ 在中间人攻击中,攻击者会尝试窥探正在进行TCP通信的两台主机之间传送的报文,并从之获取该报文的源IP、目的IP、源TCP端口号、目的TCP端口号来推算下一个TCP报文段中seq和ackseq值,来介入TCP三次握手。若主机先收到攻击报文,就会与攻击主机间建立合法的TCP连接,并拒绝与被攻击主机发送的报文。

​ 一般防范中间人攻击主要通过使用HTTPS以及信任证书的方式。在编程的角度上,在建立信道之处时,双方主机会通过某种密钥交换算法来交换私钥,而攻击者必须与双方都进行密钥交换来进行攻击,那么当这个密钥交换的速度够慢时,就可以检测出通信的延迟,从而识别攻击者,但这会影响信道建立的速度,因此最优解时找一个不能并行的非递归算法。

其他攻击方式

未经验证的代码

​ 在网络上许多优秀应用的公开源码,而编程者也常常乐于使用这些在实际上已被验证过的代码,以精力与时间放在自身应用的核心上。但在这些代码中可能存在一些未经验证的恶意代码。如果使用第三方创建的未经验证的代码就可能会导致严重的安全漏洞。一段代码或应用程序的最初创建者在代码中隐藏了恶意字符串,或者在不知情的情况下留下了后门。然后将“受感染”的代码合并到您的站点,然后执行它或利用后门。攻击者通过这类攻击能够轻松的窃取数据传输,甚至获得对站点的管理访问权。而对于该类攻击的防范方式,最简单就是避免使用这些存在风险的未经过验证的代码。

小结

​ 对网站的攻击可以有多种形式,背后的攻击者可以是业余爱好者,也可能是有组织的专业攻击者。本文从Web应用的结构入手,分别举例分析了针对Web客户端、Web服务器、HTTP协议的攻击,并在面向编程的角度上提出了对应了防范措施。软件安全这门课给我了很不一样的感觉,课上有许多生动的例子,能让我直观的认识各类不同的攻击,加强我对于软件安全的认识。也让我开始思考毕业设计以及以后工作中的软件安全问题。