本文由葡萄城技术团队于原创并首发
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
在昨天的公开课中,由于参与的小伙伴们积极性和热情非常高,我们的讲师Carl(陈庆)把原定第二讲的大部分也一并献出了,所以原定三场的公开课也变为了两场,本系列的公开课生动有趣、干货满满、受众广泛,所以没有参与上次课程的小伙伴们这次请不要忘记了,本期公开课,我们将着重介绍OWASP Top 10(10项最严重的Web应用程序安全风险预警)及其应对策略。公开课地址:http://live.vhall.com/137416596
《OWASP Top 10》的目的在于为广大企业确定一组最严重的风险项目。对于其中的每一项风险,我们将使用基于OWASP风险等级排序的评级方案,为您提供关于漏洞普遍性、可检测性、业务/技术影响等信息。
将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入等注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
可利用性:容易
几乎任何数据源都能成为注入载体,包括环境变量、所有类型的用户、参数、外部和内部Web服务。当攻击者可以向解释器发送恶意数据时,注入漏洞便可产生。
普遍性:常见
注入漏洞十分普遍,尤其是在遗留代码中。注入漏洞通常能在SQL、LDAP、XPath或是NoSQL查询语句、OS命令、XML解析器、SMTP包头、表达式语句及ORM查询语句中找到。
可检测性:易
注入漏洞很容易通过代码审查发现。扫描器和模糊测试工具可以帮助攻击者找到这些漏洞。
技术影响:严重
注入能导致数据丢失、破坏或泄露给无授权方、缺乏可审计性或是拒绝服务。注入有时甚至能导致主机被完全接管。
业务影响:未知
您的应用和数据需要受到保护,以避免对业务造成影响。
自查:您的应用程序脆弱吗?
当您的应用有如下情况时,是脆弱且易受到攻击的:
一些常见的注入,包括:SQL、OS命令、ORM、LDAP和表达式语言(EL)或OGNL注入。
所有编译器的原理都是相似的,因此 Code Review是目前为止最有效的检测应用程序注入风险的办法之一。当然,您也可以对代码中所有参数、字段、头、cookie、JSON和XML数据输入进行DAST扫描,并将SAST和DAST工具添加到CI/CD进程中,以便在项目部署前对现有代码或新代码进行注入检测。
如何防止注入?
防止注入漏洞需要将数据与命令语句、查询语句分隔开来:
攻击案例场景
1 2 3 4 5 6 7 8 9 10 11 |
|
在这两个案例中,攻击者在浏览器中将“id”参数的值修改成: ’or’1’=’1。例如:
http://example.com/app/accountView?id=' or '1'='1
这样查询语句的意义就变成了从accounts表中返回所有记录。
SQL盲注
SQL盲注,就是在SQL语句注入后且成功执行时,执行的结果不能回显到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
盲注一般分为三类:
一、基于布尔的盲注
基于布尔的盲注通常使用逻辑判断推测获取的数据,通过给定条件,服务器返回真或假。使用二分法或者正则表达式等方法即可缩小判断的范围。
二、基于时间的盲注
主要是利用延时或者执行的时间来判断。
If(ascii(substr(database(),1,1))>115,0,sleep(5))%23 //if 判断语句,条件为假,执行 sleep
因为延时会受到网络环境的影响,因此这种方法不是很可靠。
三、基于报错的盲注
构造payload让信息通过错误提示显示。
count(*)和rand(0)和group by报错
rand(0)是伪随机数列,01101100。产生报错的原因是因为rand(0)并不是一个定值,相当于一个变量。使用group by时,会建立一张虚拟表,字段为key和count(*)。执行插入操作,第一次返回0,但虚拟表中没有这个项,数据库会认为需要插入这个项,但数据库并没有记录下来,因此,会再次执行rand(0) 试图获取,但此时获取的是第二个数。依次类推,当数据库查询发现0这个项不存在,执行插入操作时, rand(0)返回值为1,但是1已经存在,这时插入已经存在的项就会报错。
WAF绕过
之所以要谈到WAF的常见特征,是为了更好的了解WAF的运行机制,以便增加绕过WAF的机会。总体来说,WAF(Web Application Firewall)具有以下四个方面的功能:
WAF过滤机制:
绕过WAF的方法:
从目前能找到的资料来看,绕过WAF的技术主要分为9类,包含:
通过错误地使用Web应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥和会话令牌,或者利用其它开发缺陷来暂时性或永久性地冒充管理员的身份。
可利用性:容易
攻击者可以轻松获取数百万条有效用户名和密码组合,包括证书、默认的账户管理列表、自动的暴力破解和字典攻击工具,以及高级的GPU破解工具。会话管理可以很容易地被利用,尤其是没有过期的会话密匙。
普遍性:常见
大多数管理系统的设计和实现,都存在身份认证失效的问题。会话管理是身份验证和访问控制的基础,并且存在于整个应用程序的进程中。
可检测性:一般
攻击者通常使用指南手册来检测失效的身份验证。除此之外,也会关注密码转储、字典攻击,或者在类似钓鱼、社会工程攻击后,发现失效的身份认证。
技术影响:严重
攻击者只需访问几个账户,或者一个管理员账户就可以破坏我们的系统。根据应用程序业务场景的不同,可能会导致洗钱、欺诈、用户身份盗窃、泄露法律保护的敏感信息等严重违法行为。
自查:您的应用程序脆弱吗?
确认用户身份、身份验证和会话管理非常重要,这些措施可用于将恶意的、未经身份验证的攻击者与授权用户进行分离。如果您的应用程序存在如下问题,那么可能存在身份验证失效漏洞:
如何防止?
攻击案例场景
场景#1:最常见的攻击方式——凭证填充,使用已知密码的列表。如果应用程序不限制身份验证尝试次数,则可以将应用程序用作密码oracle, 以确定凭证是否有效。
场景#2:大多数身份验证攻击都是由于密码作为唯一的认证因素。
场景#3:应用会话超时设置不正确。用户使用公共计算机访问应用程序时,直接关闭浏览器选项卡就离开,而不是选择“注销”。
凭据填充(撞库)
撞库,是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。很多用户在不同网站使用的是相同的账号和密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网站,这就是撞库攻击。
撞库可以通过数据库安全防护技术解决,数据库安全技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。
撞库并不神秘,事实上,它正被广泛的使用。举例而言,根据Shape Security的报告,“攻击者们一旦锁定了一个财富100强的B2C(企业对消费者)网站,就会在一个星期内使用遍布世界各地的代理服务器,对其进行超过五百万次登录尝试。” 雪上加霜的是,被窃取的凭证也并不难找。黑客们会为了找乐子或寻求扬名立万的机会把凭证散播到网上。当黑客们在凭证黑市(比如Cracking-dot-org、 Crackingking-dot-org以及 Crackingseal-dot-io)做生意时,这些名声会派上大用场。
多因素验证
多因素验证(Multi-factor authentication,缩写为 MFA),又译多因子认证、多因素认证,是一种计算机访问控制的方法,用户要通过两种以上的认证机制之后,才能得到授权,使用计算机资源。例如,用户要输入PIN码,插入银行卡,最后再经指纹比对,通过这三种认证方式,才能获得授权。这种认证方式可以提高安全性。
许多Web应用程序和API都无法正确保护敏感数据,例如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据。
可利用性:一般
攻击者并非直接攻击,而是在传输过程中、从客户端(例如:浏览器)窃取密钥、发起中间人攻击,或从服务器端直接窃取明文数据。
普遍性:广泛
这是最常见,也是最具影响力的攻击手段。在数据加密的过程中,由于不安全的密钥生成、管理以及使用弱加密算法、弱协议和弱密码(未加盐的哈希算法或弱哈希算法),导致数据泄露事件频发。
可检测性:一般
在服务器端,检测传输过程中的数据弱点很容易,但检测存储数据的弱点却异常困难。
技术影响:严重
敏感数据泄露事件造成的影响是非常严重的,因为这些数据通常包含了很多个人信息(PII),例如:医疗记录、认证凭证、个人隐私、信用卡信息等。这些信息受到相关法律和条例的保护,例如:欧盟《通用数据保护条例》(GDPR)和地方隐私保护法律。
自查:您的应用程序脆弱吗?
首先你需要确认哪些数据(包含:传输过程中的数据、存储数据)是敏感数据。例如:密码、信用卡卡号、医疗记录、个人信息等,这些数据应该被加密,请Review:
如何防止?
对一些需要加密的敏感数据,应该做到以下几点:
10. 将工作因素(延迟因素)设置在可接受的范围。
11. 单独验证每个安全配置项的有效性。
攻击案例场景
场景 #1:假设一个应用程序使用自动化的数据加密系统加密了信用卡信息,并存储在数据库中,当数据被检索时自动解密。这会导致SQL注入漏洞能够以明文形式获得所有信用卡卡号。
场景 #2:一个网站上没有使用或强制使用TLS,或者仅使用弱加密算法。攻击者通过监测网络流量(如:不安全的无线网络),将网络连接从HTTPS降级到HTTP,就可以截取请求并窃取用户会话 cookie。然后,攻击者可以复制用户cookie并成功劫持经过认证的用户会话、访问或修改用户个人信息。除此之外,攻击者还可以更改所有传输过程中的数据,如:转款的接收者。
场景 #3:密码数据库使用未加盐的哈希算法或弱哈希算法去存储密码,此时,一个文件上传漏洞可使黑客能够获取密码文件,而这些未加盐的哈希密码通过彩虹表暴力破解方式即可快速破解。
各国应对措施
日本个人信息保护法
近年来,因信息、通信技术的发展,企业需要收集大量个人信息,用以提供准确且迅速的服务。个人信息的利用,无论是对现今的商业活动,还是对国民生活都变得不可或缺。但是,另一方面,由于处理个人信息状况不当,导致个人权利和利益受到损害的可能性也在增大。在日本,包含企业和政府等团体的组织内部,泄露的个人信息数量累积超过了1000万件。于是,鉴于规范处理个人信息,明确国家及地方公共团体的职责,确保个人信息有效利用等目的,日本于2005年4月1日起颁布《个人信息保护法》。
欧盟《通用数据保护条例》(GDPR)
欧盟《通用数据保护条例》(General Data Protection Regulation,简称GDPR),其前身是欧盟在1995年制定的《计算机数据保护法》,该法明确规定:
设计安全账号系统的正确姿势
数据安全防范的方法简单来说,当数据从用户键盘敲出的那一刻,到服务器后台存储过程中,都需保持正确的姿势。如:
a) 低级错误:明文保存密码
b) 低级错误:可逆加密密码
c) 错误方法:md5 加密密码
d) 正确方法:加盐 hash 保存密码
a) 验证服务端的合法性
b) 确保通信的安全
许多较早的或配置错误的XML处理器评估了XML文件中的外部实体引用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。
可利用性:一般
如果攻击者可以上传XML文档或在XML文档中添加恶意内容(如,易受攻击的代码、依赖项或集成),他们就能够攻击含有缺陷的XML处理器。
普遍性:常见
一般来说,许多旧的XML处理器能够对外部实体、XML进程中被引用和评估的URI进行规范。SAST 工具可以通过检查依赖项和安全配置来发现XXE缺陷。DAST工具需要额外的手动步骤来检测和利用XXE缺陷。
技术影响:严重
XXE缺陷可用于提取数据、执行远程服务器请求、扫描内部系统、执行拒
绝服务攻击和其他攻击。
自查:您的应用程序脆弱吗?
应用程序,特别是基于XML的Web服务,可能在以下方面容易受到攻击:
如何防止?
培训开发人员的安全意识,是识别和减少XXE的关键,除此之外,还需要:
攻击案例场景
目前,已经有大量XXE缺陷被发现并公开,这些缺陷包括上传可被接受的恶意XML文件、嵌入式设备的 XXE缺陷及深嵌套的依赖项等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
XML基本定义
XML是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
图片来自网络
XML由3个部分构成,分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link Language,XLL)。
XML 中的实体分为以下五种:字符实体,命名实体,外部实体,参数实体,内部实体,普通实体和参数实体都分为内部实体和外部实体两种,外部实体定义需要加上 SYSTEM关键字,其内容是URL所指向的外部文件实际的内容。如果不加SYSTEM关键字,则为内部实体,表示实体指代内容为字符串。
XML外部实体
XML外部实体表示外部文件的内容,用 SYSTEM 关键词表示:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
在上面的代码中, XML外部实体 ‘entityex’ 被赋予的值为:file://etc/passwd。在解析XML文档的过程中,实体’entityex’的值会被替换为URI(file://etc/passwd)内容值(也就是passwd文件的内容)。 关键字’SYSTEM’会告诉XML解析器,’entityex’实体的值将从其后的URI中读取,并把读取的内容替换entityex出现的地方。
假如 SYSTEM 后面的内容可以被用户控制,那么用户就可以随意替换为其他内容,从而读取服务器本地文件(file:///etc/passwd)或者远程文件(http://www.baidu.com/abc.txt)。
XXE 注入定义
XXE注入(即XML External Entity, XML外部实体注入)。通过 XML 实体,”SYSTEM”关键词导致 XML 解析器可以从本地文件或者远程 URI 中读取数据。攻击者可以通过 XML 实体传递自己构造的恶意值,从而引导处理程序解析它。当引用外部实体时,攻击者通过构造恶意内容,可读取任意文件、执行系统命令、探测内网端口、攻击内网网站等行为。
XXE 漏洞原理
最常见的XXE漏洞类型分为以下三种:
既然XML可以从外部读取DTD文件,那我们就自然地想到了如果将路径换成另一个文件的路径,那么服务器在解析这个XML的时候就会把那个文件的内容赋值给SYSTEM前面的根元素中,只要我们在XML中让前面的根元素的内容显示出来,就可以读取那个文件的内容了。这就造成了一个任意文件读取的漏洞。
假设我们指向的是一个内网主机的端口呢?是否会给出错误信息,我们是不是可以从错误信息上来判断内网主机这个端口是否开放,这就造成了一个内部端口被探测的问题。一般来说,服务器解析XML有两种方式,一种是一次性将整个XML加载进内存中,进行解析;另一种是一部分的、“流式”地加载、解析。如果我们递归地调用XML定义,一次性调用巨量的定义,那么服务器的内存就会被消耗完,造成了拒绝服务攻击。
未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷,访问未经授权的功能或数据,例如:访问其他用户的账户、查看敏感文件、修改其他用户的数据、更改访问权限等。
安全配置错误是最常见的安全问题,这通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的 HTTP 标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。
当应用程序的新网页中包含不受信任的、未经验证或转义的数据时,或者使用可以创建 HTML或 JavaScript 的浏览器 API 更新现有网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。
可利用性:容易
自动化工具能够检测并利用所有的三种XSS形式,并且存放在便于攻击者利用的漏洞中。
普遍性:广泛
XSS是OWASP Top10中第二普遍的安全问题,存在于近三分之二的应用程序中。
可检测性:容易
自动化工具能发现XSS问题,尤其是一些成熟的技术框架中,如:PHP、J2EE或JSP、ASP.NET等。
技术影响:中等
XSS对于反射和DOM的影响是中等的,而对于存储的XSS,XSS的影响更为严重,譬如在受到攻击的浏览器上执行远程代码,如:窃取凭证和会话或传递恶意软件等。
自查:您的应用程序脆弱吗?
针对用户的浏览器,存在三种XSS类型:
典型的XSS攻击造成的结果包含:盗取Session、账户、绕过MFA、DIV替换、对用户浏览器的攻击(例如:恶意软件下载、键盘记录)以及其他用户侧的攻击。
如何防止?
防止XSS,需要将不可信的数据与动态的浏览器内容区分开:
攻击案例场景
场景#1:应用程序在下面的HTML代码段构造中使用了未经验证或转义的不可信的数据源:
1 |
|
攻击者在浏览器中修改“CC” 参数为如下值:
1 |
|
这个攻击会导致受害者的会话ID被发送到攻击者的网站,使得攻击者能够劫持用户当前会话。
内容安全策略 (CSP)
内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是恶意软件,这些攻击都是主要的手段。
CSP 被设计成完全向后兼容(除CSP2 在向后兼容有明确提及的不一致外)。不支持CSP的浏览器也能与实现了CSP的服务器正常合作,反之亦然:不支持 CSP 的浏览器只会忽略它,如常运行,默认为网页内容使用标准的同源策略。如果网站不提供 CSP Header,浏览器将使用标准的同源策略。
为使CSP可用, 你需要配置你的网络服务器返回 Content-Security-Policy HTTP Header ( 有时你会看到一些关于X-Content-Security-Policy Header的提法, 那是旧版本,你无须再如此指定它)。
除此之外, 元素也可以被用来配置该策略, 例如:
1 |
|
上下文敏感数据编码(XSS编码与绕过)
对于了解Web安全的朋友来说,都知道XSS这种漏洞,其危害性不用强调。一般对于该漏洞的防护有两个思路:一是过滤敏感字符,诸如【<,>,script,'】等,另一种是对敏感字符进行html编码,诸如php中的htmlspecialchars()函数。
一般情况,正确实施这两种方案之一就可以有效防御XSS漏洞了。但其实也会有一些场景,即使实施了这两种方案,攻击者也可以绕过防护,导致XSS漏洞被利用。
场景一:XSS注入点在某个html标签属性中,代码片段如下:
可以看到,这里防护措施采用的是方案一:过滤敏感字符。这里如果输入javascript:alert (11),是会被过滤掉的,输出的内容会是:
场景二:XSS注入点在js标签中,代码片段如下:
这里采用的防护措施是第二种,即使用php内置函数htmlspecialchars对敏感字符进行编码。如果输入正常的payload,如:,是不会有弹窗的,此时浏览器的输出如下图:
这里的敏感字符< >,已经被html编码了,最后在
下图是js编码后的payload:
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。
可利用性:难
对反序列化的利用非常困难。因为在不更改或调整底层可被利用代码的情况下,现成的反序列化漏洞很难被使用。
可检测性:一般
有些工具可以被用于发现反序列化缺陷,但经常需要人工帮助来验证发现的问题。希望有关反序列化缺陷的普遍性数据将随着工具的开发而被更多的识别和解决。
技术影响:严重
反序列化缺陷的影响不能被低估。它们可能导致远程代码执行攻击,这是可能发生的最严重的攻击之一。
自查:您的应用程序脆弱吗?
如果反序列化进攻者提供恶意代码或者被篡改过的对象,将会使整个应用程序和API变的脆弱,这可能会导致以下两种主要类型的攻击:
在应用程序中,序列化可能被用于:
如何防止?
唯一安全的架构模式是:不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体。 如果上述均无法实现,请考虑使用下面的方法:
攻击案例场景
场景 #1:一个React应用程序调用了一组Spring Boot微服务,为了确保原有的代码不变,解决方法是序列化用户状态,并在每次请求时来回传递。这时,攻击者可利用“R00”Java对象签名,并使用Java Serial Killer工具在应用服务器上获得远程代码执行。
场景 #2:一个PHP论坛使用PHP对象序列化来保存一个“超级”cookie。该cookie包含了用户的ID、角色、密码哈希和其他状态:
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user"; i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
攻击者可以更改序列化对象以授予自己为admin权限:
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin"; i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组件和API会破坏应用程序的防御手段,造成各种攻击并产生严重影响。
不足的日志记录和监控,以及事件响应缺失或无效的集成,使攻击者能够进一步攻击系统,并篡改、提取或销毁数据。大多数缺陷研究显示,缺陷被检测出的时间超过200天,且通常通过外部检测方检测,而不是通过内部流程或监控检测。
a) ZAP Tools
b) 静态代码分析
以上便是从本次公开课分享——“WebApp 安全风险与防护(系列二)”中截取的部分内容,相信一定能对您的WebApp应用程序安全防护有所帮助。