什么是渗透测试?

渗透测试是一项安全演习,网络安全专家模拟黑客攻击查找和利用计算机系统中的漏洞。模拟攻击的目的是识别攻击者可以利用的系统防御中的薄弱环节,通过渗透测试找出计算机系统、Web 应用程序或网络的漏洞。

免责声明:渗透测试是一项专业技术活动,必须经过被测试信息系统有关组织或部门的授权才能进行。本文所涉及到的渗透测试内容仅供安全研究和学习目的,作者不承担任何因使用本文内容而导致的法律责任。读者在使用本文所提供的技术和信息时,必须遵守当地法律法规和相关政策。如果读者违反了这些规定,后果由读者自负。

漏洞成因

  • 设计和开发错误:硬件和软件的设计可能存在缺陷。这些错误会使您的业务关键数据面临暴露的风险。
  • 系统配置不佳:这是造成漏洞的另一个原因。如果系统配置不当,则可能会引入漏洞,攻击者可以通过这些漏洞进入系统并窃取信息。
  • 人为错误:文件处理不当、文件无人看管、编码错误、内部威胁、在网络钓鱼网站上共享密码等人为因素都可能导致安全漏洞。
  • 连接性:如果系统连接到不安全的网络(开放连接),那么它就会进入黑客的范围。
  • 复杂性:安全漏洞与系统的复杂性成正比。系统具有的功能越多,系统被攻击的机会就越大。
  • 密码:密码用于防止未经授权的访问。它们应该足够强大,以至于没有人能猜出您的密码。不应不惜任何代价与任何人共享密码,并且应定期更改密码。尽管有这些说明,但有时人们还是会向其他人透露他们的密码,将它们写在某个地方并保存容易被猜到的密码。
  • 用户输入:您一定听说过 SQL 注入、缓冲区溢出等。通过这些方法执行非授权字符或指令用于攻击接收系统。
  • 管理:安全管理起来既困难又昂贵。有时,组织缺乏适当的风险管理,因此系统中会诱发漏洞。
  • 缺乏对员工的培训:这会导致人为错误和其他漏洞。
  • 通信:移动网络、互联网、电话等渠道打开了安全盗窃的范围。

渗透测试工具

自动化工具可用于识别应用程序中存在的一些标准漏洞。渗透测试工具扫描代码以检查是否存在可能导致潜在安全漏洞的恶意代码。
渗透测试工具可以通过检查数据加密技术并找出用户名和密码等硬编码值来验证系统中存在的安全漏洞。

选择最佳渗透工具的标准:

  • 它应该易于部署、配置和使用。
  • 它应该可以轻松扫描您的系统。
  • 它应该根据需要立即修复的严重程度对漏洞进行分类。
  • 它应该能够自动验证漏洞。
  • 它应该重新验证之前发现的漏洞。
  • 它应该生成详细的漏洞报告和日志。

为什么要进行渗透测试?

您一定听说过始于 2017 年 5 月的 WannaCry 勒索软件攻击。它锁定了全球超过 20 万台计算机,并要求从比特币加密货币中支付赎金。这次攻击影响了全球许多大型组织。
随着如今发生如此大规模和危险的网络攻击,定期进行渗透测试以保护信息系统免受安全漏洞的侵害已变得不可避免。

渗透测试主要用于:

  • 在不同系统之间或通过网络传输财务或关键数据时,必须确保其安全。
  • 许多客户要求将渗透测试作为软件发布周期的一部分。
  • 保护用户数据。
  • 查找应用程序中的安全漏洞。
  • 发现系统漏洞。
  • 评估成功攻击的业务影响。
  • 满足组织中的信息安全合规性。
  • 在组织内实施有效的安全策略。

任何组织都需要识别内部网络和计算机中存在的安全问题。进行渗透测试组织可以计划防御任何黑客攻击企图。用户隐私和数据安全是当今最大的问题。

渗透测试目标

  • 软件(操作系统、服务、应用程序)
  • 硬件
  • 网络
  • 进程
  • 用户行为

渗透测试类型

1) 社会工程测试: 在这个测试中,试图让一个人泄露敏感信息,如密码、关键业务数据等。这些测试主要通过电话或互联网完成,人为错误是安全漏洞的主要原因。所有工作人员都应遵守安全标准和政策,以避免社交工程渗透尝试。这些标准的示例包括不要在电子邮件或电话通信中提及任何敏感信息。组织可以进行安全审计以识别和纠正流程缺陷。

2) Web 应用程序测试: 使用软件方法,可以验证应用程序是否存在安全漏洞。它检查位于目标环境中的 Web 应用程序和软件程序的安全漏洞。

3) 物理渗透测试: 采用强大的物理安全方法来保护敏感数据。这通常用于军事和政府设施。所有物理网络设备和接入点都经过测试,以确定是否存在任何安全漏洞。该测试与软件测试的范围不是很相关。

4) 网络服务测试:这是最常执行的渗透测试之一,其中通过在网络系统中创建的条目来识别网络中的缺口,检查存在何种漏洞。这可以在本地或远程完成。

5) 客户端测试:它旨在搜索和利用客户端软件程序中的漏洞。

6) 远程拨号测试:它在环境中搜索调制解调器,并尝试通过密码猜测或暴力破解登录到通过这些调制解调器连接的系统。

7) 无线安全测试:它发现开放的、未经授权的和安全性较低的热点或 Wi-Fi 网络,并通过它们进行连接。

渗透测试方法

  • 黑盒渗透测试:测试人员不需要了解被测试的软件的内部结构和实现细节,只是通过输入数据和检查输出结果,验证软件的正确性。黑盒测试重点在于测试软件的功能是否符合需求,并且着眼于测试的覆盖面,测试人员不需要知道内部的实现细节。
  • 白盒渗透测试:测试人员需要了解被测试的软件的内部结构和实现细节,包括代码逻辑、程序控制流、数据结构等,以设计和执行测试用例。白盒测试重点在于测试软件的代码是否符合设计规范,并且着眼于测试的覆盖面,测试人员需要知道内部的实现细节。
  • 灰盒渗透测试:介于黑盒测试和白盒测试之间,测试人员既知道部分内部实现细节,也不完全知道所有的细节。测试人员可以使用已知的信息设计和执行测试用例。灰盒测试可以在一定程度上弥补黑盒测试和白盒测试的缺陷,综合利用两种测试方法的优点,从而更好地测试软件的正确性和完整性。

渗透测试技术

  • 手动渗透测试
  • 使用自动化渗透测试工具。
  • 手动和自动流程的组合。

第三个过程更常见,用于识别各种漏洞。

使用自动化工具很难找到所有漏洞。有些漏洞只能通过手动扫描来识别。渗透测试人员可以根据他们对被渗透系统的技能和知识对应用程序进行更好的攻击。
像社会工程学这样的方法可以由人类来完成。人工检查包括设计、业务逻辑以及代码验证。

我们可以将渗透测试流程归类为以下几种方法:

1) 数据收集:使用包括谷歌搜索在内的各种方法来获取目标系统数据。还可以使用网页源代码分析技术来获取有关系统、软件和插件版本的更多信息。

市场上有许多免费工具和服务,可以为您提供数据库或表名、数据库版本、软件版本、使用的硬件以及目标系统中使用的各种第三方插件等信息。

2) 漏洞评估:根据第一步收集的数据,可以找到目标系统中的安全漏洞。这有助于渗透测试人员使用系统中已识别的入口点发起攻击。

3) 实际利用:这是关键的一步。它需要特殊的技能和技巧才能对目标系统发起攻击。经验丰富的渗透测试人员可以利用他们的技能对系统发起攻击。

4)分析结果和报告准备:渗透测试完成后,准备详细报告以采取纠正措施。这些报告中列出了所有已识别的漏洞和建议的纠正方法。您可以根据组织的需要自定义漏洞报告格式(HTML、XML、MS Word 或 PDF)。

渗透测试示例(测试场景)

下面给出的是一些通用测试用例,不一定适用于所有应用程序。

  1. 检查 Web 应用程序是否能够识别针对网站上使用的联系表的垃圾邮件攻击。

  2. 代理服务器 – 检查网络流量是否由代理设备监控。代理服务器使黑客很难获得网络内部的详细信息,从而保护系统免受外部攻击。

  3. 垃圾邮件过滤器 – 验证是否过滤了传入和传出的电子邮件流量以及是否阻止了未经请求的电子邮件。

  4. 许多电子邮件客户端都带有内置的垃圾邮件过滤器,需要根据您的需要进行配置。这些配置规则可以应用于电子邮件标题、主题或正文。

  5. 防火墙——确保整个网络或计算机都受到防火墙的保护。防火墙可以是阻止未经授权访问系统的软件或硬件。防火墙可以防止在未经您许可的情况下将数据发送到网络之外。

  6. 尝试利用所有服务器、桌面系统、打印机和网络设备。

  7. 确认所有用户名和密码都已加密并通过 https 等安全连接传输。

  8. 验证存储在网站cookie中的信息。它不应该是可读的格式。

  9. 验证以前发现的漏洞以查看修复是否有效。

  10. 验证网络上是否没有开放端口。

  11. 验证所有电话设备。

  12. 验证 WiFi 网络安全。

  13. 验证所有 HTTP 方法。不应在 Web 服务器上启用 PUT 和 Delete 方法。

  14. 验证密码是否符合要求的标准。密码长度至少为 8 个字符,至少包含一个数字和一个特殊字符。

  15. 用户名不应为“admin”或“administrator”。

  16. 应在几次不成功的登录尝试后锁定应用程序登录页面。

  17. 错误消息应该是通用的,不应提及具体的错误细节,如“无效的用户名”或“无效的密码”。

  18. 验证特殊字符、HTML 标记和脚本是否作为输入值得到正确处理。

  19. 不应在任何错误或警报消息中透露内部系统详细信息。

  20. 在网页崩溃的情况下,应向最终用户显示自定义错误消息。

  21. 验证注册表项的使用。敏感信息不应保存在注册表中。

  22. 所有文件在上传到服务器之前必须被扫描验证。

  23. 在与 Web 应用程序的不同内部模块通信时,不应将敏感数据传递给 URL。

  24. 系统中不应有任何硬编码的用户名或密码。

  25. 验证所有包含带空格和不带空格的长输入字符串的输入字段。

  26. 验证重置密码功能是否安全。

  27. 验证SQL 注入的应用程序。

  28. 验证跨站点脚本的应用程序。

  29. 重要的输入验证应该在服务器端完成,而不是在客户端进行 JavaScript 检查。

  30. 系统中的关键资源应仅供授权人员和服务使用。

  31. 所有访问日志都应使用适当的访问权限进行维护。

  32. 验证用户会话在注销时结束。

  33. 验证服务器上是否禁用了目录浏览。

  34. 确认所有应用程序和数据库版本都是最新的。

  35. 验证 URL 操作以检查 Web 应用程序是否未显示任何不需要的信息。

  36. 验证内存泄漏和缓冲区溢出。

  37. 验证是否扫描传入的网络流量以发现特洛伊木马攻击。

  38. 验证系统是否安全免受暴力攻击——一种查找密码等敏感信息的试错法。

  39. 验证系统或网络是否免受 DoS(拒绝服务)攻击。由于目标系统上的资源过载导致拒绝为合法请求提供服务,黑客可以通过连续请求将网络或单台计算机作为目标。

  40. 验证 HTML 脚本注入攻击的应用程序。

  41. 针对 COM 和 ActiveX 攻击进行验证。

  42. 验证是否受到欺骗攻击。欺骗可以有多种类型——IP 地址欺骗、电子邮件 ID 欺骗、

    ARP 欺骗、Referrer 欺骗、来电显示欺骗、文件共享网络中毒、GPS 欺骗。

  43. 检查不受控制的格式字符串攻击——一种可能导致应用程序崩溃或对其执行有害脚本的安全攻击。

  44. 验证 XML 注入攻击——用于改变应用程序的预期逻辑。

  45. 针对规范化攻击进行验证。

  46. 验证错误页面是否显示任何有助于黑客进入系统的信息。

  47. 验证是否有任何关键数据(如密码)存储在系统的秘密文件中。

  48. 验证应用程序返回的数据是否多于所需。