4.4.4
测试绕过身份验证架构
ID |
---|
WSTG-ATHN-04 |
总结
在计算机安全中,身份验证是尝试验证通信发送者的数字身份的过程。此类过程的一个常见示例是登录过程。测试身份验证架构意味着了解身份验证过程的工作原理,并使用该信息来规避身份验证机制。
虽然大多数应用程序都需要身份验证才能访问私人信息或执行任务,但并非每种身份验证方法都能够提供足够的安全性。疏忽、无知或对安全威胁的简单轻描淡写通常会导致身份验证方案,只需跳过登录页面并直接调用应该仅在执行身份验证后才能访问的内部页面,从而绕过这些方案。
此外,通常可以通过篡改请求和诱骗应用程序认为用户已经过身份验证来绕过身份验证措施。这可以通过修改给定的 URL 参数、操作表单或伪造会话来实现。
与身份验证架构相关的问题可以在软件开发生命周期 (SDLC) 的不同阶段发现,例如设计、开发和部署阶段:
- 在设计阶段,错误可能包括对要保护的应用程序部分的错误定义、选择不应用强加密协议来保护凭据传输等等。
- 在开发阶段,错误可能包括输入验证功能的错误实现或未遵循特定语言的安全最佳实践。
- 在应用程序部署阶段,由于缺乏所需的技术技能或缺乏良好的文档,在应用程序设置(安装和配置活动)期间可能会出现问题。
测试目标
- 确保将身份验证应用于所有需要身份验证的服务。
如何测试
有几种方法可以绕过 Web 应用程序使用的身份验证架构:
- 直接页面请求(强制浏览)
- 参数修改
- 会话 ID 预测
- SQL注入
直接页面请求
如果 Web 应用程序仅在登录页面上实现访问控制,则可以绕过身份验证架构。例如,如果用户通过强制浏览直接请求其他页面,则该页面在授予访问权限之前可能不会检查用户的凭据。尝试通过浏览器中的地址栏直接访问受保护的页面,以使用此方法进行测试。
Figure 4.4.4-1: 直接请求受保护页面
参数修改
与身份验证设计相关的另一个问题是,当应用程序根据固定值参数验证登录是否成功时。用户可以修改这些参数以访问受保护区域,而无需提供有效的凭据。在下面的示例中,“authenticated”参数更改为值“yes”,这允许用户获得访问权限。在此示例中,参数位于 URL 中,但也可以使用代理来修改参数,尤其是当参数在 POST 请求中作为表单元素发送时,或者当参数存储在 cookie 中时。
.asp?authenticated=noraven@blackbox /home $nc www.site 80
GET /page.asp?authenticated=yes HTTP/1.0HTTP/1.1 200 OK
Date: Sat, 11 Nov 2006 10:22:44 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=iso-8859-1<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
</HEAD><BODY>
<H1>You Are Authenticated</H1>
</BODY></HTML>
Figure 4.4.4-2: 参数修改请求
会话 ID 预测
许多 Web 应用程序使用会话标识符(会话 ID)来管理身份验证。因此,如果会话 ID 生成是可预测的,则恶意用户可能能够找到有效的会话 ID,并冒充以前经过身份验证的用户,未经授权访问应用程序。
在下图中,Cookie 中的值呈线性增加,因此攻击者很容易猜测有效的会话 ID。
Figure 4.4.4-3: 随时间变化的 Cookie 值
在下图中,Cookie 中的值仅部分更改,因此可以将暴力攻击限制为如下所示的定义字段。
Figure 4.4.4-4: 部分更改的 Cookie 值
SQL注入(HTML表单身份验证)
SQL注入是一种广为人知的攻击技术。本节不打算详细描述此技术,因为本指南中有几个部分解释了本节范围之外的注射技术。
Figure 4.4.4-5: SQL 注入
下图显示,通过简单的 SQL 注入攻击,有时可以绕过身份验证表单。
Figure 4.4.4-6: 简单 SQL 注入攻击
PHP Loose ComparisonPHP 松散比较
如果攻击者能够通过利用先前发现的漏洞(例如,目录遍历)或从 Web 存储库(开源应用程序)检索应用程序源代码,则有可能对身份验证过程的实现执行精细攻击。
在以下示例(PHPBB 2.0.12 - 身份验证绕过漏洞)中unserialize()
,该函数在第 2 行解析用户提供的 cookie 并在数组中设置 $sessiondata
值。在第 7 行,将存储在后端数据库 ($auto_login_key
) 中的用户 MD5 密码哈希值与用户提供的密码 ($sessiondata['autologinid']
)进行比较。
1. if (isset($HTTP_COOKIE_VARS[$cookiename . '_sid'])) {
2. $sessiondata = isset($HTTP_COOKIE_VARS[$cookiename . '_data']) ? unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data'])) : array();
3. $sessionmethod = SESSION_METHOD_COOKIE;
4. }
5. $auto_login_key = $userdata['user_password'];
6. // We have to login automagically
7. if( $sessiondata['autologinid'] == $auto_login_key )
8. {
9. // autologinid matches password
10. $login = 1;
11. $enable_autologin = 1;
12. }
在 PHP 中,字符串值和 true
布尔值之间的比较总是 true
(因为字符串包含一个值),因此通过向函数提供以下字符串unserialize()
,可以绕过身份验证控制并以管理员身份登录,userid
为 2:
a:2:{s:11:"autologinid";b:1;s:6:"userid";s:1:"2";} // original value: a:2:{s:11:"autologinid";s:32:"8b8e9715d12e4ca12c4c3eb4865aaf6a";s:6:"userid";s:4:"1337";}
让我们拆解一下我们在这个字符串中做了什么:
-
autologinid
现在是一个布尔值设置为true
: 这可以通过将密码哈希(s:32:"8b8e9715d12e4ca12c4c3eb4865aaf6a"
)的 MD5 值替换为b:1
-
userid
现在设置为管理员 ID:这可以在字符串的最后一部分看到,我们将常规用户 ID (s:4:"1337"
) 替换为s:1:"2"
工具
- WebGoat
- OWASP Zed Attack Proxy (ZAP)
引用
- Niels Teusink: phpBB 2.0.12 authentication bypass
- David Endler: “Session ID Brute Force Exploitation and Prediction”
更多推荐
4.4.4
发布评论