《黑客攻防技术宝典:Web实战篇》习题答案(二)

第六章

1. 在测试一个使用joepass证书登录的Web应用程序的过程中,在登录阶段,在拦截代理服务器上看到一个要求访问以下URL的请求:

http://www.wahh-app.com/app?action=login&uname=joe&password=pass

如果不再进行其他探测,可以确定哪3种漏洞?
    (a)
由于证书在该URL的查询字符串中传送,因此,这些证书将面临通过浏览器历史记录、Web服务器和IDS日志或直接在屏幕上显示而遭到未授权泄露的风险。
    (b)
证书通过未加密HTTP连接传送,因而易于被位于网络适当位置的攻击者拦截。
    (c)
密码为一个包含四个小写字母的英文单词。应用程序并未实施任何有效的密码强度规则。

2. 自我注册功能如何会引入用户名枚举漏洞?如何防止这些漏洞?
    
通常,自我注册功能非常易于受到用户名枚举攻击,因为用户可以选择自己的用户名,并且应用程序不允许用户注册现有用户名。
    
应用程序可以通过以下两种方法防止攻击者通过滥用自我注册功能来实施用户名枚举攻击:
    (a)
应用程序可以生成自己的用户名,然后在每名新用户提交了所需的个人信息后向其分配一个无法预测的用户名。
    (b)
可以在自我注册过程的第一个步骤要求用户输入他们的电子邮件地址。然后,应用程序向用户发送一封电子邮件,该邮件包含一个URL,用户可以使用该URL继续注册过程。如果提供的电子邮件已注册,则在电子邮件中向用户通知这一情况。

3. 某登录机制由以下步骤组成:

(a) 应用程序要求用户提交用户名和密码;

(b) 应用程序要求用户提交值得纪念的词中的两个随机选择的字母

应用程序为何要求用户分两个阶段提供所需的信息?如果不这样做,登录机制将存在什么缺陷?
    
要求用户提交值得纪念的词中的两个随机选择的字母,而不是整个单词,其原理在于:即使攻击者截获了用户在一次登录过程中提交的所有证书,他仍然无法使用这些证书再次登录,因为这时应用程序会要求用户提交另外两个字母。
    
如果应用程序在一个步骤中要求用户提交全部所需信息,那么它必须提前选定随机选择的字母,而此时它并不知道正在进行验证的用户的身份。这意味着,即使攻击者只知道值得纪念的词中的两个字母,他仍然可以通过重复加载登录表单,直到应用程序请求那两个单词,从而使用截获的证书登录。
    
为避免这种缺陷,应用程序必须在用户每次成功登录后选择另外两个单词,并将其存储在用户配置文件中,直到用户再次成功登录。当用户在登录的第一个阶段确认自己的身份后,将从用户配置文件中检索这两个字母,并要求用户提交相同的字母。这样,即使攻击者在一次登录中获取了用户证书,他仍然需要等待非常长的一段时间,直到应用程序再次要求用户提交相同的字母。

4. 一个多阶段登录机制要求用户首先提交用户名,然后在后续阶段中提交其他信息。如果用户提交了任何无效的数据,将立即返回到第一个阶段。

这种机制存在什么缺点?如何修复这种漏洞?
    
尝试猜测有效证书的攻击者可以轻松确定单个数据项是否有效。攻击者可以利用应用程序的这种行为将蛮力攻击问题细分成一系列单独的问题。
    
要避免这种漏洞,可以要求应用程序即使在攻击者提交了无效数据项后仍继续完成所有登录步骤,并在最后一个步骤完成后返回常规“登录失败”消息,而不论是哪个数据项导致了登录失败。这样做可以显著增加攻击者使用蛮力猜测用户证书时所需提交的请求数。

5. 应用程序在登录功能中整合了反钓鱼机制。在注册过程中,每名用户从应用程序提供的大量图片中选择一幅特殊的图片。登录机制由以下步骤组成:

(1) 用户输入其用户名和出生日期;

(2) 如果这些信息无误,应用程序向用户显示他们选择的图片,如果信息有误,则随机显示一幅图片;

(3) 用户核实应用程序显示的图片,如果图片正确,则输入他们的密码。

反钓鱼机制的作用在于:它向用户确认,他们使用的是真实而非“克隆”的应用程序,因为只有真正的应用程序才能显示正确的图片。

反钓鱼机制给登录功能造成什么漏洞?这种机制是否能够有效阻止钓鱼攻击?

攻击者可以利用反钓鱼机制将用于猜测有效证书的过程划分成两个阶段。攻击者可以通过两次完成步骤(1)来核实特定用户名和出生日期是否有效。如果两次返回了同一幅反钓鱼图片,则说明猜测的证书肯定有效;否则即无效。攻击者可以通过脚本攻击迅速遍历目标用户的所有出生日期,从而猜测出正确的值。

更糟糕的是,这种机制并不能有效阻止钓鱼攻击。克隆Web应用程序将收到用户在步骤(1)中提交的用户名和出生日期,并可以将这些信息直接提交给原始应用程序,以获取在步骤(2)中向用户显示的正确图片。如果告知用户通过该图片来核实应用程序的真实性,则这种机制实际上可能会起到反作用,并可能导致用户登录他们在其他情况下并不会信任的钓鱼网站。

 

7

1. 登录一个应用程序后服务器建立以下cookie

Set-cookie: sessid=amltMjM6MTI0MToxMTk0ODcwODYz;

一个小时后再次登录并得到以下cookie

Set-cookie: sessid=amltMjM6MTI0MToxMTk0ODc1MTMy;

通过这些cookie可以得出什么推论
    sessid cookie
包含一个Base64编码的字符串。解码收到的两个cookie可得到以下值:
    jim23:1241:1194870863

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个字符组成的数字字母密码。它们全都由某种无法预测的算法随机生成。其中哪一个最有可能成为蛮力猜测攻击的目标?列出影响你做出决策的各种不同因素。

    与由5个字符组成的密码相比,由6个字符组成的会话令牌的可能值要多得多。因此,似乎较短的密码是最有价值的攻击目标。

    但是,针对密码的蛮力攻击与针对会话令牌的蛮力攻击之间存在一些重要的差异。在尝试猜测密码时,必须同时提交用户名和密码,因此每个请求最多只能针对一个账户发动攻击,甚至可能无法针对任何账户发动攻击。你可能已经知道一些用户名,或者能够枚举出用户名,或者可能需要同时猜测用户名和密码。登录机制可能包含多个阶段,或者响应速度较慢。登录机制还可能实施了账户锁定机制,这会显著降低你的攻击速度。

    另一方面,在尝试猜测会话令牌时,通常可以同时针对多个用户。应用程序中可能有2020000位已登录用户。如果某位用户当前并未登录,则无法以这种方式对其实施攻击。在收到大量无效令牌时,应用程序根本没有办法实施任何类型的“锁定”。正常情况下,令牌猜测攻击的速度非常快,通常,包含无效令牌的请求会立即收到包含错误消息或重定向的响应。

简言之,这个问题并没有确定的答案。哪一个是最有价值的目标,将取决于你的目的和应用程序的其他因素。如果许多用户都已登录并且只需要攻破其中一位用户,则最好是针对会话实施攻击。如果希望攻破某个极少登录的管理账户,则实施密码猜测攻击会更加有效。

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

    (1)

是。其中的域和路径均与
cookie范围相匹配。

(2) 否。其中的域与cookie的域范围不同,也不是它的子域。
    (3)
是。其中的域是范围中指定的域的子域,且路径与范围相匹配。

(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消息头实施访问控制,但它的正常行为并没有公开表露这一点。如何检测出这种缺陷?
    选择一系列你有权访问的重要应用程序功能。通过提交经过修改的Referer消息头或不带该消息头的请求访问以上每一项功能。如果应用程序拒绝这些请求,则说明它很可能易于受到攻击。然后,尝试通过另一个不具有相关权限的用户提出相同的请求,但每次提交原始的Referer消息头。如果应用程序现在接受这些请求,则说明应用程序肯定易于受到攻击。

2. 登录一个应用程序后,被重定向到以下URL

https://wahh-app.com/MyAccount.php?uid=1241126841

应用程序似乎向MyAccount.php页面提交一个用户标识符。已知的唯一标识符是自己的标识符。如何测试应用程序是否使用这个参数以不安全的方式实施访问控制?

    应测试以下测试(按效率排序):

    (1)
使用相同的语法格式将
uid值修改为其他值。如果应用程序仍然返回你自己的账户资料,则说明应用程序可能不易于受到攻击。

(2) 如果能够注册或以其他方式访问另一个用户账户,可以使用该账户登录以获得其他用户的uid值。然后使用自己的原始用户权限,并用这个新uid值替代自己的uid值;如果这时应用程序显示有关其他用户的敏感数据,则说明应用程序易于受到攻击。

(3) 使用一段脚本从自己的uid获得数千个值,并确定(如果提交这些值)应用程序是否会返回任何其他用户的资料。
    (4)
使用一段脚本请求介于09999999999之间的随机uid值(在本示例中),并确定应用程序是否会返回任何其他用户的资料。

3. 因特网上的一个Web应用程序通过检查用户的来源IP地址实施访问控制。为什么这种行为可能存在缺陷? 
    
攻击者可以假冒其他用户的IP地址,虽然实际上要做到这一点可能极其困难。更重要的是,如果因特网上的多个终端用户位于同一Web代理服务器或NAT防火墙之后,则这些用户可能共享同一IP地址。

在这种情况下,要使基于IP的访问控制发挥效率,一种方法是将其作为深层防御措施,以确保尝试访问管理功能的用户位于组织的内部网络中。当然,那些功能还应由强大的身份验证和会话处理机制进行保护。

4. 某应用程序的唯一用途是为公众提供可搜索的信息仓库。该应用程序并未使用任何验证或会话管理机制。该应用程序应执行何种访问控制?
    
该应用程序并未对访问权限进行任何水平或垂直划分,因此没有必要实施访问控制来区分不同的个体用户。
    
即使所有用户均属于同一类别,应用程序仍然需要限制用户可以执行的操作。一个强健的解决方案是应用最低权限原则,以确保应用程序体系架构中的所有用户角色具有运行应用程序所需的最小权限。例如,如果用户只需要对数据的读取访问权限,则应用程序应使用一个低权限账户(仅具有对相关表的只读权限)来访问数据库。

5. 在浏览一个应用程序的过程中遇到几个应防止未授权访问的敏感资源,它们的文件扩展名为.xls。这种情况为何应立即引起注意?

这些文件为Excel电子表格,它们属于静态资源,应用程序无法对其实施任何访问控制(如通过动态脚本)。应用程序可能会通过其他方法(如Web服务器层)来保护这些资源,但通常情况下并非如此。应立即检查是否可以不经验证而访问这些资源。

 

9

1. 如果要通过实施UNION攻击、利用SQL注入漏洞获取数据,但是并不知道最初的查询返回的列数,如何才能查明这个值?
    
可以通过两个简单的方法确定列数。其一,可以SELECT每个列中的类型中性值NULL,并逐渐递增列数,直到应用程序返回数据,表明指定了正确的列数,例如:
    ' UNION SELECT NULL--

' UNION SELECT NULL, NULL--

' UNION SELECT NULL, NULL, NULL--

请注意,在Oracle上,需要在上述每种情况的最后一个NULL后添加FROM DUAL
    
另外,可以注入ORDER BY子句并递增指定列,直到引发错误,表明请求了无效的列:
    ' ORDER BY 1--

' ORDER BY 2--

' ORDER BY 3--

2. 已经确定一个字符串参数中的SQL注入漏洞,已经确信数据库为MS-SQLOracle,但当前无法获得任何数据或错误消息确定到底是哪个数据库。如何才能查明这一点?

一种确认数据库类型的简单方法,是使用数据库特定的字符串串联语法在所控制的查询中构建某个良性输入。例如,如果原始参数值为London,则可以轮流提交以下数据项:

'||' London

'+'London

如果第一个数据项导致和原始参数值相同的行为,说明数据库可能为Oracle。如果第二个数据项导致和原始参数值相同的行为,说明数据库可能为MS-SQL

3. 已经在应用程序的许多位置提交了一个单引号,并通过得到的错误消息确定几个潜在的SQL注入漏洞。下列哪一种方法能够以最快的速度确定专门设计的输入是否会对应用程序的处理过程造成影响?

(a) 注册一个新用户

(b) 更新个人资料

(c) 注销服务
    
虽然看似违背常理,但用户注册功能可能是最安全的。注册功能通常使用INSERT语句,如果修改这些语句,并不会影响到其他记录。用于更新个人资料的功能可能使用条件性UPDATE语句,如果注入' or 1=1--之类的有效载荷,可能会导致数据表中的所有记录遭到修改。同样,注销功能可能使用条件性DELETE语句,如果操作不当,也可能影响到其他用户。

也就是,我们不可能提前确定某个功能会执行哪些语句;在执行测试之前,应向应用程序所有者警告可能导致的风险。

4. 在登录功能中发现了一个SQL注入漏洞,并尝试使用输入' or 1=1--避开登录,但攻击没有成功,生成的错误消息表明--字符串被应用程序的输入过滤删除。如何解决这个问题?
    
有一种简单的方法可以达到相同的效果,即使用输入' or 'a'='a,而无需使用注释符号。

5. 已经发现了一个SQL注入漏洞,但由于应用程序允许任何包含空白符的输入,因而无法实施任何有效的攻击。如何解除这种限制?

    可以使用SQL注释字符分隔注入的有效载荷中的关键字和其他项目。例如:

'UNIONSELECTusername,passwordFROMusers--

6. 在将其合并到SQL查询之前,应用程序并不配对用户输入中出现的所有单引号。假设已经在一个数字字段中发现了一个SQL注入漏洞,但需要在攻击有效载荷中使用一个字符串值。不使用单引号,如何在查询中插入字符串? 
    
可以使用CHAR命令通过ASCII数字字符代码返回字符串。例如,在Oracle上,字符串FOO可以表示为:

CHAR(70)||CHAR(79)||CHAR(79)

7. 在极少数情况下,应用程序在用户提交的输入中使用参数化查询,以不安全的方式建立动态SQL查询。什么时候会出现这种情况? 
    
在将用户提交的输入置入查询的其他元素(如表和列名称),而非查询参数中时,将会出现这种情况。参数化查询无法使用这些项目的占位符进行预编译,因此需要采用不同的解决方案(可能需要基于严格的输入确认)。

8. 假设已经提升了在应用程序中的权限,现在完全拥有管理员访问权限,这时如果在某个用户管理功能中发现了一个SQL注入漏洞,如何利用这个漏洞进一步扩大攻击范围? 
    
因为已经具有管理员访问权限,因此可以使用应用程序本身检索所需的任何数据,也就是说,不必通过SQL注入攻击来获取应用程序本身的数据。但是,仍然可以利用这种攻击来访问任何与保存在同一数据库中的其他应用程序有关的数据,或者提升自己在数据库或基础操作系统中的权限,或者攻破数据库服务并将攻击范围扩大到更广泛的内部网络。

9. 在攻击一个并未保存任何敏感数据、也未实施任何身份验证或访问控制机制的应用程序的情况下,如何排列下列漏洞的重要性?

(a) SQL注入

(b) XPath注入

(c) OS命令注入

XPath注入仅可用于从目标XML文件中检索数据。因此,如果应用程序不包含任何敏感数据,则这种漏洞并不会导致严重的后果。同样,利用SQL注入漏洞并不能从数据库中提取任何敏感数据。但是,有时可以利用这类攻击提升在数据库中的权限,并以其他方式实施攻击。

在某些情况下,SQL注入漏洞可能是一个更加严重的漏洞。另一方面,OS命令注入则始终是一个高风险的漏洞,因为攻击者可以利用它直接攻破基础服务器,并可将其作为针对内部系统的其他攻击的起点。

10. 假如正在检测一个允许搜索个人资料的应用程序功能,并且怀疑该功能正访问某数据库或Active Directory后端。如何确定到底是哪一种情况?

    如果该功能正访问数据库,则提交SQL通配符%作为搜索查询可能会返回大量记录。同样,如果该功能正访问Active Directory,则提交通配符*作为搜索查询可能会返回大量记录。在其他系统中,这两个通配符都不会造成相同的效果。

 

10

1. 某网络设备提供用于执行设备配置的Web界面。为什么这种功能通常易于受到操作系统命令注入攻击?

    用于配置网络设备的应用程序通常包含使用正常的Web脚本API无法轻松实现的功能,如用于重新启动设备、循环访问日志文件或重新配置SNMP的功能。通常,使用一行操作系统命令可以轻松执行这些任务。因此,许多时候,应用程序开发者通过将相关用户输入直接合并到shell命令字符串中来实现这些功能。

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).

可以采取哪些步骤对应用程序实施攻击?
    
应用程序似乎将用户提交的输入合并到用于文件系统操作的文件路径中,并且可以通过提交专门设计的输入来访问服务器上的任意文件。因此,应尝试使用../遍历序列访问不同的目录。由于.log将被附加到输入之后,因此应尝试使用NULL字节终止文件名。请注意,出现在错误消息中的home目录可能与出现在URL中的home目录为同一目录,这为Web根目录中的项目的位置提供了线索。

3. 在对一个在POST请求中以XML格式传送数据的应用程序进行测试时,可以利用哪种漏洞从服务器的文件系统中读取任意文件?要成功实施攻击,必须满足哪些先决条件?

    应用程序可能易于受到XML外部实体(XXE)注入。检索任意文件的内容的先决条件如下:

(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变量的值是什么?

    param变量的值为urlparam1,urlparam2,bodyparam,cookieparam

5. HPPHPI的前提,还是HPIHPP的前提?

      

严格来说,这两种攻击都不是对方的前提。

虽然HPI攻击通常包含HPP,但这不是必须的。例如,HPI攻击可能会将某个全新的参数注入到后端请求中,以干扰应用程序的处理过程。但这种类型的攻击并不依赖于应用程序在处理多个同名参数时表现的任何特殊行为。

通常,HPP攻击可以不包括HPI,特别是在对用户输入执行多层处理的情况下。例如,一些针对Internet Explorer XSS过滤器的攻击使用HPP技巧,但并不在后端请求中注入任何参数。

6. 某应用程序包含一项功能,该功能向外部域提出请求,并返回这些请求的响应。为防止服务器端重定向攻击检索应用程序自己的Web服务器上的受保护资源,应用程序阻止了以localhost127.0.0.1为目标的请求。如何突破这种防御,以访问服务器上的资源?

    服务器的回环IP地址有许多备选表示形式,可将其用于避开应用程序的过滤。例如:

(a) 127.1

(b) 127.000.0.1

(c) 127.0.0.0 A类子网中的任何其他地址

(d) 这些表示形式的二进制或八进制变体,如017700000001

7. 某应用程序使用一项用于用户提交反馈的功能。该功能允许用户提交他们的电子邮件地址、邮件主题及详细的反馈。然后,应用程序以用户提交的主题和反馈为邮件正文,从用户的电子邮件地址向[email protected]发送一封电子邮件。以下哪一种方法能够有效防御邮件注入攻击?

(a) 在邮件服务器上禁用邮件中继。

(b) 使用[email protected]硬编码RCPT TO字段

(c) 确保用户提交的输入不包含任何换行符或其他SMTP元字符。

针对此应用程序功能的邮件注入攻击不需要邮件服务器支持邮件中继。如果其他邮件标头包含用户可控制的输入,硬编码RCPT TO字段也无法防范邮件注入,因为攻击者可以使用另一个RCPT TO行注入另一个收件人。在这种情况下,最有效的防御是严格确认所有用户提交的输入,以确保其中不包含任何转行符或其他SMTP元字符。

 

第三部分

你可能感兴趣的:(书籍)