一、CSRF(跨站请求伪造)和XSS(跨站脚本攻击)的区别
特点 | CSRF | XSS |
---|---|---|
攻击目标 | 服务器上的受保护资源 | 客户端的浏览器 |
攻击原理 | 利用用户已登录的身份,诱骗用户点击恶意链接,从而在用户不知情的情况下以用户的名义发送恶意请求 | 通过注入恶意脚本,在用户浏览网页时执行,获取用户敏感信息或控制用户浏览器 |
攻击方式 | 伪造请求,利用浏览器自动携带cookie | 注入恶意脚本,利用浏览器执行脚本 |
危害 | 窃取用户信息、篡改数据、执行非授权操作 | 窃取用户信息、传播恶意软件、钓鱼攻击、破坏网站 |
防御措施 | 验证请求来源、使用验证码、token机制 | 输入验证、输出编码、内容安全策略(CSP) |
二、CSRF攻击步骤
1. 准备阶段:
- 攻击者创建恶意页面:攻击者设计一个网页或应用程序,包含会自动向目标网站发送请求的恶意代码(通常是JavaScript、HTML表单等)。
- 了解目标网站的请求:攻击者需要了解目标网站的请求格式和参数,通常通过分析请求的网络流量或逆向工程来获得这些信息。
2. 诱导用户访问恶意页面:
- 传播恶意链接:攻击者通过电子邮件、社交媒体、论坛等手段,诱导用户点击包含恶意代码的链接。
- 嵌入恶意内容:攻击者将恶意代码嵌入到合法的网页中,诱使用户在浏览这些网页时触发CSRF攻击。
3. 用户浏览恶意页面:
- 用户在登录状态下访问恶意页面:用户在浏览器中访问恶意页面时,恶意代码会在用户的浏览器中自动执行,通常是通过发送伪造的请求到目标网站。
4. 执行恶意请求:
- 伪造请求:恶意代码会以用户的身份向目标网站发送伪造的请求。这些请求通常包含用户的认证信息(如Cookies),因此目标网站会认为请求是合法的。
- 执行未授权操作:如果目标网站没有有效的CSRF保护机制,伪造的请求可能会导致未经授权的操作(如转账、修改设置、删除账户等)。
5. 完成攻击:
- 攻击结果:一旦请求被目标网站处理,攻击者就可以达到他们的目的,比如盗取用户信息、损害用户账户等。
三、CSRF手工构造POST型页面方法
1. 分析目标网站
- 找出存在漏洞的POST请求:
- 确定目标网站上哪些功能是需要保护的,比如修改密码、转账等。
- 使用浏览器开发者工具抓包,分析这些功能对应的POST请求,包括URL、参数名和参数值。
- 了解网站的防御措施:
- 是否使用了token机制、referer验证等防御手段。
- 这些防御措施的实现方式如何。
2. 构造攻击页面
- 创建HTML表单:
- 使用HTML的
<form>
标签创建一个表单。 - 设置表单的
action
属性为目标网站的漏洞URL。 - 设置表单的
method
属性为"POST"。 - 为每个POST参数创建一个
<input>
标签,设置其type
、name
和value
属性。
- 使用HTML的
- 隐藏表单:
- 可以使用CSS将表单隐藏,以免用户察觉。
- 触发表单提交:
- 可以使用JavaScript在页面加载时自动提交表单,或者通过点击一个链接或按钮触发提交。
3. 诱骗用户访问
- 制作钓鱼页面:
- 设计一个看起来和目标网站很相似的页面。
- 将构造好的攻击表单嵌入到钓鱼页面中。
- 传播攻击页面:
- 通过电子邮件、社交媒体等方式将钓鱼页面发送给目标用户。
4. 绕过防御措施
- 绕过token验证:
- 如果目标网站使用了token机制,需要想办法获取到正确的token值,并将其添加到表单中。
- 绕过referer验证:
- 如果目标网站使用了referer验证,可以尝试修改referer的值,或者使用一些技巧绕过验证。
四、token类CSRF利用方法
1. 窃取token:
- XSS攻击: 攻击者通过XSS漏洞获取用户的cookie或token,然后将其嵌入到恶意页面中,从而伪造用户请求。
- 弱加密: 如果token的加密算法不够强,攻击者可能通过暴力破解或其他手段获取token。
- 会话固定攻击: 攻击者通过各种手段强制用户使用特定的session ID,然后在该session ID下伪造请求。
2. 预测token:
- 可预测的token生成算法: 如果token生成算法存在漏洞,攻击者可能通过分析请求和响应,推测出token的生成规则,从而预测后续的token值。
- 弱随机数生成器: 如果使用的随机数生成器不够随机,攻击者可以通过穷举法或其他手段猜测出token值。
3. 重放攻击:
- 缓存token: 攻击者可以缓存截获的包含有效token的请求,并在稍后重放该请求。
- 服务器端状态不一致: 如果服务器端没有对重放攻击进行防护,攻击者可以多次重放同一个请求。
五、SSRF常用伪协议
1. file://
- 功能: 访问本地文件系统。
- 利用场景: 读取服务器上的敏感文件,如配置文件、数据库备份等。
- 示例:
http://target/ssrf?url=file:///etc/passwd
2. http:// 和 https://
- 功能: 发起HTTP或HTTPS请求。
- 利用场景: 访问内网的Web服务,获取敏感信息;进行端口扫描;发起内网攻击。
- 示例:
http://target/ssrf?url=http://192.168.1.100
3. gopher://
- 功能: 访问Gopher协议服务。
- 利用场景: 由于Gopher协议的灵活性,可以模拟各种协议请求,如FTP、Telnet、SMTP等。
- 示例:
http://target/ssrf?url=gopher://192.168.1.100/ping%20192.168.1.1
4. dict://
- 功能: 查询字典服务。
- 利用场景: 攻击者可以利用字典服务进行端口扫描、服务探测等。
- 示例:
http://target/ssrf?url=dict://192.168.1.100
5. ftp://
- 功能: 访问FTP服务器。
- 利用场景: 上传或下载文件,获取服务器上的敏感信息。
- 示例:
http://target/ssrf?url=ftp://user:password@192.168.1.100/file.txt
6. 其他协议
- ldap://:访问LDAP服务。
- sftp://:访问SFTP服务。
- tftp://:访问TFTP服务。
六、SSRF pikachu靶场通关
1. SSRF(curl)
只有一个链接
打开是一首诗
改为百度地址
使用file伪协议访问本地文件
2. SSRF(file_get_content)
点击链接
file协议读取本地文件
七、SSRF靶场通关时根据源代码说明漏洞成因
1. curl源码分析
可以看出服务端没有将传入的url进行校验,而是直接使用传入的url值,使用curl_exec()函数通过PHP对数据进行获取,并且输出返回,明显存在服务端请求伪造,没有对前端的URL进行白名单的过滤
漏洞成因:服务端对用户输入的URL缺乏有效过滤和验证,就可能允许恶意URL或IP地址的输入。
2. file_get_content源码分析
使用PHP函数file_get_content()读取文件且未进行白名单过滤
漏洞成因:服务端未对URL进行严格的过滤和验证,也未对响应结果进行有效处理【函数file_get_content()不仅可以读取本地文件系统的文件,还可以通过读取远程文件的内容】