1引言
目前,网络安全形式日益严峻,网络安全威胁不断增加对国家政治、经济、文化、国防安全及公民在网络空间中的合法权益面临诸多风险与挑战。而Web漏洞作为网络安全威胁因素中一个重要来源,更是不能忽视的。因此对Web漏洞进行分析及其检测技术的研究是具有重大意义的。
2 Web漏洞原理及其威胁
(1) Web漏洞定义
a) Web漏洞主要指网站程序自身存在致使网络信息系统安全策略相冲突的缺陷,使得系统或其应用数据的保密性、完整性、可用性、访问控制等面临威胁。攻击者基于这些漏洞可能对网络系统构成:敏感信息泄露、身份假冒、拒绝服务、非授权访问等威胁。
(1) Web漏洞的分类
a) 高危漏洞:可以直接被利用的漏洞,并且利用难度较低。利用之后可能对网站或服务器的正常运行造成严重影响、对用户财产及个人信息造成重大损失。
b) 中危漏洞:利用难度极高,或满足严格条件才能实现攻击的漏洞。或漏洞本身无法被直接攻击,但能为进一步攻击起较大帮助作用的漏洞。
c) 低危漏洞:无法直接实现攻击,当信息泄露可能让攻击者更容易找到其他安全漏洞。
(2) 本文将着重去介绍、分析常见的 SQL注入漏洞、跨站脚本、使用含有已知漏洞的组件,不安全的反序列化、XML外部实体、文件上传漏洞这六种常的WEB漏洞。
a) 注入漏洞:是指因字符的过滤规则不严谨造成的,攻击者可以将不受用户信任的数据作为命令或者信息发送到服务器解析器。攻击者的恶意数据可以诱使服务器解释器在没有相应授权的情况下执行恶意命令和非法访问数据。最常见的当属SQL注入漏洞,根据注入点的数据类型不同,我们主要将其分为两大类:数字/整数型注入和字符型注入。
数字/整数型注入:
当注入的参数为整数时就是数字型注入,或者叫整数型注入。其SQL语句原型一般为:
SELECT * FROM table WHERE id=1
此处id参数为整数,语句两边没有引号。测试时候可以使用1+2和4-1这种计算结果相同的参数值去构造请示,对比响应结果是否一致,如果两者结果相同就可能存在数字型注入。
字符型注入:
注入参数为字符串时就是字符型注入,其 SQL 语句原型类似:
SELECT * FROM table WHERE name='test'
此处的 name 为字符串参数,两边包含引号。这种类型的注入一般很好判断。
除了这两种类型,常见的搜索型注入,但我们认为其本质仍然属于字符型注入,只是相对特殊,因为此类注入常常用%作为关键字去闭合SQL语句。
实际场景常见的注入方式包含布尔型盲注、报错型注入、联合查询注入、多语句堆叠注入、基于时间延迟盲注、内联/嵌套查询注入。通常防御 SQL 注入的方法有白名单、参数化查询、WAF、RASP 等方法。如果请求参数有特定值的约束,比如参数是固定整数值,那么就只允许接收整数;还有就是常量值限制,比如特定的字符串、整数值等。这个时候,最好采用白名单的方式。参数化查询是预编译 SQL 语句的一种处理方式,所以也叫预编译查询,它可以将输入数据插入到 SQL 语句中的“参数”(即变量)中,防止数据被当作 SQL 语句执行,从而防止 SQL 注入漏洞的产生。WAF(Web 防火墙)能够抵挡住部分的SQL注入攻击。RASP 不用考虑网络请求中的各种复杂的数据处理过程,只需要在对应的漏洞触发函数进行 Hook 插桩检测等操作,同时 RASP 能够给出漏洞触发的程序上下文,帮助开发人员和安全人员快速定位漏洞代码,并实现漏洞的检测、告警和阻断。
b) 跨站脚本(XSS):在常见的Web漏洞中,XSS漏洞无疑是最常多见的。
XSS漏洞具体是指在网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML或 JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,实现盗号、钓鱼欺诈、篡改页面、刷广告流量、网页挂马、挖矿、键盘监听、窃取用户隐私等等恶意行为。
反射式XSS:这种类型的XSS漏会使应用程序或API包括未经过验证的用户进行输入,作为HTML输出的一部分。攻击者事将先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码,。换而言之,用户将需要与指向攻击者控制页面的某些恶意链接进行交互。常见形态有广告或非法内容、恶意漏洞网站。
存储式XSS:应用程序或者API将未过滤的用户输入存储下来了,并在后期在其他用户或者管理员的页面展示出来。也就是说,代码是存储在服务器中的,如在个人信息或发表文章等地方加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,容易造成蠕虫,盗窃cookie等。
基于DOM的XSS:DOM是一个与平台、编程语言无关的接口,它允许程序或者脚本动态的访问和更新文档内容、结构和样式,处理后的结果仍然能够成为显示页面的一部分。如果DOM中的数据没有经过逻辑严密的确认,就会产生基于DOM的XSS漏洞。这种XSS漏洞一般存在于页面的JavaScript框架、API、单页面程序中,攻击者可以动态的将可控脚本加入其中。
XSS的防御也必须根据不同位置采取不同的方案,具体有四种防御手段:输入检查、输出检查、Httponly Cookie、CSP。在测试XSS时,经常需要输入一些特殊字符,所以在最开始就直接做好输入检查有利于减少被攻击的可能性;XSS的出发关键点在于输出的位置,所以对输出检查尤为重要,当有网站需要支持富文本时,此时采用白名单的方式,直接限制允许输入的标签、字符是最佳方案;如果你在 Cookie 中设置了 HttpOnly 属性,那 JavaScript 脚本将无法读取到 Cookie,这样就能防止通过 XSS 窃取 Cookie,在一定程度上能够减少 XSS 的攻击范围.;内容安全策略(Content Security Policy,CSP)也是减少 XSS 攻击的一种方式 ,是浏览器提供一种防御机制。它采用的是白名单机制,告诉浏览器可以加载和执行哪些外部资源,这样就能防止被一些第三方恶意脚本注入执行,我们可以通过HTTP头信息的Content-Security-Policy的字段和网页的<meta>标签设置去开启CSP。
c) 使用含有已知漏洞的组件:组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。使用含有已知漏洞的组件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响。
在软件开发或者运行维护就当我们要做到:使用公共数据库(如CVE和CNVD等漏洞中心),项目邮件列表和安全邮件列表中时刻关注这些组件的安全信息并保证它们是最新的;建立组件使用的安全策略,比如需要某些软件开发实践,通过安全性测试保障发全新;在适当的情况下,考虑增加对组件的安全封装,去掉不使用的功能和/或安全薄弱的或者组件易受攻击的方面。
d) 不安全的反序列化:在web应用程序中,序列化是把对象转换成有序字节流,通常都是一段可阅读的字符串,以便在网络上传输或者保存在本地文件中。同样,如果我们想直接使用某对象时,就可能通过反序列化前面保存的字符串,快速地重建对象,也不用重写一遍代码,提高工作效率。
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用改变应用逻辑或者实现远程代码来执行攻击,我们称其为数据结构攻击。包括:重播攻击、注入攻击和特权升级攻击。
e) XML外部实体:XML全称可扩展标记语言。与HTML一样,XML使用标签和数据的树状结构。XML外部实体攻击是一种针对解析XML格式应用程序的攻击类型之一,许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用,攻击一般发生在配置不当的XML解析器处理指向外部实体的文档时。信息安全人员通过构造恶意内容,导致读取任意文件、执行系统命令、内网探测与攻击等危害的一类漏洞。
XML主要的漏洞是XXE,不同的 XML 解析库有不同的关闭方式,比如全面介绍 XXE 防御方案的是 OWASP 发表的“XML External Entity Prevention Cheat Sheet”,针对不同的语言、XML 解析库,给出不同的防御方案,并提供关闭 XML 实体引用的代码示例。
f) 文件上传漏洞:这是由于在文件上传功能中,由于对用户上传的文件数据未做有效检测或过滤不严,导致上传的恶意文件被服务端解释器解析执行,利用漏洞可获取系统控制权。很多网站都有一些文件上传功能,常见的是图片、视频、压缩文档上传,如果网站是 PHP 写的,那么上传 PHP 到服务器就有可能被解析,若服务器支持其他语言的解析执行,比如 ASP、JSP、ASPX 等文件也可达到同等攻击效果,达到恶意代码执行。
针对这种漏洞,使用WAF拦截木马上传,但这种比较容易被绕过;重编码文件,比如对视频或者图片做转换处理;严格检测上传文件后缀名、文件头、Content-type;限制文件大小和上传的目录不可解析;隐藏上传文件路径相关信息,比如关闭错误回显;这些都是常见的安全防护措施。
3.WEB漏洞检测技术与研究
现在主流的Web漏洞检测方式基本分为以下三种:SAST(静态应用安全测试)、DAST(动态应用安全测试)和 IAST(交互式应用安全测试)。
SAST(Static Application Security Testing,静态应用程序安全测试)
SAST是通过分应用程序源代码以提早发现安全漏洞,也包括二进制文件的静态逆向分析。在产品形式上,主要体现为代码审计系统等。SAST 分析比较全面,漏洞发现率高,哪怕是当前未能执行到的代码,也可能被发现到漏洞,但是对于它最大的挑战是如何降低误报率。但代码审计本质上就是在误报率与发现率之间相互协调,直到在可接受的范围内找到一个平衡的过程。如果发现率很高,但其中包含过多的误报,告警量多到无法运营的程度,那也等同于没发现。
DAST(Dynamic Application Security Testing,动态应用程序安全测试)
DAST是对应用程序进行黑盒分析,通常在测试或运行阶段分析应用程序的动态运行状态,通过模拟黑客行为对应用程序进行动态攻击,分析应用程序的反应,从而确定是否存在漏洞。DAST 通过动态发送 payload 来测试漏洞,所以准确率相对较高,而且检测出来后就直接有现成的 PoC(Proof of Concept,概念验证)可以验证。但如果有些代码未执行,就无法发现。因此,跟 SAST 结合使用是最好的方式。DAST在产品上一般体现为漏洞扫描器。
IAST(Interactive Application Security Testing,交互式应用安全测试)
IAST是近几年兴起的一种应用安全测试新技术,曾被 Gartner 咨询公司列为网络安全领域的 Top 10 技术之一。IAST 融合了 DAST 和 SAST 的优势,漏洞检出率极高、误报率极低,同时可以定位到 API 接口和代码片段。
4.结束语
本文介绍了一些常见的Web漏洞特性以及防范技术、当下主流的Web漏洞检测技术,这些漏洞扫描技术在一定程度保证了网络系统的安全。希望信息安全从业人员、开发人员在日常研究工作中能够提防这些漏洞,研究开发下一代新型漏洞检测技术,为网络安全提供保障。