OWASP TOP 10等常见漏洞
OWASP介绍
- 官网:http://www.owasp.org.cn/
- OWASP TOP10 指出了 WEB 应用面临最大风险的 10 类问 题,是目前 WEB 应用安全方面最权威的项目。
- OWASP 是一个开源的、非盈利全球性安全组织,致力于应用软件的安全研究。 OWASP 的使命是应用软件更加安全,使企业和组织能够对应用安全风险作出更清晰的决策。 目前 OWASP 全球拥有 140 个分会近四万名员,共同推动了安全标准、安全测试工具、安全指导手册等应用安全技术的发展。
OWASP TOP 10
- A1:2017 注入
- A2:2017 失效的身份认证
- A3:2017 敏感数据泄露
- A4:2017 XML外部实体
- A5:2017 失效的访问控制
- A6:2017 安全配置错误
- A7:2017 跨站请求脚本(XSS)
- A8:2013 跨站请求伪造(CSRF)
- A8:2017 不安全的反序列化
- A9:2017 使用含有已知漏洞的组件
- A10:2017 不足的日志记录和监控
A1:2017 注入
注入:用户的输入被当成命令/代码执行或者解析了
将不受信用的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。
用户的输入并非固定位置,可能存在于:
- 输入框
- 搜索栏
- 提交表单
- URL链接
- 所有的GET/POST请求的请求头和请求包头
- 留言
- 评论
- 几乎任何数据源都有可能成为注入载体,只要是能被发出的数据位置
可被执行的代码:
- SQL
- LDAP
- Xpath or NoSQL
- 系统命令
- XML语言
- SMTP包头
- 表达式语句
- ORM查询语句
- 危害:该代码能做什么即是危害
A1:2017 注入-SQL注入攻击
动态页面有时会通过脚本引擎将用户输入的参数按照预先设定的规则构造成SQL语句来进行数据库操作,SQL注入攻击指的是通过构造特殊的输入作为参数传入Web应用程序,改变原有的SQL语句的语义来执行攻击者所要的操作,其主要原因是程序没有采取必要的措施避免用户输入内容改变原有SQL语句的语义
SQL注入的危害:
- 绕过登陆验证:使用万能密码登陆网站后台等
- 获取敏感数据:获取网站管理员账号、密码等
- 文件系统操作:列目录、读取或写入文件等
- 注册表操作:读取、写入、删除注册表等
- 执行系统命令:远程执行命令
A1:2017注入-命令注入攻击
WEB应用代码中,有时会允许接收用户输入一段代码,之后在web应用服务器上执行这段代码并将结果返回给用户,如果这段代码没有进行限制,用户就可能执行恶意代码
A2:2017 失效的身份认证(业务逻辑漏洞)
因为代码或者逻辑缺陷,导致绕过登陆或匿名顶替登陆等
通常通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份
通常漏洞存在形式:
- 暴力破解登陆
- 撞库
- 默认口令
- 二次校验失效
- 数据明文传输
- URL暴露会话ID
- 用户登陆后不会更换会话ID(固定会话攻击)
- 会话不失效
Eg:绕过验证-容易密码重置
在手机找回密码选项中,用户输入手机号获取验证码,但是程序员却把验证码发送回了客户端,通过抓包获取验证码即可完成任意账号的密码重置
A3:2017 敏感数据泄露
许多WEB应用程序和API都无法正确保护敏感数据,如:财务数据、医疗数据和PII数据。攻击者可以通过窃取或修改未加密的数据来实施信用卡诈骗、身份盗窃或其他犯罪行为。未加密的敏感数据容易受到破坏,因此,我们需要对敏感数据加密,这些数据包括:传输过程中的数据、存储的数据以及浏览器的交互数据
攻击案例场景
- 一个应用程序使用自动化的数据加密系统加密信用卡信息,并存储在数据库中。但是,当数据被检索时被自动解密,这就使得SQL注入漏洞能够以明文形式获取所有信用卡卡号
- 一个网站上对所有网页没有使用或强制使用TLS,或者使用弱加密。攻击者通过检测网络流量(如:不安全的无线网络),将网络连接从HTTPS降到HTTP,就可以截取请求并窃取用户会话cookie。之后攻击者可以复制用户cookie并成功劫持经过认证的用户会话、访问或修改用户个人信息。除此之外,攻击者还可以更改所有传输过程中的数据,例如:转款的接受者
- 密码数据库使用未加盐的哈希算法或弱哈希算法去存储每个人的密码,一个文件上传漏洞能使黑客获取密码文件。所有这些未加盐的哈希密码通过彩虹表暴力破解方式破解,由简单或快速散列函数生成加盐的哈希也可以通过GPU破解
A4:2017 XML外部实体(XXE)
许多较早的或配置错误的XML处理器评估了XML文件中的外部实体应用。攻击者可以利用外部实体窃取使用URI文件处理器的内部文件和共享文件、监听内部扫描端口、执行远程代码和实施拒绝服务攻击。
XML是一种类似HTML的标记性语言:可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
Eg:URL?xml=
http://10.10.10.30/xml/example1.php?xml=<!DOCTYPE foo [<!ENTITY xxebbsjl SYSTEM "file:///etc/passwd"> ]><test>123&xxebbsjl;</test>
A5:2017 失效的访问控制(业务逻辑漏洞)
失效的访问控制就是越权访问漏洞
未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的账户、查看敏感文件、修改其他用户数据、更改访问权限等
垂直越权:
低权限用户可以访问更高权限才能访问的页面
水平越权:
同级别权限用户的权限控制失效
A6:2017 安全配置错误
安全配置错误通常是由于不安全的默认配置、不完整的临时配置、开源云存储、错误的HTTP标头配置以及包含敏感信息的详细错误信息所造成的。因此,我们不仅需要对所有的操作系统、框架、库和应用程序进行安全配置,而且必须及时修补和升级它们。
可能受到攻击的应用程序:
-
缺少适当的安全加固、云服务的权限配置错误
-
应用程序启用或安装了不必要的功能(端口、服务、网页、账户或权限等)
-
默认账户的密码仍然没有更改
-
错误处理机制向用户披露堆栈跟踪或其他大量错误信息
-
对于更新的系统,禁用或不安全地配置最新的安全功能
-
应用程序服务器、应用程序框架(如:Struts、Spring、ASP.NET)、库文件、数据库等没有进行安全配置
-
服务器不发送安全标头或指令,或未对服务器进行安全配置
-
应用软件已过期或易受攻击
缺少一个体系的、可重复的应用程序安全配置过程,系统将处于高风险中
防止手段:应实施安全的安装过程,包括
- 一个可以快速且易于部署在另一个锁定环境的可重复的加固过程。开发、质量保证和生产环境都应该进行相同配置,并且在每个环境中使用不同的密码。这个过程应该是自动化的,以尽量减少安装一个新安全环境的耗费
- 搭建最小化平台,该平台不包含任何不必要的功能、组件、文档和示例。移除或不安装不适用的功能和框架
- 检查和修复安全配置项来适应最新的安全说明、更新和补丁,并将其作为更新管理过程的一部分,在检查过程中应特别注意云存储权限(如:S3桶权限)
- 一个能在组件和用户间提供有效的分离和安全性的分段应用程序架构,包括:分段、容器化和云安全组
- 向客户端发送安全指令,如:安全标头
- 在所有环境中能够进行正确安全配置和设置自动化过程
A7:2017 跨站脚本(XSS)
当应用程序的新网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建HTML或JavaScript的浏览器API更新现有的网页时,就会出现XSS缺陷。XSS让攻击者能够在受害者的浏览器中执行脚本并劫持用户会话、破坏网站或将用户重定向到恶意站点
存在三种XSS类型,通常针对用户的浏览器:
- 反射式XSS:应用程序或API包括未经验证和未转义的用户输入,作为HTML输出的一部分。一个成功的攻击可以让攻击者在受害者的浏览器执行任意的HTML和JavaScript。通常,用户将需要与指向攻击者控制页面的某些恶意链接进行交互,如恶意漏洞网站,广告等
- 存储式XSS:你的应用或API将未净化的用户输入存储下来了,并在后期在其他用户或者管理员的页面展示出来。存储型XSS一般被认为是高危或严重的风险
- 基于DOM的XSS:会动态的将攻击者可控的内容加入页面的JavaScript框架、单页面程序或API存在这种类型的漏洞。理想的来说,你应该避免将攻击者可控的数据发送给不安全的JavaScript API
典型的XSS攻击可导致盗取session、账户、绕过MFA、DIV替换、对用户浏览器的攻击(如:恶意软件下载、键盘记录)
A8:2013 跨站请求伪造(CSRF)
一个跨站请求伪造攻击迫使登陆用户的浏览器将伪造的HTTP请求(包括该用户的会话cookie和其他认证信息)发送到一个存在漏洞的web应用程序。这就允许了攻击者迫使用户浏览器向存在漏洞的应用程序发送请求,而这些请求会被应用程序认为是用户的合法操作
A8:2017 不安全的反序列化
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们进行攻击(重播攻击、注入攻击和特权升级攻击)
对反序列化的利用是有点困难的。因为在不更改或调整底层可被利用代码的情况下,现场的反序列化漏洞很难被使用
可能的两种主要攻击类型:
- 如果应用中存在可以在反序列化过程中或者之后被改变行为的类,则攻击者可以通过改变应用逻辑或者实现远程代码执行攻击。我们将其称为对象和数据结构攻击
- 典型的数据篡改攻击,如访问控制相关的攻击,其中使用了现有的数据结构,但内容发生了变化
Eg:PHP反序列化
#unserialize.php
<html>
<head>
<title>PHP反序列化 </title>
</head>
<body>
<?php
class A{
var $a = "test"
function __destruct(){
$fp = fopen("D:\\phpStudyphpStudy\\WWW\\hello.php","w");
fputs($fp,$this->a);
fclose($fp);
}
}
$test = $_POST['test'];
$test_unser unser= unserialize ($test);
?>
</body>
</html>
A9:2017 使用含有已知漏洞的组件
组件(库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成严重的数据丢失或服务器接管。同时,使用含有已知漏洞的组件的应用程序和API可能会破坏应用程序防御、造成各种攻击并产生严重影响
对于一些漏洞很容易找到其利用程序,但对其他的漏洞则需要定制开发
这种安全漏洞普遍存在。基于组件开发的模式使得多数开发团队根本不了解其应用或API中使用的组件,更谈不上及时更新这些组件了
经常爆出漏洞的组件:
- Weblogic
- Strust-2
Eg:某SCADA系统使用含有已知漏洞的Strusts组件可执行任意命令