第六章
1. 在测试一个使用joe和pass证书登录的Web应用程序的过程中,在登录阶段,在拦截代理服务器上看到一个要求访问以下URL的请求:
http://www.wahh-app.com/app?action=login&uname=joe&password=pass
如果不再进行其他探测,可以确定哪3种漏洞?
2. 自我注册功能如何会引入用户名枚举漏洞?如何防止这些漏洞?
3. 某登录机制由以下步骤组成:
(a) 应用程序要求用户提交用户名和密码;
(b) 应用程序要求用户提交值得纪念的词中的两个随机选择的字母。
应用程序为何要求用户分两个阶段提供所需的信息?如果不这样做,登录机制将存在什么缺陷?
4. 一个多阶段登录机制要求用户首先提交用户名,然后在后续阶段中提交其他信息。如果用户提交了任何无效的数据,将立即返回到第一个阶段。
这种机制存在什么缺点?如何修复这种漏洞?
5. 应用程序在登录功能中整合了反钓鱼机制。在注册过程中,每名用户从应用程序提供的大量图片中选择一幅特殊的图片。登录机制由以下步骤组成:
(1) 用户输入其用户名和出生日期;
(2) 如果这些信息无误,应用程序向用户显示他们选择的图片,如果信息有误,则随机显示一幅图片;
(3) 用户核实应用程序显示的图片,如果图片正确,则输入他们的密码。
反钓鱼机制的作用在于:它向用户确认,他们使用的是真实而非“克隆”的应用程序,因为只有真正的应用程序才能显示正确的图片。
反钓鱼机制给登录功能造成什么漏洞?这种机制是否能够有效阻止钓鱼攻击?
攻击者可以利用反钓鱼机制将用于猜测有效证书的过程划分成两个阶段。攻击者可以通过两次完成步骤(1)来核实特定用户名和出生日期是否有效。如果两次返回了同一幅反钓鱼图片,则说明猜测的证书肯定有效;否则即无效。攻击者可以通过脚本攻击迅速遍历目标用户的所有出生日期,从而猜测出正确的值。
更糟糕的是,这种机制并不能有效阻止钓鱼攻击。克隆Web应用程序将收到用户在步骤(1)中提交的用户名和出生日期,并可以将这些信息直接提交给原始应用程序,以获取在步骤(2)中向用户显示的正确图片。如果告知用户通过该图片来核实应用程序的真实性,则这种机制实际上可能会起到反作用,并可能导致用户登录他们在其他情况下并不会信任的钓鱼网站。
第7章
1. 登录一个应用程序后,服务器建立以下cookie:
Set-cookie: sessid=amltMjM6MTI0MToxMTk0ODcw
一个小时后,再次登录并得到以下cookie:
Set-cookie: sessid=amltMjM6MTI0MToxMTk0ODc1
通过这些cookie,可以得出什么推论?
jim23:1241:1194875132
解码后的cookie包含三个以分号分隔的数据项。初看来,这三个值可能包含用户名、数字用户标识和一个不断变化的数值。最后一项包含10个数字,看起来像一个Unix时间值。转换这两个值后得到以下信息:
Mon, 12 Nov 2007 12:34:23 UTC
Mon, 12 Nov 2007 13:45:32 UTC
这表示创建会话的时间。
2. 某个应用程序使用由6个字符组成的数字字母会话令牌和由5个字符组成的数字字母密码。它们全都由某种无法预测的算法随机生成。其中哪一个最有可能成为蛮力猜测攻击的目标?列出影响你做出决策的各种不同因素。
简言之,这个问题并没有确定的答案。哪一个是最有价值的目标,将取决于你的目的和应用程序的其他因素。如果许多用户都已登录并且只需要攻破其中一位用户,则最好是针对会话实施攻击。如果希望攻破某个极少登录的管理账户,则实施密码猜测攻击会更加有效。
3. 登录位于以下URL的一个应用程序后:
https://foo.wahh-app.com/login/home.php
服务器建立以下cookie:
Set-cookie: sessionId=1498172056438227; domain=foo.wahhapp.
com; path=/login; HttpOnly;
然后访问下面的URL。浏览器会将sessionId cookie提交给哪些URL?(选出全部答案。)
(1) https://foo.wahh-app.com/login/myaccount.php
(2) https://bar.wahh-app.com/login
(3) https://staging.foo.wahh-app.com/login/home.php
(4) http://foo.wahh-app.com/login/myaccount.php
(5) http://foo.wahh-app.com/logintest/login.php
(6) https://foo.wahh-app.com/logout
(7) https://wahh-app.com/login/
(8) https://xfoo.wahh-app.com/login/myaccount.php
是。其中的域和路径均与cookie范围相匹配。
(2) 否。其中的域与cookie的域范围不同,也不是它的子域。
(4) 是。其中的域和路径均与cookie范围相匹配。虽然采用了HTTP协议,但并未指定secure标记,因此仍然会传送该cookie。
(5) 是。其中的域与cookie范围相匹配。由于路径范围在/login后并没有斜线,因此,该范围将不仅包括路径/login/,而且包括任何其他与/login前缀匹配的路径。
(6) 否。其中的路径与cookie范围不匹配。
(7) 否。其中的域是在范围中指定的域的父域。
(8) 否。其中的域与cookie的域范围不同,也不是它的子域。
4. 所针对的应用程序除使用主会话令牌外,还使用每页面令牌。如果收到一个不按顺序发送的每页面令牌,整个会话将被终止。假设发现了某种缺陷,可通过它预测或截获应用程序发布给当前正在访问应用程序的其他用户的令牌,那么是否能够劫持他们的会话?
5. 登录一个应用程序后,服务器建立以下cookie:
Set-cookie: sess=ab11298f7eg14;
单击“退出”按钮后,应用程序执行以下客户端脚本:
document.cookie=”sess=”;
document.location=”/”;
通过这种行为,可以得出什么结论?
退出功能存在缺陷。
上述脚本将使浏览器中当前保存的会话令牌失效,也就是说,随后的任何请求将不会提交之前的令牌值。然后,该脚本将启动一个指向应用程序起始页面的重定向。任何访问受保护功能的尝试将遭到拒绝,因为相关请求并不属于通过验证的会话的一部分。
但是,客户端应用程序并未将已执行了退出操作这一信息传达给服务器。服务器上的用户会话将仍处于活动状态,如果将之前发布的令牌提交给服务器,服务器将继续接受该令牌。在会话超时或以其他方式被清除之前,这种情况会一直持续。在这段时间内,已通过某种方式截获或猜测出令牌值的攻击者就可以继续使用令牌来劫持用户的会话。
第8章
1. 一个应用程序可能通过使用HTTP Referer消息头实施访问控制,但它的正常行为并没有公开表露这一点。如何检测出这种缺陷?
2. 登录一个应用程序后,被重定向到以下URL:
https://wahh-app.com/MyAccount.php?uid=1241126841
应用程序似乎向MyAccount.php页面提交一个用户标识符。已知的唯一标识符是自己的标识符。如何测试应用程序是否使用这个参数以不安全的方式实施访问控制?
使用相同的语法格式将uid值修改为其他值。如果应用程序仍然返回你自己的账户资料,则说明应用程序可能不易于受到攻击。
(2) 如果能够注册或以其他方式访问另一个用户账户,可以使用该账户登录以获得其他用户的uid值。然后使用自己的原始用户权限,并用这个新uid值替代自己的uid值;如果这时应用程序显示有关其他用户的敏感数据,则说明应用程序易于受到攻击。
(3) 使用一段脚本从自己的uid获得数千个值,并确定(如果提交这些值)应用程序是否会返回任何其他用户的资料。
3. 因特网上的一个Web应用程序通过检查用户的来源IP地址实施访问控制。为什么这种行为可能存在缺陷?
在这种情况下,要使基于IP的访问控制发挥效率,一种方法是将其作为深层防御措施,以确保尝试访问管理功能的用户位于组织的内部网络中。当然,那些功能还应由强大的身份验证和会话处理机制进行保护。
4. 某应用程序的唯一用途是为公众提供可搜索的信息仓库。该应用程序并未使用任何验证或会话管理机制。该应用程序应执行何种访问控制?
5. 在浏览一个应用程序的过程中遇到几个应防止未授权访问的敏感资源,它们的文件扩展名为.xls。这种情况为何应立即引起注意?
这些文件为Excel电子表格,它们属于静态资源,应用程序无法对其实施任何访问控制(如通过动态脚本)。应用程序可能会通过其他方法(如Web服务器层)来保护这些资源,但通常情况下并非如此。应立即检查是否可以不经验证而访问这些资源。
第9章
1. 如果要通过实施UNION攻击、利用SQL注入漏洞获取数据,但是并不知道最初的查询返回的列数,如何才能查明这个值?
' UNION SELECT NULL, NULL--
' UNION SELECT NULL, NULL, NULL--
请注意,在Oracle上,需要在上述每种情况的最后一个NULL后添加FROM DUAL。
' ORDER BY 2--
' ORDER BY 3--
2. 已经确定一个字符串参数中的SQL注入漏洞,已经确信数据库为MS-SQL或Oracle,但当前无法获得任何数据或错误消息确定到底是哪个数据库。如何才能查明这一点?
一种确认数据库类型的简单方法,是使用数据库特定的字符串串联语法在所控制的查询中构建某个良性输入。例如,如果原始参数值为London,则可以轮流提交以下数据项:
'||' London
'+'London
如果第一个数据项导致和原始参数值相同的行为,说明数据库可能为Oracle。如果第二个数据项导致和原始参数值相同的行为,说明数据库可能为MS-SQL。
3. 已经在应用程序的许多位置提交了一个单引号,并通过得到的错误消息确定几个潜在的SQL注入漏洞。下列哪一种方法能够以最快的速度确定专门设计的输入是否会对应用程序的处理过程造成影响?
(a) 注册一个新用户
(b) 更新个人资料
(c) 注销服务
也就是,我们不可能提前确定某个功能会执行哪些语句;在执行测试之前,应向应用程序所有者警告可能导致的风险。
4. 在登录功能中发现了一个SQL注入漏洞,并尝试使用输入' or 1=1--来避开登录,但攻击没有成功,生成的错误消息表明--字符串被应用程序的输入过滤删除。如何解决这个问题?
5. 已经发现了一个SQL注入漏洞,但由于应用程序允许任何包含空白符的输入,因而无法实施任何有效的攻击。如何解除这种限制?
'UNIONSELECTusername,passwordFROMusers--
6. 在将其合并到SQL查询之前,应用程序并不配对用户输入中出现的所有单引号。假设已经在一个数字字段中发现了一个SQL注入漏洞,但需要在攻击有效载荷中使用一个字符串值。不使用单引号,如何在查询中插入字符串?
CHAR(70)||CHAR(79)||CHAR(79)
7. 在极少数情况下,应用程序在用户提交的输入中使用参数化查询,以不安全的方式建立动态SQL查询。什么时候会出现这种情况?
8. 假设已经提升了在应用程序中的权限,现在完全拥有管理员访问权限,这时如果在某个用户管理功能中发现了一个SQL注入漏洞,如何利用这个漏洞进一步扩大攻击范围?
9. 在攻击一个并未保存任何敏感数据、也未实施任何身份验证或访问控制机制的应用程序的情况下,如何排列下列漏洞的重要性?
(a) SQL注入
(b) XPath注入
(c) OS命令注入
XPath注入仅可用于从目标XML文件中检索数据。因此,如果应用程序不包含任何敏感数据,则这种漏洞并不会导致严重的后果。同样,利用SQL注入漏洞并不能从数据库中提取任何敏感数据。但是,有时可以利用这类攻击提升在数据库中的权限,并以其他方式实施攻击。
在某些情况下,SQL注入漏洞可能是一个更加严重的漏洞。另一方面,OS命令注入则始终是一个高风险的漏洞,因为攻击者可以利用它直接攻破基础服务器,并可将其作为针对内部系统的其他攻击的起点。
10. 假如正在检测一个允许搜索个人资料的应用程序功能,并且怀疑该功能正访问某数据库或Active Directory后端。如何确定到底是哪一种情况?
第10章
1. 某网络设备提供用于执行设备配置的Web界面。为什么这种功能通常易于受到操作系统命令注入攻击?
2. 在测试以下URL时:
http://wahh-app.com/home/statsmgr.aspx?country=US
将country参数的值更改为foo导致了以下错误消息:
Could not open file: D:\app\default\home\logs\foo.log (invalid file).
可以采取哪些步骤对应用程序实施攻击?
3. 在对一个在POST请求中以XML格式传送数据的应用程序进行测试时,可以利用哪种漏洞从服务器的文件系统中读取任意文件?要成功实施攻击,必须满足哪些先决条件?
(a) 应用程序使用的XML解释器必须支持外部实体;
(b) 应用程序必须在其响应中回显请求中的XML元素的内容。
4. 向ASP.NET平台上运行的应用程序提出以下请求:
POST /home.aspx?p=urlparam1&p=urlparam2 HTTP/1.1
Host: wahh-app.com
Cookie: p=cookieparam
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
p=bodyparam
应用程序执行以下代码:
String param = Request.Params[“p”];
请问param变量的值是什么?
5. HPP是HPI的前提,还是HPI是HPP的前提?
严格来说,这两种攻击都不是对方的前提。
虽然HPI攻击通常包含HPP,但这不是必须的。例如,HPI攻击可能会将某个全新的参数注入到后端请求中,以干扰应用程序的处理过程。但这种类型的攻击并不依赖于应用程序在处理多个同名参数时表现的任何特殊行为。
通常,HPP攻击可以不包括HPI,特别是在对用户输入执行多层处理的情况下。例如,一些针对Internet Explorer XSS过滤器的攻击使用HPP技巧,但并不在后端请求中注入任何参数。
6. 某应用程序包含一项功能,该功能向外部域提出请求,并返回这些请求的响应。为防止服务器端重定向攻击检索应用程序自己的Web服务器上的受保护资源,应用程序阻止了以localhost或127.0.0.1为目标的请求。如何突破这种防御,以访问服务器上的资源?
(a) 127.1
(b) 127.000.0.1
(c) 127.0.0.0 A类子网中的任何其他地址
(d) 这些表示形式的二进制或八进制变体,如017700000001
7. 某应用程序使用一项用于用户提交反馈的功能。该功能允许用户提交他们的电子邮件地址、邮件主题及详细的反馈。然后,应用程序以用户提交的主题和反馈为邮件正文,从用户的电子邮件地址向feedback@wahh-app.com发送一封电子邮件。以下哪一种方法能够有效防御邮件注入攻击?
(a) 在邮件服务器上禁用邮件中继。
(b) 使用feedback@wahh-app.com硬编码RCPT TO字段。
(c) 确保用户提交的输入不包含任何换行符或其他SMTP元字符。
针对此应用程序功能的邮件注入攻击不需要邮件服务器支持邮件中继。如果其他邮件标头包含用户可控制的输入,硬编码RCPT TO字段也无法防范邮件注入,因为攻击者可以使用另一个RCPT TO行注入另一个收件人。在这种情况下,最有效的防御是严格确认所有用户提交的输入,以确保其中不包含任何转行符或其他SMTP元字符。