Web漏洞之CSRF和SSRF
Web漏洞之CSRF和SSRF
CSRF
CSRF(Cross Site Request Forgery,跨站请求伪造)是一种通过利用用户身份认证信息,诱导用户执行非预期请求的攻击方式。
一、基础知识
1. 漏洞原理
CSRF 的核心在于黑客利用用户的身份认证信息,让用户在不知情的情况下向受信任的网站发送请求。例如,黑客可能诱导用户执行银行转账操作,而银行由于接收到用户的身份认证信息,误以为这是合法请求,从而导致损失。
2. 与 XSS 的区别
- CSRF:通过借用用户的权限完成攻击,攻击者并未直接获取用户的权限。
- XSS:攻击者直接窃取用户的权限,实施破坏。
3. 攻击过程
- 用户访问受信任网站 A,并登录。
- 网站 A 返回 Cookie 信息,用户可以正常操作。
- 用户未退出网站 A 的情况下,打开另一个恶意网站 B。
- 网站 B 返回恶意代码,并触发对网站 A 的请求。
- 浏览器携带用户的 Cookie 信息,向网站 A 发送请求。网站 A 误以为请求来自合法用户,从而执行操作。
4. 实例
黑客 Mallory 创建一个带有如下代码的恶意网站:
<img src="http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory" />
当受害者 Bob 登录银行后访问该恶意网站时,浏览器会自动发送该请求,附带 Bob 的 Cookie 信息。银行服务器在未识别请求来源的情况下,执行了转账操作,导致 Bob 的损失。
二、防御措施
1. 验证用户操作
在执行敏感操作(如转账)时,要求用户重新输入密码。
2. 验证 HTTP Referer 字段
通过检查 HTTP Referer 确保请求来源于受信任的页面。例如,银行网站的请求来源应为自身域名。缺点是部分浏览器可能被篡改 Referer 或用户自行关闭 Referer。
3. 请求地址中添加 Token
在请求中加入难以伪造的 Token,服务端验证 Token 的正确性。例如:
- 对于 GET 请求:
http://example.com/action?token=uniqueToken
- 对于 POST 请求:
<input type="hidden" name="csrftoken" value="uniqueToken" />
Token 的安全性需特别注意,避免被外部恶意用户获取。
4. 设置验证码
在关键操作中要求用户完成验证码验证,防止自动化攻击。
SSRF
SSRF(Server Side Request Forgery,服务器端请求伪造)是一种通过伪造服务器请求,利用服务器访问攻击者无法直接访问资源的漏洞。
一、基础知识
1. 漏洞原理
SSRF 攻击通常利用网站提供的从远程服务器获取数据的功能,构造恶意请求,诱使服务器访问内部系统。例如:某网站允许用户输入图片链接以加载远程图片,攻击者可输入恶意链接,触发服务器访问内网。
2. 示例
某网站允许通过 URL 参数加载文章内容:
http://www.example.com/article.php?url=https://blog.example.com/article
攻击者可构造以下恶意 URL:
- 访问本地文件:
http://www.example.com/article.php?url=file:///etc/passwd
- 访问本地服务:
http://www.example.com/article.php?url=http://127.0.0.1:22
- 使用其他协议:
dict://127.0.0.1:22/data:data2
gopher://127.0.0.1:2233/_test
通过这些 URL,攻击者可以利用服务器获取内部系统信息。
二、挖掘方法
1. 从功能上寻找
- 分享功能:通过 URL 分享内容。
- 转码服务:对 URL 内容进行优化处理。
- 在线翻译:通过 URL 翻译文本。
- 图片加载或下载:通过 URL 加载或下载图片。
- 未公开 API:通过 URL 访问 API 功能。
2. 从 URL 关键字上寻找
关键字包括:share
、url
、link
、src
、source
、target
、imageURL
等。
三、防御措施
1. 限制请求协议
仅允许 HTTP 和 HTTPS 协议,禁止如 file://
、dict://
、gopher://
等协议。
2. 限制访问 IP 地址
仅允许访问白名单内的外部 IP 地址,禁止访问本地或内网地址(如 127.0.0.1
、192.168.0.0/16
)。
3. 限制访问端口
禁止访问敏感端口(如 22
、3306
等),避免访问非必要服务。
4. 统一错误处理
设置统一的错误页面,防止信息泄露。例如,不返回具体的错误信息,而是返回通用提示。
通过了解 CSRF 和 SSRF 的原理及防御方法,可以有效地保护 Web 应用程序免受此类攻击,提高系统的安全性。