实用 Web 应用程序安全测试指南
1 安全测试工具概述
在当今市场上,有多种代理工具可供选择,它们分为免费和商业两类。为了解释 Web 应用程序安全测试的某些概念,我们将使用 Burp Suite Professional 工具。它是一款商业应用程序,但也提供了没有漏洞扫描工具的免费版本。此外,还有其他一些代理工具,如 OWASP 的 WebScarab、Paros 以及 Mozilla Firefox 扩展 TamperData。
除了代理工具,还有多种其他工具对 Web 应用程序安全评估很有用,以下是一些常见工具:
|工具类型|工具名称|用途|
| ---- | ---- | ---- |
|网络监控工具|Wireshark、TCPDump|用于嗅探客户端和服务器之间的流量|
|网络端口扫描工具|Nmap、Nessus|识别开放端口以及端口背后运行的服务|
|侦察工具|部分工具|提供托管 Web 应用程序的服务和操作系统详细信息|
2 Web 应用程序安全测试的重要方面
Web 应用程序安全测试包含多个重要方面,主要有信息收集与枚举、Web 应用程序访问控制测试以及数据验证测试。下面将重点介绍信息收集与枚举的相关内容。
2.1 信息收集与枚举
信息收集是进行 Web 应用程序漏洞测试和渗透测试的首要步骤。为了有效地对 Web 应用程序进行渗透,测试人员需要尽可能多地收集目标应用程序及其环境的信息。以下是一些信息收集和枚举技术:
- DNS 和 WHOIS 信息枚举
- 操作系统和服务枚举
- 网络爬虫(Spidering)
- 搜索引擎侦察
2.1.1 DNS 和 WHOIS 信息枚举
获取目标应用程序信息的一种方法是通过主机发现。可以利用多个数据库中的 WHOIS 信息对 Web 应用程序及其托管服务器进行基本的被动枚举。WHOIS 本质上是一种用于查询数据库以获取域名或 IP 地址(IP 地址块)注册者信息的协议。通过 WHOIS 查询,可以获得域名注册者、用户名、电子邮件、地址和电话号码等大量信息。
操作步骤如下:
1. 在操作系统的命令提示符中执行 WHOIS 查询。例如,在 Unix 操作系统中,输入“WHOIS”,后面跟上主机域名或 IP 地址,即可从命令行获取 WHOIS 信息。
2. 访问 WHOIS 或 DNS 网站,这些网站会查询互联网数据库,提供目标域名或 IP 地址的详细信息。这些网站还能为攻击者或渗透测试人员提供其他有用信息,如托管服务提供商、网站/应用程序所托管的服务器类型和版本、域名转移和更新详情等。测试人员或攻击者可以根据这些信息对应用程序进行分析。
2.1.2 操作系统和服务枚举
操作系统和服务枚举是收集 Web 应用程序测试信息的关键步骤。其目的是了解托管 Web 应用程序的操作系统和系统上运行的服务。可以通过某些技术对 Web 服务器、应用服务器和数据库服务进行枚举。例如,一个 Web 应用程序可能运行在 Ubuntu 9.1 服务器上,使用 Apache Tomcat v. 6.0 和 MYSQL 数据库。攻击者或测试人员可以深入了解这个环境,进行更有针对性的测试,以发现系统中可能存在的漏洞。
操作系统枚举也可以通过端口扫描来完成。端口扫描用于发现开放端口(用于服务通信的端口),并了解可能用于攻击和破坏系统安全的端口。测试人员可以使用特定工具来识别开放和易受攻击的服务。以下是使用流行的端口扫描工具 Nmap 进行端口扫描的结果示例:
Starting Nmap 5.00 ( http://nmap.org ) at 2009-12-04 23:21 IST
Stats: 0:00:12 elapsed; 0 hosts completed (1 up), 1 undergoing SYN
Stealth Scan
Interesting ports on w5.interactivedns.com (192.168.1.1):
Not shown: 979 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
25/tcp open smtp MailEnable smptd 1.981--
|_ smtp-commands: EHLO home [192.168.1.1], this server offers 4
extensions, AUTH LOGIN, SIZE 20480000, HELP, AUTH=LOGIN
26/tcp open smtp MailEnable smptd 1.981--
|_ smtp-commands: EHLO home [192.168.1.1], this server offers 4
extensions, AUTH LOGIN, SIZE 20480000, HELP, AUTH=LOGIN
53/tcp open domain ISC BIND 9.2.4
80/tcp open http Microsoft IIS webserver 6.0
|_ html-title: Example Dot.com | Home
110/tcp open pop3 MailEnable POP3 Server
|_ pop3-capabilities: USER TOP UIDL
135/tcp filtered msrpc
139/tcp filtered netbios-ssn
443/tcp open ssl/http Microsoft IIS webserver 6.0
|_ html-title: 403 Forbidden
|_ sslv2: server still supports SSLv2
445/tcp filtered microsoft-ds
1022/tcp filtered unknown
1023/tcp filtered netvenuechat
1025/tcp open msrpc Microsoft Windows RPC
3306/tcp open mysql?
3389/tcp open microsoft-rdp Microsoft Terminal Service
3914/tcp open msrpc Microsoft Windows RPC
8009/tcp open ajp13?
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
|_ html-title: Apache Tomcat/5.5.4
8099/tcp open http Microsoft IIS webserver 6.0
|_ html-title: The page must be viewed over a secure channel
8402/tcp open http Microsoft IIS webserver 6.0
|_ html-title: Plesk Site Builder
8443/tcp open http Apache httpd 2.0.52 (mod_ssl/2.0.46 OpenSSL/0.9.7b
PHP/4.3.4)
|_ html-title: 400 Bad Request
Device type: general purpose
Running: Microsoft Windows 2003
OS details: Microsoft Windows Server 2003 SP1 or SP2
Service Info: Host: win1.interactivedns.com; OS: Windows
此外,WHOIS 互联网网站也能提供 Web 应用程序所托管服务器类型的基本信息。例如,whois.domaintools.com 网站可以提供服务器的 IP 地址和 Web 应用程序所托管的 Web 服务器类型的详细信息。同时,SSL 信息也是 Web 应用程序安全测试中重要的信息收集工具。测试人员应收集 SSL 证书的信息,确保其强度足够。可以使用 HTTPrint 等软件来枚举用于保护组织 Web 应用程序的 SSL 证书的强度。
2.1.3 网络爬虫(Spidering)
网络爬虫是一种实用的信息收集工具。Web 应用程序通常由服务器公共文件夹中多个目录下的多个页面组成,这些页面是 Web 应用程序的一部分,可用于执行应用程序的各种活动。网络爬虫工具可以提供 Web 应用程序的目录结构,它会递归地定位 Web 应用程序的文件夹和文件,并将结果展示给用户。
部分网络爬虫工具还能提供对测试人员非常有用的额外信息,例如查询网页,判断该页面是否需要访问控制或可以无访问控制地访问。通过网络爬虫过程,测试人员可以了解 Web 应用程序的目录结构,从而针对每个页面或整个 Web 应用程序进行特定的安全测试。
2.1.4 搜索引擎侦察
搜索引擎侦察是一种相对较新的 Web 应用程序安全测试信息收集方法。在搜索引擎网站上精心构造搜索查询,可以获取目标 Web 应用程序/网站的关键信息。搜索查询能够揭示目标 Web 应用程序/网站的多个敏感信息。例如,构造的搜索引擎查询可以发现 Web 应用程序中的敏感目录,如密码文件、日志和应用程序错误消息等。
操作步骤如下:
1. 在搜索引擎中构造特定的搜索查询。例如,在 Google 搜索引擎中输入“allinurl: cgi - bin password”,可以访问揭示 Web 应用程序和网站敏感信息(如密码)的密码文件和进程。
2. 检查搜索引擎的缓存页面。许多搜索引擎(如 Google)会缓存网站和 Web 应用程序的页面,这些缓存页面可能会揭示之前存在的安全漏洞。测试人员应检查包含此类漏洞的缓存页面,并将其告知相关组织。
3. 利用搜索引擎进行网络爬虫操作。例如,使用 Google 搜索查询“site:”,后面跟上要测试的域名,就可以枚举 Web 应用程序中所有已索引的页面和目录。
此外,互联网论坛消息也是容易被忽视但能揭示组织敏感信息的重要来源。组织内的用户常在互联网论坛上发布工作中遇到的问题,有些用户甚至会不经过滤地发布自己的姓名、组织名称、正在从事的软件项目类型,甚至是遇到问题的代码片段。这些信息有助于测试人员更深入地了解目标应用程序,从而进行更有效的测试。
3 Web 应用程序访问控制测试
3.1 非安全密码测试
在当今世界,密码是 Web 应用程序最常用的身份验证机制。然而,由于应用程序设计不安全、安全意识不足和疏忽等原因,密码的实现通常不够安全,这可能导致应用程序和敏感信息泄露。用户名/密码的不安全实现可能是应用程序被攻破的主要原因。
测试人员首先要测试 Web 应用程序是否使用了容易猜测的密码,并尝试访问应用程序。如果发现存在容易猜测的弱密码,说明 Web 应用程序没有对用户强制执行强密码要求,需要进行修正。像电子商务和银行应用程序等,必须确保强密码要求,并结合密码过期、密码锁定和重置等其他要求。
3.2 加密通道传输凭证测试
网络监控(也称为网络嗅探)是一种攻击者可以轻松获取丰富成果的攻击方式。攻击者可以嗅探网络中传输的流量,窃取凭证。因此,测试人员需要检查敏感信息(如凭证)是否通过加密连接传输。
操作步骤如下:
1. 使用工具(如 Wireshark、Ethereal 或 TCPDump)嗅探网络数据包,并重新生成服务器和客户端之间的 HTTP 消息,以获取敏感信息,如用户名、密码、信用卡号码等。
2. 加密传输到 Web 应用程序通常借助安全套接字层/传输层安全(SSL/TLS)实现。当 HTTP 流量与 SSL/TLS 结合时,就形成了超文本传输协议安全(HTTPS)。使用 HTTPS 协议传输流量时,客户端和服务器之间的连接是加密的,不会受到网络流量监控或嗅探的影响。
3. 测试人员要验证用于创建加密传输的证书是否具有足够的强度。可以使用 SSL/TLS 枚举工具(如 SSLDump 或 HTTPrint)来检查 SSL/TLS 证书的强度,也可以从浏览器中检查 SSL 证书,查看支持的加密算法类型,从而评估证书和加密的强度。
需要注意的是,仅仅实现 SSL/TLS 并不能完全解决问题。在某些情况下,攻击者可能会迫使用户通过 HTTP 连接向 Web 应用程序提交敏感信息。因此,Web 应用程序应配置为仅允许通过 HTTPS 和 POST 请求传输敏感信息(如凭证和信用卡信息)。如果未做到这一点,测试人员应将此漏洞告知相关组织。
3.3 身份验证方案测试
身份验证系统的实现是 Web 应用程序安全的重要要求。身份验证被视为 Web 应用程序的外围安全措施,一旦被攻破,可能导致应用程序及其存储、处理或传输的敏感信息泄露。以下是一些常见的身份验证实现错误:
-
直接页面请求
:攻击者访问 Web 应用程序时,会出现登录页面要求输入凭证。若身份验证系统实现不当,未将身份验证和授权要求与页面绑定,攻击者直接访问受限页面时可能会被允许访问,从而获取应用程序中本应敏感和受限的资源。
-
参数修改(参数篡改)
:在某些身份验证机制中,会有一些参数与用户凭证一起传递用于身份验证。例如,一些 Web 应用程序会传递“authenticated”或“validated”等参数,攻击者可以使用 Web 应用程序代理或直接在 URL 中设置这些参数为“yes”,从而绕过无效凭证进行身份验证。
3.4 注销和其他功能测试
理想情况下,用户注销应用程序后,其会话应被失效或销毁,用户不应能够再次使用该会话。测试人员应进行以下测试:
1. 检查 Web 应用程序的每个页面是否都有注销选项,以便用户随时注销应用程序。
2. 测试有效的注销机制。例如,用户注销后使用浏览器的后退按钮,如果仍能访问 Web 应用程序的受限会话,说明会话管理功能和注销功能实现有误。
3. 记录或复制测试人员认证时的会话标识符,然后尝试通过设置会话标识符为之前认证时的值来访问 Web 应用程序的受限部分。如果应用程序没有对非活动或已失效会话进行跟踪,用户仍能使用相同的会话 ID 登录应用程序,这证明注销和会话管理功能实现不当。
4. 检查浏览器缓存中是否存在信息缓存。Web 应用程序注销后通常不会自动清除缓存,理想情况下,Web 应用程序不应在用户浏览器中缓存任何敏感信息。可以通过查看 HTTP 响应头来测试这一点。以下是缓存和非缓存页面的 HTTP 响应示例:
GET / HTTP/1.1
Host: www.example.co.in
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US;
rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,kn;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
上述示例显示了将 Web 应用程序信息缓存到用户浏览器的 HTTP 响应头。
GET /accounts/OfflineManifest HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US;
rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,kn;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: no-cache, no-cache
Pragma: no-cache, no-cache
Cookie: Locale_session=en; BALX=jiPjFdROPdQ; PREF=ID=9edca9467bac7d0d:TM=
1262660023:LM=1262660023:S=b_FOSYmyQcoMoC7Q; NID=30=GQAx-
4Ubuu8XbSezaawSUXx9FfG-X4NpJsbGEkKehlVVKfIFho7TRyVvdsvA0P_
re9LC7emRnGzVSCRwVMY6N5zXnVmYa1IzTBkQPmEpsoGcjY3abY6k4Spk9c6LEgF0;
TZ=-330
此示例显示了非缓存页面的 HTTP 响应头。
综上所述,Web 应用程序安全测试是一个复杂且重要的过程,需要使用多种工具和方法,从信息收集到访问控制测试等多个方面进行全面检查,以确保 Web 应用程序的安全性。
4 数据验证测试
4.1 数据验证的重要性
数据验证是 Web 应用程序安全的关键环节。在 Web 应用程序中,用户输入的数据会被接收、处理和存储。如果没有进行有效的数据验证,恶意用户可能会输入有害的数据,如 SQL 注入代码、跨站脚本(XSS)代码等,从而导致应用程序出现安全漏洞,泄露敏感信息或遭受攻击。
4.2 常见的数据验证类型
| 验证类型 | 描述 | 示例 |
|---|---|---|
| 格式验证 | 确保输入的数据符合特定的格式要求 |
验证电子邮件地址是否符合标准格式,如
example@example.com
|
| 长度验证 | 限制输入数据的长度 | 用户名长度不能超过 20 个字符 |
| 范围验证 | 确保输入的数据在指定的范围内 | 年龄输入应在 1 - 120 之间 |
| 类型验证 | 验证输入的数据类型是否正确 | 输入的电话号码应为数字类型 |
4.3 数据验证的操作步骤
以下是进行数据验证的一般操作步骤:
1.
确定验证规则
:根据应用程序的需求,确定每个输入字段的验证规则,如上述的格式、长度、范围和类型验证等。
2.
在前端进行验证
:使用 JavaScript 等技术在前端对用户输入的数据进行初步验证。例如,使用正则表达式验证电子邮件地址:
function validateEmail(email) {
const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(String(email).toLowerCase());
}
- 在后端进行验证 :前端验证可以提供良好的用户体验,但不能完全保证数据的安全性。因此,还需要在后端对数据进行再次验证。例如,在 Python 的 Flask 框架中进行电子邮件验证:
from flask import Flask, request
app = Flask(__name__)
@app.route('/submit', methods=['POST'])
def submit():
email = request.form.get('email')
import re
pattern = r'^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'
if re.match(pattern, email):
return 'Email is valid'
else:
return 'Email is invalid'
if __name__ == '__main__':
app.run()
- 处理验证失败的情况 :当数据验证失败时,应向用户提供明确的错误信息,告知其输入的数据不符合要求,并要求其重新输入。
5 安全测试流程总结
5.1 安全测试的整体流程
graph LR
A[信息收集与枚举] --> B[Web 应用程序访问控制测试]
B --> C[数据验证测试]
C --> D[生成测试报告]
5.2 各阶段的关键要点
| 阶段 | 关键要点 |
|---|---|
| 信息收集与枚举 | 通过 DNS 和 WHOIS 信息枚举、操作系统和服务枚举、网络爬虫和搜索引擎侦察等方法,尽可能多地收集目标应用程序及其环境的信息 |
| Web 应用程序访问控制测试 | 测试非安全密码、加密通道传输凭证、身份验证方案以及注销和其他功能,确保用户身份验证和访问控制的安全性 |
| 数据验证测试 | 进行格式、长度、范围和类型等多种验证,在前端和后端分别进行验证,处理验证失败的情况 |
| 生成测试报告 | 总结测试过程中发现的安全漏洞和问题,提供详细的描述和建议的修复措施 |
6 总结与建议
6.1 总结
Web 应用程序安全测试是保障应用程序安全的重要手段。通过使用各种工具和方法,从信息收集到访问控制测试和数据验证测试等多个方面进行全面检查,可以发现并修复潜在的安全漏洞,保护应用程序及其用户的敏感信息。
6.2 建议
- 定期进行安全测试 :Web 应用程序的安全状况会随着时间和代码的更新而变化,因此应定期进行安全测试,及时发现和处理新出现的安全问题。
- 加强安全意识培训 :组织内的开发人员、测试人员和用户都应具备一定的安全意识,了解常见的安全漏洞和防范方法,避免因疏忽导致安全问题。
- 遵循安全最佳实践 :在开发和维护 Web 应用程序时,应遵循安全最佳实践,如使用强密码、加密传输数据、进行有效的数据验证等,提高应用程序的安全性。
总之,保障 Web 应用程序的安全需要持续的努力和关注,通过综合运用各种安全测试方法和措施,可以有效降低安全风险,为用户提供安全可靠的服务。
超级会员免费看
8926

被折叠的 条评论
为什么被折叠?



