跳到主要内容 常见 Web 漏洞渗透及防护方法 | 极客日志
编程语言 java
常见 Web 漏洞渗透及防护方法 常见 Web 漏洞包括弱口令、文件上传、命令注入、SQL 注入、跨站脚本、跨站请求伪造、内部后台暴露、信息泄露、身份认证失效、访问控制失效、安全配置错误、组件漏洞及业务逻辑漏洞等。针对每种漏洞提供风险评级、渗透测试方法及具体安全建议,如使用白名单机制、预处理语句、令牌验证、最小权限原则等,旨在帮助开发者构建更安全的 Web 应用并有效防御攻击。
常见 Web 漏洞渗透及防护方法
弱口令漏洞
漏洞描述
目标网站管理入口(或数据库等组件的外部连接)使用了容易被猜测的简单字符口令、或者是默认系统账号口令。
渗透测试
如果不存在验证码,则直接使用相对应的弱口令字典使用 Burp Suite 进行爆破。
如果存在验证码,则看验证码是否存在绕过、以及看验证码是否容易识别。
风险评级
安全建议
默认口令以及修改口令都应保证复杂度,比如:大小写字母与数字或特殊字符的组合,口令长度不小于 8 位等。
定期检查和更换网站管理口令。
实施多因素认证(MFA)以增强安全性。
文件下载(目录浏览)漏洞
漏洞描述 一些网站由于业务需求,可能提供文件查看或下载的功能,如果对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意的文件,可以是源代码文件、敏感文件等。
渗透测试
查找可能存在文件包含的漏洞点,比如 js、css 等页面代码路径。
看看有没有文件上传访问的功能。
采用 ../ 来测试能否跨目录访问文件。
风险评级
安全建议
采用白名单机制限制服务器目录的访问,以及可以访问的文件类型(小心被绕过)。
过滤 ./ 等特殊字符。
采用文件流的访问返回上传文件(如用户头像),不要通过真实的网站路径。
禁用目录列表功能,确保 Web 服务器配置正确。
任意文件上传漏洞
漏洞描述 目标网站允许用户向网站直接上传文件,但未对所上传文件的类型和内容进行严格的过滤。
渗透测试
收集网站信息,判断使用的语言(PHP, ASP, JSP)。
尝试绕过过滤规则,例如利用 listings false 等技巧。
安全建议
对上传文件做有效文件类型判断,采用白名单控制的方法,开放只允许上传的文件格式。
文件类型判断,应对上传文件的后缀、文件头、图片类的预览图等做检测来判断文件类型。
注意重命名(Md5 加密)上传文件的文件名,避免攻击者利用 WEB 服务的缺陷构造畸形文件名实现攻击目的。
禁止上传目录有执行权限。
使用随机数改写文件名和文件路径,使得用户不能轻易访问自己上传的文件。
在服务器端验证文件内容,而不仅仅是依赖前端校验。
命令注入漏洞
漏洞描述 目标网站未对用户输入的字符进行特殊字符过滤或合法性校验,允许用户输入特殊语句,导致各种调用系统命令的 web 应用,会被攻击者通过命令拼接、绕过黑名单等方式,在服务端运行恶意的系统命令。
渗透测试
寻找参数传递点,尝试注入特殊字符如 ;, |, &, $() 等。
观察响应时间变化或错误信息泄露。
风险评级
安全建议
拒绝使用拼接语句的方式进行参数传递。
尽量使用白名单的方式(首选方式)。
过滤危险方法、特殊字符,如:|, &, ;, ', " 等。
使用安全的 API 替代系统命令调用,如 Java 的 ProcessBuilder 需严格校验参数。
SQL 注入漏洞
漏洞描述 目标网站未对用户输入的字符进行特殊字符过滤或合法性校验,允许用户输入特殊语句查询后台数据库相关信息。
渗透测试
手动测试,判断是否存在 SQL 注入,判断是字符型还是数字型,是否需要盲注。
工具测试,使用 sqlmap 等工具进行辅助测试。
风险评级
安全建议
防范 SQL 注入攻击的最佳方式就是将查询的逻辑与其数据分隔,如 Java 的预处理(PreparedStatement),PHP 的 PDO。
拒绝使用拼接 SQL 的方式。
对数据库账户进行最小权限分配,防止注入后获取过高权限。
开启 WAF 规则拦截常见的 SQL 注入特征。
跨站脚本漏洞 (XSS)
漏洞描述 当应用程序的网页中包含不受信任的、未经恰当验证或转义的数据时,或者使用可以创建 HTML 或 JavaScript 的浏览器 API 更新现有的网页时,就会出现 XSS 缺陷。XSS 让攻击者能够在受害者的浏览器中执行脚本,并劫持用户会话、破坏网站或将用户重定向到恶意站点。
三种 XSS 漏洞类型
存储型 :用户输入的信息被持久化,并能够在页面显示的功能,都可能存在存储型 XSS,例如用户留言、个人信息修改等。
反射型 :URL 参数需要在页面显示的功能都可能存在反射型跨站脚本攻击,例如站内搜索、查询功能。
DOM 型 :涉及 DOM 对象的页面程序,包括:document.URL、document.location、document.referrer、window.location 等。
渗透测试
存储型:尝试在表单中输入脚本标签,查看是否持久化。
反射型:修改 URL 参数注入脚本,查看是否回显。
DOM 型:检查 JS 代码中对 URL 参数的处理逻辑。
风险评级
安全建议
不信任用户提交的任何内容,对用户输入的内容,在后台都需要进行长度检查,并且对 <, >, ", ', & 等字符做过滤。
任何内容返回到页面显示之前都必须加以 html 编码,即将 <, >, ", ', & 进行转义。
设置 Content-Security-Policy (CSP) 响应头,限制可执行的脚本来源。
跨站请求伪造漏洞 (CSRF)
漏洞描述 CSRF,全称为 Cross-Site Request Forgery,跨站请求伪造,是一种网络攻击方式,它可以在用户毫不知情的情况下,以用户的名义伪造请求发送给被攻击站点,从而在未授权的情况下进行权限保护内的操作,如修改密码,转账等。
渗透测试
构造恶意链接诱导用户点击。
检查关键操作是否有 Token 验证。
风险评级
安全建议
使用一次性令牌:用户登录后产生随机 token 并赋值给页面中的某个 Hidden 标签,提交表单时候,同时提交这个 Hidden 标签并验证,验证后重新产生新的 token,并赋值给 hidden 标签。
适当场景添加验证码输入:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串。
请求头 Referer 校验,url 请求是否前部匹配 Http(s)://ServerHost。
关键信息输入确认提交信息的用户身份是否合法,比如修改密码一定要提供原密码输入。
用户自身可以通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的 cookie。
内部后台地址暴露
漏洞描述 一些仅被内部访问的地址,对外部暴露了,如:管理员登陆页面;系统监控页面;API 接口描述页面等,这些会导致信息泄露,后台登陆等地址还可能被爆破。
渗透测试
通过常用的地址进行探测,如 login.html, manager.html, api.html 等。
可以借用 burpsuite 和常规页面地址字典,进行扫描探测。
风险评级
安全建议
禁止外网访问后台地址。
使用非常规路径(如对 md5 加密)。
部署 WAF 或防火墙策略限制特定 IP 段访问管理后台。
信息泄露漏洞
漏洞描述
备份信息泄露 :目标网站未及时删除编辑器或者人员在编辑文件时,产生的临时文件,或者相关备份信息未及时删除导致信息泄露。
测试页面信息泄露 :测试界面未及时删除,导致测试界面暴露,被他人访问。
源码信息泄露 :目标网站文件访问控制设置不当,WEB 服务器开启源码下载功能,允许用户访问网站源码。
错误信息泄露 :目标网站 WEB 程序和服务器未屏蔽错误信息回显,页面含有 CGI 处理错误的代码级别的详细信息,例如 SQL 语句执行错误原因,PHP 的错误行数等。
接口信息泄露 :目标网站接口访问控制不严,导致网站内部敏感信息泄露。
渗透测试
备份信息泄露、测试页面信息泄露、源码信息泄露,测试方法:使用字典,爆破相关目录,看是否存在相关敏感文件。
错误信息泄露,测试方法:发送畸形的数据报文、非正常的报文进行探测,看是否对错误参数处理妥当。
接口信息泄露漏洞,测试方法:使用爬虫或者扫描器爬取获取接口相关信息,看目标网站对接口权限是否合理。
风险评级 一般为中风险,如果源码大量泄漏或大量客户敏感信息泄露。
安全建议
备份信息泄露漏洞:删除相关备份信息,做好权限控制。
测试页面信息泄露漏洞:删除相关测试界面,做好权限控制。
源码信息泄露漏洞:做好权限控制。
错误信息泄露漏洞:将错误信息对用户透明化,在 CGI 处理错误后可以返回友好的提示语以及返回码。但是不可以提示用户出错的代码级别的详细原因。
接口信息泄露漏洞:对接口访问权限严格控制。
失效的身份认证
漏洞描述 通常,通过错误使用应用程序的身份认证和会话管理功能,攻击者能够破译密码、密钥或会话令牌,或者利用其它开发缺陷来暂时性或永久性冒充其他用户的身份。
渗透测试
在登陆前后观察,前端提交信息中,随机变化的数据,总有与当前已登陆用户进行绑定的会话唯一标识,常见如 cookie。
一般现在网站没有那种简单可破解的标识,但是如果是跨站认证,单点登录场景中,可能为了开发方便而简化了身份认证。
风险评级
安全建议
使用强身份识别,不使用简单弱加密方式进行身份识别。
服务器端使用安全的会话管理器,在登录后生成高度复杂的新随机会话 ID。
会话 ID 不能在 URL 中,可以安全地存储,在登出、闲置超时后使其失效。
实施密码策略,强制定期更换密码并限制历史密码复用。
失效的访问控制
漏洞描述 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据,例如:访问其他用户的帐户、查看敏感文件、修改其他用户的数据、更改访问权限等。
渗透测试
登入后,通过 burpsuite 抓取相关 url 链接,获取到 url 链接之后,在另一个浏览器打开相关链接,看能够通过另一个未登入的浏览器直接访问该功能点。
使用 A 用户登陆,然后在另一个浏览器使用 B 用户登陆,使用 B 访问 A 独有的功能,看能否访问。
风险评级
安全建议
除公有资源外,默认情况下拒绝访问非本人所有的私有资源。
对 API 和控制器的访问进行速率限制,以最大限度地降低自动化攻击工具的危害。
当用户注销后,服务器上的 Cookie,JWT 等令牌应失效。
对每一个业务请求,都进行权限校验。
安全配置错误
漏洞描述
应用程序缺少适当的安全加固,或者云服务的权限配置错误。
应用程序启用或安装了不必要的功能(例如:不必要的端口、服务、网页、帐户或权限)。
默认帐户的密码仍然可用且没有更改。
错误处理机制向用户披露堆栈跟踪或其他大量错误信息。
对于更新的系统,禁用或不安全地配置最新的安全功能。
应用程序服务器、应用程序框架(如:Struts、Spring、ASP.NET)、库文件、数据库等没有进行相关安全配置。
渗透测试
先对应用指纹等进行信息搜集,然后针对搜集的信息,看相关应用默认配置是否有更改,是否有加固过。
端口开放情况,是否开放了多余的端口。
风险评级
安全建议
搭建最小化平台,该平台不包含任何不必要的功能、组件、文档和有环境中按照标准的加固流程进行正确安全配置。
定期更新系统和软件版本,修补已知漏洞。
移除默认账户和示例应用。
使用含有已知漏洞的组件
漏洞描述 使用了不再支持或者过时的组件。这包括:OS、Web 服务器、应用程序服务器、数据库管理系统(DBMS)、应用程序、API 和所有的组件、运行环境和库。
渗透测试
根据前期信息搜集的信息,查看相关组件的版本,看是否使用了不在支持或者过时的组件。
一般来说,信息搜集,可通过 http 返回头、相关错误信息、应用指纹、端口探测(Nmap)等手段搜集。
Nmap 等工具也可以用于获取操作系统版本信息。
通过 CVE,CNVD 等平台可以获取当前组件版本是否存在漏洞。
风险评级
安全建议
移除不使用的依赖、不需要的功能、组件、文件和文档。
仅从官方渠道安全的获取组件 (尽量保证是最新版本),并使用签名机制来降低组件被篡改或加入恶意漏洞的风险。
监控那些不再维护或者不发布安全补丁的库和组件。如果不能打补丁,可以考虑部署虚拟补丁来监控、检测或保护。
业务逻辑漏洞
1. 短信炸弹 漏洞描述 :短信轰炸攻击是常见的一种攻击,攻击者通过网站页面中所提供的发送短信验证码的功能处,通过对其发送数据包的获取后,进行重放,如果服务器短信平台未做校验的情况时,系统会一直去发送短信,这样就造成了短信轰炸的漏洞。
渗透测试 :手工找到有关网站注册页面,认证页面,是否具有短信发送页面,如果有,则进行下一步。通过利用 burp 或其它抓包截断工具,抓取发送验证码的数据包,并且进行重放攻击,查看手机是否在短时间内连续收到 10 条以上短信,如果收到大量短信,则说明存在该漏洞。
风险评级 :可对任意手机号轰炸判定为高风险;只可对当前手机号轰炸或单个手机号码做了限制,但变换手机号码仍然可以不断发送的,判定为低风险。
安全建议 :合理配置后台短信服务器的功能,对于同一手机号码,同一验证发送次数不超过 5-10 次,且对发送时间间隔做限制;当发送超过一定次数(可以为 0),加入验证码验证。
2. 邮件炸弹 漏洞描述 :应用系统未限制邮件的发送次数和频率,造成短时间内大量邮件发送至接收者邮箱,造成大量垃圾邮件。
渗透测试 :手工找到有关网站注册页面,认证页面,是否具有邮件发送页面,如果有,则进行下一步。通过利用 burp 或其它抓包截断工具,抓取发送邮件的数据包,并且进行重放攻击,查看邮箱是否在短时间内连续收到 10 封以上邮件,如果收到大量邮件,则说明存在该漏洞。
风险评级 :可对任意邮箱轰炸,判定为高风险;只可对当前邮箱轰炸,判定为低风险。
安全建议 :合理配置后台邮件服务器的功能,对于同一邮箱,同一验证发送次数不超过 5-10 次,且对发送的时间间隔做限制;当发送超过一定次数(可以为 0),加入验证码验证。
3. 短信定向转发 漏洞描述 :短信接收人可任意指定。
渗透测试 :拦截发送短信的请求,将手机号改为测试人员的手机号,测试是否可接收短信验证码。
风险评级 :高风险。
安全建议 :发送短信时手机号从当前会话中获取,避免从前端传入;用户的手机号不能随意变动,需要认证过程。
4. 邮件可定向转发 漏洞描述 :应用系统发送邮件的接收人可由客户端任意指定。
渗透测试 :拦截发送邮件的请求,将接收人邮箱改为测试人员的邮箱地址,测试是否可接收邮件。
风险评级 :高风险。
安全建议 :发送邮件时邮箱从当前会话中获取,避免从前端传入;用户的邮箱不能随意变动,需要认证过程。
5. 任意用户密码修改/重置 漏洞描述 :可通过篡改用户名或 ID、暴力破解验证码等方式修改/重置任意账户的密码。
渗透测试 :密码修改的步骤一般是先校验用户原始密码是否正确,再让用户输入新密码。修改密码机制绕过方式大概有以下三种:
如果输入新密码的接口可以直接访问,那么在未知原始密码的的情况下即可直接修改密码,通常知道了他人的用户名即可任意修改他人的密码。
如果系统未校验修改密码的用户身份,那么在提交修改密码请求时,攻击者通过输入密码,将用户名或者用户 ID 修改为其他人的,即可成功修改他人的密码。
当修改密码时系统需要电子邮件或者手机短信确认,而应用程序未校验用户输入的邮箱和手机号,那么攻击者通过填写自己的邮箱或手机号接收修改密码的链接和验证码,以此修改他人的密码。
密码重置机制绕过攻击方式主要有以下两种:
通过正常手段获取重置密码的链接,猜解链接的组成结构和内容(如用户名或者时间戳的 MD5 值)。在得知他人邮箱的情况下,构造重置他人密码的链接。
在得知他人手机号的情况下,通过穷举手机验证码重置他人的密码。
风险评级 :高风险。
安全建议 :一次性填写校验信息(原始密码、新密码等)后再提交修改密码请求;对客户端提交的修改密码请求,应对请求的用户身份与当前登录的用户身份进行校验,判断是否有权修改用户的密码;使用手机或邮箱进行验证时,要与修改密码的用户一一对应,且验证码仅一次有效,验证之后即失效,避免暴力破解;对原始密码进行了验证的情况下,限制输入原始密码的错误次数,防止攻击者暴力破解原始密码;重置密码链接中的关键信息应随机化,不可预测(例如 token 机制),且禁止将关键信息返回到客户端。
6. SSO 认证缺陷 漏洞描述 :SSO 认证存在缺陷,可越权登录他人账户。
渗透测试 :
信息传输缺乏安全保证:SSO 认证通信过程中大多数采用明文形式传送敏感信息,这些信息很容易被窃取,致使重要信息泄露。另外,在通信过程中大多数场景没有对关键信息进行签名,容易遭到伪装攻击。
利用 Web 服务的安全缺陷:由于单点登录基本上是基于 Web 服务实现的,所以也不可避免的存在 Web 服务的安全缺陷,如跨站脚本攻击、越权攻击等。
风险评级 :高风险。
安全建议 :建议在不影响业务的前提下,使用 HTTPS 协议传输;严格校验 SSO 认证过程中的用户身份;过滤用户传入的参数,对特殊符号进行转义或屏蔽。
7. 越权 漏洞描述 :越权访问,这类漏洞是指应用在检查授权(Authorization)时存在纰漏,使得攻击者在获得低权限用户帐号后,可以利用一些方式绕过权限检查,访问或者操作到原本无权访问的高权限功能。在实际的代码安全审查中,这类漏洞往往很难通过工具进行自动化检测,因此在实际应用中危害很大。其与未授权访问有一定差别。
渗透测试 :以超管 admin(高权限用户)身份登录系统;找到一个只有超管(高权限)才有的功能的链接,比如:http://localhost/userManage/userList.do,显示出所有的 user,并复制此链接;以普通用户登陆进系统,在地址栏输入:userManage/userList.do,确认是否可以查看到其所有的 user;还可以测试同级别用户的横向越权访问。
风险评级 :高风险。
安全建议 :对用户操作进行权限校验,防止通过修改参数进入未授权页面及进行非法操作,建议在服务端对请求的数据和当前用户身份做一个校验检查。
8. 恶意锁定问题 漏洞描述 :通过不断的输入错误的密码可恶意锁定任意账号。
渗透测试 :针对测试账户,不断输入错误的密码,直至将其锁定。
风险评级 :锁定账户之后,可继续使用认证功能,导致可批量自动化账户锁定,为中风险;锁定账户之后,可继续使用认证功能,但认证存在防自动化功能,为低风险。
安全建议 :账户锁定之后应不能继续使用认证功能,如对请求 IP 进行一个限制,一段时间之后才可以继续尝试认证;认证功能防自动化操作,如添加图形验证码。
9. 负值反冲/正负值对冲 漏洞描述 :应用程序未校验订单数据的取值范围,交易存在负值反冲或正负值对冲。
渗透测试 :提交订单时拦截请求,修改订单参数为负数,如商品单价、数量、总价等;提交订单(包含多种商品)时拦截请求,修改部分商品的单价或数量,保证订单总金额为正数。
风险评级 :高风险。
安全建议 :服务器端在生成交易订单时,商品的价格从数据库中取出,禁止使用客户端发送的商品价格;服务器端对客户端提交的交易数据(如商品 ID、商品数量、商品价格等)的取值范围进行校验,将商品 ID 和商品价格与数据库中的数据对比校验,商品数量为大于零的整型数;服务器端在生成支付订单时,对支付订单中影响支付金额的所有因素(比如商品 ID、商品数量、商品价格、订单编号等)进行签名,对客户端提交的支付订单进行校验。
10. 业务流程跳跃 漏洞描述 :业务逻辑流程分步骤进行且能越过中间校验步骤直接进行后续操作,导致中间校验等步骤失效。
渗透测试 :首先完成正常的业务逻辑步骤,获取每一个步骤的请求;绕过中间步骤,直接访问最后一个或几个验证请求,看是否可绕过。
风险评级 :高风险。
安全建议 :建议在不影响业务的前提下,在 Session 中添加对每一步流程页面的校验标志位,在新步骤页面浏览过程前要检测之前每一步的 session 标志位,且要与用户身份强绑定。
10.1 密码修改/重置流程跳跃(特殊场景) 漏洞描述 :密码修改功能常采用分步骤方式来实现,攻击者在未知原始密码的情况下绕过某些检验步骤修改用户密码。
渗透测试 :完成修改/重置密码的正常流程,判断验原密码步骤成功的标识是否可伪造;绕过检验原密码等步骤,直接访问输入新密码接口,输入新密码,修改/重置密码。
风险评级 :高风险。
安全建议 :一次性填写校验信息(原始密码、新密码等)后再提交修改/重置密码请求。
总结 Web 安全是一个持续的过程,随着技术的发展,攻击手段也在不断演变。开发者在构建应用时,应遵循安全开发生命周期(SDL),在设计阶段就考虑安全需求,在编码阶段遵循安全规范,在测试阶段进行充分的安全测试。除了上述提到的漏洞,还应关注 OWASP Top 10 中的其他风险,如不安全的设计、身份验证失败、敏感信息泄露等。通过建立完善的防御体系,结合自动化工具与人工审计,才能最大程度地保障 Web 应用的安全性。
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online