1 什么是漏洞
1.1 一个网站的基本构成
- 前端界面:前端界面是用户访问网站时见到的页面,包括布局、样式、交互等。HTML、CSS和JavaScript通常是构建前端界面的主要技术。
- 后端服务器:后端服务器处理用户请求、执行业务逻辑和与数据库交互等。常见的后端开发语言包括Java、Python、Ruby等,并使用框架如Django、Ruby on Rails来加速开发。
- 数据库:用于存储和管理网站的数据,如用户信息、文章内容等。常见的数据库软件有MySQL、PostgreSQL、MongoDB等。
- 用户认证与安全:用于管理用户的注册、登录和权限等信息,以及对网站进行安全防护,如加密、防止跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等。
- 文件存储与交付:用于存储和传输网站的静态和动态文件,如图片、视频、CSS和JavaScript文件等。常见的文件存储与交付解决方案包括CDN(内容分发网络)和云存储服务。
- SEO(搜索引擎优化):考虑网站在搜索引擎中的排名和可见性,通过优化网站的结构、关键字、页面速度等因素,提高网站在搜索结果中的曝光度。
- 前端: JavaScript/Vue/React
- 网关: nginx
- 后端: Golang/Java/Node/C++
- 前后端交互: HTTP/WebSocket
1.2 一些发生过的安全事件
-
数据泄露:大量用户数据或敏感信息被黑客盗取或泄露,如个人身份信息、信用卡信息等。
-
勒索软件攻击:黑客通过安装恶意软件或病毒,加密用户的文件,然后要求赎金以解密文件,最著名的案例是 WannaCry 攻击。
-
DDoS 攻击:黑客通过大量恶意流量或请求,迫使目标网站或服务不可用,例如 Mirai botnet 攻击。
-
钓鱼攻击:黑客通过伪装成可信机构或个人,发送虚假电子邮件或网站,诱骗用户提供私人信息或密码。
-
CSRF 攻击:黑客利用访问权限,以受害者身份执行未经授权的操作,从而窃取用户信息或对网站进行破坏。
-
XSS 攻击:黑客通过注入恶意脚本代码,使其在受害者的浏览器中执行,从而窃取用户信息或篡改网页内容。
-
Zero-day 漏洞:黑客利用尚未公开的漏洞攻击目标系统,而开发者尚未提供修补程序。
-
社交工程:黑客通过欺骗、说服或误导来获取用户的密码或敏感信息,通常通过虚假电话、电子邮件或社交媒体等方式。
1.3 网络攻击者的意图
- 盗取信息:攻击者可能试图窃取敏感信息,如个人身份信息、信用卡信息、商业机密等,以进行个人牟利、敲诈勒索或进行其他非法活动。
- 欺骗和诈骗:攻击者可能利用钓鱼、仿冒网站等方法欺骗用户,骗取密码、账号信息、财务信息等,从而获利。
- 中断服务:攻击者可能试图通过 DDoS 攻击等手段使目标系统或网站无法正常运作,造成服务中断,可能是出于报复、勒索或单纯的破坏行为。
- 篡改和破坏:攻击者可能试图篡改网站内容、系统配置或数据,或者直接破坏目标系统的运行,以达到破坏、破坏声誉或迫使受害者付款等目的。
- 扩散恶意软件:攻击者可能通过电子邮件、下载来源等途径传播恶意软件、病毒或勒索软件,以感染用户设备、控制其计算资源、窃取信息或勒索赎金等。
- 间谍活动:攻击者可能是国家间谍或竞争对手,试图获取敏感信息、商业机密或政治情报,以获取政治、经济或军事优势。
1.4 漏洞的分类
1. 服务端漏洞
- SQL注入
- RCE/命令注入
- SSRF
- 文件上传
2. 客户端漏洞
- XSS
- CSRF
- 点击劫持
2 服务端漏洞
2.1 第三方组件漏洞的例子
- 打印一条日志,我的服务器就“中病毒”了
- 解析下json,服务器就“中病毒”了
- 防护方式:针对java可以选择使用dependency-check-maven检查项目以来的组件是否存在安全漏洞
2.2 SQL注入
SQL注入是一种常见的网络安全漏洞,它可以在处理用户输入时对数据库进行恶意攻击。它利用了未正确过滤或转义用户输入的漏洞,使攻击者能够执行构造的恶意SQL查询,从而获取、篡改甚至删除数据库中的数据。 SQL注入攻击的主要原理是通过将恶意的SQL代码插入到应用程序的用户输入字段中,从而改变原始的SQL查询的结构和含义。这可以导致数据库执行意外的查询操作,例如绕过身份验证、暴露敏感数据或破坏数据库结构。
2.2.1 SQL注入常见示例
- 登录绕过:攻击者在登录表单的用户名或密码字段中插入恶意的SQL代码,绕过身份验证,从而以其他用户的身份登录到系统。
- 数据泄露:攻击者通过在查询语句中插入特殊字符,绕过输入验证,从而获取敏感数据,如用户信息、信用卡号码等。
- 数据篡改:攻击者修改应用程序的SQL查询,改变数据库中的数据,例如修改用户的权限、篡改文章的内容等。
2.2.2 防止SQL注入攻击的方法
- 使用参数化查询或预编译语句:通过使用参数化的SQL查询或预编译语句,可以确保用户输入的数据被正确转义,从而防止恶意SQL代码的注入。
- 输入验证和过滤:对于用户输入的数据,进行合适的验证和过滤,确保数据符合预期的格式和内容,拒绝或转义一些特殊字符。
- 最小权限原则:将数据库用户的权限限制到最小必需的范围,避免攻击者通过注入攻击获得更大的权限。
- 定期更新和修补:及时更新和修补应用程序和数据库的软件版本,以修复已知的安全漏洞。
- 安全编程实践:采用安全编码实践,如代码审查、输入验证、输出编码等,以减少潜在的漏洞和风险。
2.3 越权漏洞
指攻击者通过利用软件系统中的漏洞,以非授权的方式获取比其正常权限更高的权限。简而言之,攻击者能够执行本不应被授权执行的操作或访问受限资源。
2.3.1 越权漏洞会导致以下问题
- 未授权的访问:攻击者可以访问受限的应用程序、文件、数据库或功能。
- 特权滥用:攻击者可能以具有高权限的身份执行操作,如创建、修改或删除文件、用户账户或数据库记录。
- 数据泄露:攻击者可以访问或获取他们本不应该能够获得的敏感数据,如个人身份信息、财务数据等。
2.3.2 常见的越权漏洞
- 垂直越权:这种漏洞发生在系统中,允许低权限用户以高权限用户的身份执行操作。例如,一个普通用户可以通过修改URL参数或访问未授权的功能来获取管理员权限。
- 水平越权:这种漏洞发生在系统中,它允许一个用户访问其他用户在同一权限级别下的资源或数据。例如,一个用户可以访问其他用户的私人文件或数据。
- 特权升级:这种漏洞通常发生在操作系统或应用程序中,允许攻击者获取比其正常权限更高的特权或管理员权限。例如,通过利用操作系统或应用程序的漏洞,攻击者可以执行恶意代码来提升其权限级别。
2.3.3 防止越权漏洞的方法
- 严格的访问控制:实施严格的访问控制机制,确保用户只能访问到其所需的资源,以防止未经授权的访问。
- 最小权限原则:将用户的权限限制到最小必需的范围,避免给予用户过多的权限,从而减少越权的可能性。
- 输入验证和过滤:对用户输入的数据进行合适的验证和过滤,确保数据符合预期的格式和内容,避免恶意输入导致越权漏洞。
- 安全编程实践:采用安全编码实践,如代码审查、安全漏洞扫描、输入验证等,以识别和修复潜在的越权漏洞。
- 及时更新和修补:及时更新和修补操作系统、应用程序和组件的软件版本,以修复已知的安全漏洞。
2.4 文件上传漏洞
文件上传漏洞是一种常见的网络安全漏洞,发生在允许用户上传文件的应用程序中。攻击者可以利用这个漏洞来上传恶意文件,执行任意的代码或篡改应用程序的功能。这种漏洞通常发生在没有正确验证上传文件类型、大小、路径等的情况下。
2.4.1 导致文件上传漏洞的原因
- 不正确的文件类型验证:当应用程序没有正确验证上传文件的类型或仅依靠客户端的文件类型标识时,攻击者可以上传具有恶意代码的文件,绕过检测。
- 不正确的文件大小验证:如果应用程序没有对上传文件进行适当的大小限制,攻击者可以上传巨大的文件,占用服务器资源或导致拒绝服务。
- 路径遍历漏洞:当应用程序没有正确限制上传文件的路径或对路径进行安全处理时,攻击者可以利用路径遍历漏洞来上传文件到非预期的目录。
- 不正确的文件权限设置:如果应用程序在接受上传文件后未正确设置文件权限,攻击者可能能够执行恶意代码或访问其他敏感文件。
2.4.2 防止文件上传漏洞
- 验证和过滤上传文件:验证上传文件的类型、大小和文件名等参数,并确保只有受信任的文件类型被接受,拒绝危险的文件类型。
- 设置合适的文件权限:为上传文件设置适当的文件权限,以防止恶意文件被执行或访问。
- 存储上传文件的安全位置:将上传文件存储在安全的目录中,不要将其存储在可被直接访问的目录中。
- 使用安全的编程语言和框架:使用已经考虑文件上传漏洞并提供相关保护机制的编程语言和框架。
- 定期更新和修补:及时更新应用程序和组件的软件版本,以修复已知的安全漏洞。
3 客户端漏洞
3.1 开放重定向
开放重定向(Open Redirect)是一种常见的网络安全漏洞,发生在应用程序中的重定向功能上。攻击者可以利用这个漏洞来欺骗用户,将他们重定向到恶意网站或欺诈页面,从而进行钓鱼攻击、窃取用户信息或进行其他恶意活动。
开放重定向漏洞通常发生在应用程序在进行重定向时未正确验证或过滤用户提供的重定向URL的情况下。攻击者可以构造一个恶意的URL,使应用程序将用户重定向到一个不受信任的网站或恶意页面。
3.1.1 可能导致开放重定向漏洞的原因
- 缺乏输入验证:应用程序在进行重定向之前没有对用户提供的重定向URL进行适当的验证和过滤,导致攻击者可以构造恶意的URL。
- 直接使用用户提供的URL:应用程序直接使用用户提供的URL进行重定向,而不对其进行安全处理或验证。
3.1.2 为防止开放重定向漏洞,可以采取以下措施
- 验证和过滤重定向URL:对用户提供的重定向URL进行验证和过滤,确保只允许重定向到受信任的网站或页面。
- 使用白名单:维护一个白名单,列出允许进行重定向的受信任的URL或域名,拒绝其他不受信任的URL。
- 使用相对路径:尽量使用相对路径进行重定向,而不是直接使用完整的URL。
- 显示警告信息:在进行重定向时,向用户显示警告信息,提醒他们即将离开当前网站。
- 安全编程实践:采用安全编码实践,如代码审查、输入验证、输出编码等,以减少潜在的漏洞和风险。
3.2 XSS(跨站脚本攻击)
3.2.1 XSS是什么
XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到受信任的网站中,然后在用户的浏览器上执行这些脚本。这种漏洞通常出现在没有适当验证和过滤用户输入的情况下,导致恶意脚本被执行。
3.2.2 XSS的几种类型
- 存储型XSS:攻击者将恶意脚本存储在网站的数据库中,当其他用户访问到包含这些恶意脚本的页面时,脚本会被执行。
- 反射型XSS:恶意脚本作为URL参数传递给目标网站,然后网站将恶意脚本反射给用户的浏览器执行。
- DOM-based XSS:攻击者利用网页的DOM(文档对象模型)中的漏洞,通过修改DOM结构或执行脚本来进行攻击。
3.2.3 XSS攻击可以导致以下危害
- 窃取用户信息:攻击者可以通过注入恶意脚本来窃取用户的敏感信息,如登录凭据、会话cookie等。
- 盗取用户身份:恶意脚本可以劫持用户的身份,以受信任用户的身份进行恶意操作。
- 恶意重定向:攻击者可以将用户重定向到恶意网站,进行进一步的攻击或欺诈行为。
3.2.4 为防止XSS攻击,可以采取以下措施
- 输入验证和过滤:对用户输入进行适当的验证和过滤,确保只接受符合预期格式和内容的数据。
- 输出编码:在将用户输入数据输出到网页上时,使用适当的编码方式来转义特殊字符,防止恶意脚本被执行。
- 最小化权限:将网站和应用程序的权限限制到最小必需的范围,以减少攻击者可以利用的攻击表面。
- 定期更新和修补:及时更新网站和应用程序的软件版本,以修复已知的安全漏洞。
- 使用Web应用程序防火墙(WAF):使用WAF来检测和阻止恶意脚本的注入和执行。
3.3 CSRF(跨站请求伪造,Cross-Site Request Forgery)
3.3.1 CSRF是什么
CSRF(跨站请求伪造,Cross-Site Request Forgery)是一种网络安全漏洞,它允许攻击者在用户不知情的情况下,利用用户的身份执行未经授权的操作。攻击者通过诱使用户访问恶意网站或点击恶意链接,来发送伪造的请求,以执行攻击者想要的操作。
3.3.2 CSRF攻击的过程如下
- 用户登录到目标网站A并获取了有效的身份验证凭据,例如cookie。
- 用户在同一浏览器中访问了恶意网站B。
- 恶意网站B中的恶意代码发出伪造的请求,该请求会自动在用户的浏览器中向目标网站A发送,利用用户的有效凭据进行身份验证。
- 目标网站A在接收到该伪造请求时,会将其当作是合法请求并执行对应的操作,这可能包括修改用户个人信息、发起资金转账等恶意操作。
3.3.3 为防止CSRF攻击,可以采取以下措施
- 验证请求来源:在目标网站A中对每个请求进行验证,确保请求来源于同一网站,而不是跨站点请求。
- 使用CSRF令牌:在每个表单或敏感请求中使用CSRF令牌(也称为同步令牌),该令牌由服务器生成并与用户的会话关联。验证请求中的CSRF令牌,确保请求来源合法。
- 设置HTTP头部:通过设置HTTP头部中的
SameSite属性为"Strict"或"Lax",可以限制跨站点请求,并仅允许在同一站点下发送请求。 - 登出功能:提供安全的登出功能,以便用户可以主动结束与目标网站的会话。
- 定期更新和修补:及时更新网站和应用程序的软件版本,以修复已知的安全漏洞。
- 限制敏感操作的权限:限制对敏感操作的权限,确保只有经过授权的用户才能执行这些操作。
3.4 点击劫持(Clickjacking)
3.4.1 点击劫持是什么
点击劫持(Clickjacking)是一种网络安全攻击,它利用透明的、可见或不可见的层覆盖在诱导用户点击的页面上,欺骗用户点击的是看似无害的元素,实际上会执行恶意操作或提交敏感信息。
3.4.2 点击劫持的过程如下
- 攻击者创建一个包含恶意内容的网页,并将其隐藏或叠加在正常网站或应用程序的页面上。
- 攻击者诱导用户访问受感染的页面。这可以通过诱导用户点击恶意链接、欺骗用户上传可执行操作的文件等方式实现。
- 用户访问受感染的页面时,看到的只是正常页面的一部分,而实际上他们的点击行为被重定向到隐藏的恶意操作上,从而执行攻击者想要的操作。
3.4.3 点击劫持危害
- 窃取敏感信息:攻击者可以通过点击劫持将用户的点击行为重定向到恶意操作上,以窃取用户的敏感信息,如密码、银行账号等。
- 进行欺诈操作:攻击者可以利用点击劫持来执行未经授权的操作,如转账、购买商品等,从而欺骗用户并造成财务损失。
3.4.4 为防止点击劫持攻击,可以采取
- X-Frame-Options头部:通过在网页的HTTP响应头部中设置X-Frame-Options属性为"deny"或"sameorigin",来限制页面被嵌入到其他网站的iframe中。这样可以防止点击劫持攻击者以iframe方式嵌入恶意页面。
- Content Security Policy(CSP):使用CSP来限制页面中可以加载的资源,以防止恶意脚本的注入和执行。
- JavaScript防御:使用JavaScript技术来防止页面被嵌入到iframe中,或监测页面是否被嵌入到其他网站中。
- 用户教育:提高用户的安全意识,教育他们警惕点击可疑链接,不要轻信未经验证的网站和应用程序。
3.5 CORS(跨域资源共享,Cross-Origin Resource Sharing)
一种浏览器安全机制,用于控制在不同源(Origin)之间进行跨域资源的访问。同源策略要求浏览器只能在同一源的页面间进行交互,而CORS则允许服务器在响应中明确指定可信任的其他域的访问权限。
当浏览器发起跨域请求时,会先发送一个预检请求(OPTIONS请求),以检查服务器是否允许访问。服务器通过在响应头中设置CORS相关字段,来告知浏览器是否允许跨域访问。
3.5.1 常用的CORS相关字段
- Access-Control-Allow-Origin:指定允许访问的域或域列表。可以是具体的域名、“*”(表示允许所有域访问)或null(表示禁止所有域访问)。
- Access-Control-Allow-Methods:指定允许的HTTP方法,例如GET、POST、PUT等。
- Access-Control-Allow-Headers:指定允许的自定义HTTP头部。
- Access-Control-Expose-Headers:指定允许浏览器访问的响应头部。
- Access-Control-Allow-Credentials:指定是否允许发送请求的凭据,如cookie或HTTP认证信息等。
- Access-Control-Max-Age:指定预检请求的有效期限,单位为秒。
3.5.2 CORS的使用可以带来以下好处
- 安全性:CORS提供了一种安全的方法来控制跨域访问,避免了潜在的安全漏洞。
- 灵活性:CORS允许服务器控制访问权限,可以精确指定允许访问的域。
- 兼容性:CORS已经被主流的浏览器广泛支持,可以在跨域场景下正常进行数据交互。
3.5.3 总结
CORS是一种浏览器安全机制,通过在服务器的响应头中设置相关字段,允许不同源之间进行跨域资源的安全访问。它提供了更严格的安全控制和灵活的访问配置,使得跨域请求变得更加可控和安全。
3.6 WebSocket
WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许在客户端和服务器之间实时地进行双向数据传输。
3.6.1 相比传统的HTTP协议,WebSocket的特点
- 双向通信:WebSocket允许服务器主动向客户端推送消息,而不需要客户端发起请求。这使得实时通信、即时聊天和实时数据更新等应用变得更加简单高效。
- 低延迟:WebSocket减少了额外的HTTP请求头大小和握手延迟,以及在每次请求中建立和终止连接的开销,从而实现了更低的延迟。
- 节省带宽:由于WebSocket建立在单个TCP连接上,避免了HTTP头部的重复发送,减少了通信所需的带宽开销。
- 适应性:WebSocket协议可以穿透防火墙和代理服务器,支持跨域通信,在大多数现代浏览器和服务器环境中得到广泛支持。
3.6.2 使用WebSocket的基本过程
-
客户端发起WebSocket握手请求,请求头中包含协议版本和支持的子协议等信息。
-
服务器收到请求后,通过HTTP响应返回握手确认信息(HTTP状态码101 Switching Protocols),并在响应头中标明使用WebSocket协议。
-
握手成功后,WebSocket连接建立完成,客户端和服务器之间可以进行双向通信。
-
客户端和服务器可以通过WebSocket的API发送和接收消息,实现实时的双向数据传输。
4 总结/注意事项
作为合法守纪的人民,我们要遵守国家的法律规定。
网站运营者:确保收集的个人信息安全,防止信息泄露,损毁,丢失。
组织/个人:个人和组织不得窃取或者以其他非法方式获取个人信息,不得非法出售或者非法向他人提供个人信息。