Web 应用渗透技术研究及安全防御方案设计分析
2022-11-24贺云龙
贺云龙
(海南世纪网安信息技术有限公司,海口 570100)
随着互联网技术的快速发展,Web 应用安全事件频繁发生,黑客利用Web 安全漏洞对客户端、服务器和数据库等领域发起攻击,出现用户信息丢失、网页被篡改及数据永久性破坏等安全问题,为用户带来严重损失。为保证Web 应用系统安全,有必要采用渗透测试技术模拟各种攻击方法识别Web 安全漏洞,评估系统安全状态,为完善Web 安全设计方案打下基础。
1 渗透测试技术概述
1.1 渗透测试概念
渗透测试技术是通过主动模拟攻击者的思维和攻击方式,分析评估系统安全漏洞、防御弱点和技术缺陷的检测方法[1]。渗透测试技术属于前瞻性的安全防御技术措施,能够准确识别出信息安全风险事件,满足系统安全设计需要。
1.2 渗透测试分类
1.2.1 白盒测试
测试者在对系统一无所知的状态下进行测试,测试人员要与客户前期沟通,明确测试目标和测试环境,从组织外部完成测试内容。
1.2.2 黑盒测试
测试者通过模拟对被测试系统一无所知的状态下进行测试,这种测试方法更接近于真正的黑客攻击,是当前广泛使用的渗透测试方法。
1.3 渗透测试手段
1.3.1 端口扫描
采用隐身扫描、UDP 扫描和TCP Null 等扫描技术搜集前期信息,锁定主机开放端口。
1.3.2 操作系统探测
在搜集主机信息中,采用指纹探测技术、ICMP 技术和标识信息探测技术等探测技术,缩小漏洞检测范围。
1.3.3 漏洞扫描
采用规则匹配技术扫描应用、网络和主机中的漏洞,可分为主动扫描与被动扫描2 种方式。
2 Web 应用渗透测试技术的流程
Web 渗透测试流程主要包括信息收集、漏洞挖掘、漏洞利用、内网转发、内网渗透、痕迹清除和撰写渗透测试报告7 个环节[2],具体应用如下。
2.1 信息收集
信息收集包括主动信息收集和被动信息收集,主动信息收集是从Web 服务器中获取信息,被动信息收集是从社交工具、搜索引擎等间接路径中获取信息。
2.1.1 获取域名
从域名开始渗透测试,发现域名对应的目标Web 主机IP、服务器和端口等,根据收集的信息对攻击面进行分析。
2.1.2 查询网站所有者
在收集目标网站的IP 时采用Who.is 传输协议,在传输协议支持下,查出与同一域名注册匹配的分布式业务网络(DSN)记录、域名等信息,当获取目标网站所有者姓名、电话和电子邮箱等信息后进行渗透测试。
2.1.3 查询备案信息
在工业和信息化部的信息备案管理系统、企业信用信息公示系统及天眼查等系统中查询域名的备案信息。
2.1.4 收集Web 服务器信息
使用dig 命令、host、dnstracer 和nslookup 等工具收集DNS 信息。当DNS 配置不当时,会导致DNS 域传送漏洞,引发Web 网络拓扑图泄露风险。
2.1.5 收集子域名
通过搜索引擎、Layer 子域名挖掘机、子域名猜测和Phpinfo.me 等收集子域名,发现安全漏洞[3]。
2.1.6 收集IP
IP 地址查询要绕过内容分发网络(CDN),通过网络命令Ping、历史解析记录、二级域名和网站漏洞等途径收集IP 地址,保证IP 地址的真实性。
2.1.7 查询旁站和C 段
利用Python 查询同一Web 服务器上的其他站点和同一网络端口上的其他服务器。
2.1.8 收集服务端口
端口渗透探测采用Nmap、masscan 工具,通过Web主机开启的服务器端口发现更多的安全漏洞。
2.1.9 收集网站架构信息
利用Nmap、wappalyzer 和AWVS 工具对中间件、操作系统、脚本语言和数据库等操作系统信息进行收集;利用access、Oracle 和MySQL 数据库对数据库信息进行收集;利用Apache、IIS 和Tomcat 软件对网站中间件信息进行收集;利用HTTP 消息中的header 工具、网页默认页面对网站其他信息进行收集。
2.1.10 收集敏感信息
利用搜索引擎、暴力字典枚举目录等工具收集敏感目录、文件等信息,找到源码泄露。
2.1.11 收集指纹信息
通过查看网页代码,使用云悉、bugscaner 等工具收集内容管理系统指纹,在掌握指纹信息的情况下可对目标网站中的CMA 信息类型进行识别。
2.2 漏洞挖掘
以海量信息为依托,判断网站是否存在漏洞,如SQL 注入、XSS 跨站脚本等,对此要采取具有针对性的探测工具,如AWVS、AppScan 等对漏洞加以探测[4]。漏洞挖掘常用的方法有工具扫描、手工检测等。
2.2.1 工具扫描
这是一种能够快速发现Web 站点中是否存在漏洞的方法,使用工具扫描漏洞的过程中,会生成有效载荷(payload),由此为漏洞分析提供便利条件。在各类扫描工具中,带有集成扫描漏洞模块越多的工具,其功能就越强大。工具扫描漏洞的具体方案如下:先对待扫描的目标网站系统加以确定,选取适宜的扫描工具,扫描完毕后,对结果做输出列表。
2.2.2 手工检测
挖掘Web 站点内的漏洞时,若是服务器装有防火墙,使用工具扫描,则会在较短的时间内频繁访问系统,这样一来,将会造成IP 遭到拦截限制,进而无法对Web站点内的程序进行访问。对此,可以通过手工检测的方法来挖掘漏洞。具体做法如下:①先判断Web 站点内是否存在SQL 注入,可以采用的判断方法有id 参数后加单引号,或是and1=1、and1=2 回显等;②对后台登录进行检测,看是否存在弱口令,可在后台的登录地址中,输入以下指令:admin,也可尝试使用万能密码登录;③用Google语法,如site:xxx.com inurl:upload 等,查看有无编辑器[5]。
2.3 漏洞利用
当探测到网站内存在漏洞之后,可以有针对性地对漏洞加以利用。正常情况下,仅凭借单一的漏洞是无法顺利获取到网站的代码执行环境(Webshell),只有借助多个漏洞,才能获取到网站的Webshell。在这一过程中,对SQLmap、AWVS 等工具加以利用,能够达到事半功倍的效果。当Webshell 获取后,要对其提权,常用的提权方法有以下几种:溢出漏洞提权、数据库提权及第三方软件提权等。其中数据库提权的效果比较好,可用的数据库类型包括SQLServer 和MySQL 等[6]。
2.4 内网转发
当顺利获取到Webshell 之后,若是需要开展渗透测试,则还要对内网中主机的相关信息进行探测,此时便需要内网转发。由于渗透测试的过程无法与内网的主机实时通信,所以要利用Webshell 网站中的服务器,并结合proxychains 代理链。
2.5 内网渗透
当与内网主机建立起正常的通信之后,便可开展内网渗透。为对在线的内网主机进行有效的探测,要对内网主机开展全面扫描,在这一过程中,可以使用Nmap,并对如下信息加以明确:开放的端口、操作系统等。目前,绝大多数内网用户使用的都是Windows 系统,在内网渗透时,可以围绕与该系统有关的漏洞展开,如果发现系统中存在漏洞,则可应用Metasploit 工具完成内网渗透。这样便能够找到域控服务器,并从中获取到相应的权限,进而实现用户主机的登录。在应用Metasploit 时,要掌握正确的流程,具体如下:先进入到Web 框架中,选取search 命令,对系统中可能存在的漏洞进行查找,使用use 模块,并查看其中的信息,设置好攻击荷载及相关的参数后,开始攻击[7]。
2.6 痕迹清除
当内网渗透测试完毕后,要将测试过程残留的痕迹全部清除,包括网络痕迹和日志。掩盖网络痕迹时,可以使用多层代理,掩盖真实的IP 地址,或是借助代理链工具,如proxychains 进行掩盖。清除系统日志的过程中,应结合系统选取清除方式,这是因为不同的系统日志清除方式不同,若是选择不当,则无法达到清除的目的。比如Windows 操作系统应将Log 文件删除,而Linux 系统则需要将/var/log 下的文件删除。
2.7 撰写渗透测试报告
当渗透测试完毕,并将所有的痕迹全部清除之后,便可依据测试结果,编写相关的测试报告,结合实际情况,指出系统存在的漏洞情况,并根据漏洞,提出具有针对性的修补途径。用户便可依据报告中给出的方法,对系统漏洞加以修复,从而达到强化Web 信息安全的目的。
3 Web 安全防御方案设计
在运用渗透测试技术识别出Web 应用安全漏洞后,明确Web 开发面临的主要安全威胁,进而针对这些安全漏洞设计出一套完整的安全防御方案,有效避免安全漏洞的产生,提高Web 应用的安全性。
3.1 输入验证
在Web 应用中,输入验证环节存在恶意输入、未经验证输入及依赖客户端验证等安全漏洞,针对这些输入验证中的安全漏洞设计以下安全防护方案:①将数据源分为可信数据源、非可信数据源,采用“白名单”策略验证非可信数据源,去除未经过验证的数据。②验证User-Agent、Cookie 和Host 等客户端请求的参数,获取每项验证信息的数据类型、取值范围和长度等信息,识别验证数据中是否存在危险字符,采用正则表达式检测字符,通过检测的验证数据列入白名单,未通过检测的验证数据列入黑名单。③对危险字符执行过滤程序,包括特殊字符(<、>、%、&、等)、换行符(%0a、 等)及空字节(%00)等[8]。
3.2 身份验证
在Web 应用中,身份验证存在允许越权账户、混合个人设置与身份验证、保护凭据、使用弱密钥和会话周期过长等安全漏洞,针对此类安全漏洞设计以下安全防护方案:①设计一次性验证替代多步验证,消除身份验证环节失效风险,并利用日志记录身份验证失败信息。②在服务端进行身份验证,避免在客户端设计身份验证。③身份验证失败的信息提示要模糊处理(如“用户名或密码不正确”),不能给予精准提示(如“用户名不正确”“密码不正确”)。④设置身份验证失败上限次数,当用户连续登陆失败后设置用户锁定时间,合理确定限制登陆时间长短。⑤在用户成功登陆后,要提示用户上次登陆的相关信息,以便于用户做好个人信息安全防护。
3.3 密码管理
在Web 应用中,用户设置密码过于简单会出现账号信息泄露风险,针对此类安全漏洞设计以下安全防护方案:①设计复杂程度相对较高的用户密码设置要求,如密码长度不小于8 字节,混合使用数字、字母和符号等,不得使用相同单一数字或简单单词作为密码。当用户设置完密码后,运用自动检测算法判定密码风险高低,对高风险密码予以提示。②在服务器端加密存储用户密码,采用哈希函数加密用户密钥,不得使用MD5 加密。用户成功登录后,对访问数据加密处理,设定合理的加密有效期[1]。③对设置默认密码的Web 应用网站,当用户首次登录后要提示用户修改密码,修改后重新登录,再次进行身份验证。
3.4 会话管理
在Web 应用中,会话管理存在允许超长会话周期、未加密信息传递、不安全会话状态存储和放置会话标识符等安全漏洞,针对此类安全漏洞设计以下安全防护方案:①采用复杂设计方法设计会话标识符,避免出现伪造会话标识符的风险。②对Cookie 设置域和路径,消除固定会话安全漏洞,当用户登录后需设置新的Session ID,尽量缩短Session 有效期。③在每个会话请求中设计Token,通过随机令牌防范CSRF 攻击。④在用户注销账户时,需删除服务器Session 信息和客户端Cookie 信息,避免出现信息泄露风险。
3.5 访问控制
Web 部署的过程中,未对URL 访问权限进行有效的控制,致使攻击者能够以修改URL 导致的方式,访问原本需要认证授权后,才能访问的网站资源,即URL 越权访问。针对此类安全漏洞,可以通过访问控制来加以解决,具体方案如下:①经过授权后的用户才能对相应的资源进行访问,这是访问控制实现安全目标的关键,具体包括服务、数据属性信息、程序数据、受保护的URL 及与安全相关的配置信息等。②对于验证失败的访问操作,应当由访问控制做安全处理,如用户在某一个时间段内执行的事务频率要加以限制,这就要求频率阈值的设置合理可行,一方面能够使相关的业务需求得到满足,另一方面还要能够防止自动攻击。
3.6 数据库安全
在数据库内存储有大量的Web 数据,这些数据中,有一部分是用户隐私,如果丢失,则会造成严重的后果。为此确保数据库安全尤为重要。针对数据库漏洞,可以设计如下安全防护方案:①开发人员在设计数据库的过程中,可选用强类型的参数化查询方式,以此来代替原本的动态SQL 语句。②库的连接字符做加密处理。③将数据库中非必要的默认账户全部删除,并将无用的数据库功能关闭,由此能够大幅度提升数据库的安全性。
3.7 文件管理
在Web 应用中,文件上传存在着安全验证缺失的隐患,造成文件管理漏洞,黑客通过攻击漏洞获取Webshell。针对此类安全漏洞设计以下安全防护方案:①采用白名单策略,对用户上传的文件类型进行检查和过滤,禁止不符合业务需要的文件类型上传。文件检查项目包括文件MIME 类型、文件后缀名和文件内容验证等。②分开保存Web 应用源码文件与上传文件,设置文件上传权限。③借助白名单检查文件路径参数,及时禁止黑客利用漏洞执行的攻击操作。④不允许设置绝对路径,特别在客户端中不可以采用绝对路径。
3.8 日志管理
日志是程序维护与安全管理的重要手段,但是日志中易存在安全漏洞,需采用以下安全防范方案设计:①在应用系统中将常用的调试错误页替换为定制的错误页面,防范错误处理中泄露账号、ID 等私密信息。②设定日志记录内容,包括安全事件的失败操作或成功防御。③设定日志禁止记录的信息类型,如敏感信息等。④查看日志时,禁止代码解析日志数据,采用哈希算法随时验证日志的完整性,及时检测出日志被篡改的攻击操作。
4 结束语
综上所述,Web 应用开发与设计要采用渗透测试技术评估Web 安全性,及时识别Web 存在的安全漏洞,剖析各类漏洞的成因,并提出解决办法,进而制定出完整的Web 安全防御体系。在Web 安全防御设计中,要重点做好输入验证、身份验证、密码管理、会话管理、访问控制和数据库的安全设计,消除黑客经常发起攻击的漏洞,保证Web 应用安全。