一、CSRF
概述
CSRF(Cross-Site Request Forgery)攻击是一种利用用户已登录的身份,欺骗用户在未经其同意的情况下对某个站点发起请求的攻击方式。攻击者利用用户在其他站点中的登录状态,通过伪造请求,使用户在不知情的情况下执行了恶意操作。
攻击过程
1.用户在浏览器中登录了一个受信任的网站A,并且保持了登录状态,使得浏览器保存了该站点的身份认证信息(比如Cookie)。
2.用户在同一浏览器中访问了一个恶意网站B,该网站中包含了针对网站A的CSRF攻击代码。
3.恶意网站B中的代码会自动向网站A发送伪造的请求,比如修改用户信息、发起转账等操作。
4.浏览器默认会自动发送之前保存的网站A的身份认证信息(比如Cookie)给网站A,而用户在不知情的情况下执行了这些恶意操作。
5.攻击者成功利用了用户在网站A中的身份认证信息,完成了攻击目标。
防御方法
1.使用CSRF Token:在每个请求中添加一个随机生成的Token参数,并在服务器端进行验证。攻击者无法伪造该Token,因此可以有效地防止CSRF攻击。
2.检查Referer头:浏览器在发送请求时会自动添加Referer头,用于标识该请求是从哪个页面发起的。服务器可以检查Referer头,确定该请求是否来自合法的来源,从而防止CSRF攻击。
3.双重提交cookie:在用户登录时,在Cookie中添加一个随机生成的Token,并在每次提交请求时将该Token同时作为参数和Cookie一同提交。服务器端对比两者是否一致,即可确定该请求是否合法。
4.限制敏感操作:对于一些敏感操作(如修改密码、转账等),可以要求用户输入密码或进行其他身份验证方式,增加操作的安全性。
5.使用验证码:在一些关键操作上添加验证码,以确保请求的合法性。
手工构造POST型页面方法
1.分析目标网站:首先需要分析目标网站的请求方式,找到能够触发敏感操作的URL和必要的表单参数。
2.创建伪造页面:攻击者会创建一个网页,其中包含一个隐藏的表单,这个表单的字段与目标网站执行敏感操作时所需的字段相匹配。
3.设置触发操作:通过JavaScript或者其他方式,当用户访问了这个伪造页面时,自动填写表单并提交。这通常利用了用户的浏览器自动填充登录信息的特性。
4.发送请求:由于CSRF攻击依赖于用户的认证状态,所以这个隐藏的表单提交时,浏览器会附带用户已经认证的会话信息,这样请求看起来就像是用户本人发起的。
5.验证结果:攻击者需要检查攻击是否成功,这可能需要一些间接的方法来验证用户是否执行了预期的操作。
token类CSRF利用方法
1.用户认证:当用户登录系统时,服务器生成一个Token,这个Token通常包含用户信息、时间戳和一些随机数,并将其存储在服务器端。
2.Token传递:服务器将生成的Token以会话(Session)或者隐藏字段(如Cookie)的方式传递给用户客户端。
3.请求验证:在用户发起任何需要认证的请求时,客户端需要将Token随请求一起发送到服务器。
4.服务器验证:服务器接收到请求后,首先验证请求中携带的Token是否有效,包括检查Token是否过期、是否与服务器端存储的Token匹配等。
5.认证通过:如果Token验证通过,服务器则认为该请求是合法用户发起的,然后进行正常的数据处理和响应。
6.Token更新:为了提高安全性,服务器端还可以在每次请求后更新Token,使得即使攻击者获取了Token也无法用于后续的攻击。
与XSS的区别
1.CSRF攻击需要受害者先进行登录网站获取cookie ; XSS攻击不需要用户登录。
2.CSRF是攻击者利用受害者在已登录状态访问包含恶意请求的网站,从而对目标网站进行发起恶意请求 ; XSS是攻击者通过在受害者访问的网页中注入恶意脚本以实现攻击,当用户加载到这些页面时,脚本便开始执行,从而实施攻击。
3.CSRF进行防御时要确保请求是合法用户发起的 ; XSS进行防御时要对用户输入和输出进行严格检测,防止恶意脚本注入。
二、SSRF
定义
服务器端请求伪造(SSRF)指的是攻击者通过构造请求,利用服务器的功能作为代理来发送一个恶意请求至第三方服务器或内部资源。这种攻击允许攻击者绕过对源IP地址的检查,访问受限的内网资源,甚至从内部系统中窃取数据,执行远程代码,或对特定服务发起拒绝服务攻击(DoS)。
攻击原理
SSRF攻击的基本原理在于攻击者利用服务器作为代理来发送请求。
首先,攻击者寻找目标网站中可以从服务器发出外部请求的点,比如图片加载、文件下载、API请求等功能。
随后,攻击者通过向这些功能提交经过特别构造的数据(如修改URL或参数),诱使服务器向攻击者控制的或者内部资源发送请求。
此时,服务器充当了攻击者与目标之间的“桥梁”,攻击者可以通过它来接触和操作内部服务,绕过安全限制。
攻击步骤
1.发现:攻击者识别出可以触发服务器发起HTTP请求的点,如图像加载器、文件下载器或Web服务的API端点。
2.请求构造:攻击者创建一个精心设计的请求,这个请求将由服务器发送,目的可能是与服务器的内部网络或者外部恶意服务器通信。
3.执行与利用:攻击者将构造的请求发送到漏洞点。服务器不自觉地执行该请求,将结果返回给攻击者或影响内部系统。
SSRF常用伪协议
file:// 从文件系统中获取文件内容,如file:///etc/passwd
dict:// 字典服务协议,访问字典资源,如 dict:///ip:6739/info:
ftp:// 可用于网络端口扫描
sftp:// SSH文件传输协议或安全文件传输协议
ldap://轻量级目录访问协议
tftp:// 简单文件传输协议
gopher://分布式文档传递服务
三、SSRF pikachu靶场通关
SSRF(curl)
点击链接,出现一首诗
可以看到当前页面时从url变量中引入进来的,因此尝试修改后面的网址为百度,发现成功引入
利用dict协议访问ip的某端口来确定该端口是否开启,返回数据则表示端口开启
利用file协议访问文件
SSRF(file_get_connect)
点击链接,发现传递了file参数,使用了http协议
利用file协议访问文件
与上一关类似,不过变成了传文件
尝试访问百度
四、SSRF靶场通过根据源代码分析漏洞成因
curl
从源代码中可以看到服务端没有对传入的url进行过滤,直接使用了传入的url值
虽然后台使用curl_exec()函数进行了请求,但又将请求的结果返回给了前端,存在服务端请求伪造,没有对前端的URL进行白名单的过滤。
漏洞成因:没有对url参数修改做出过滤
file_get_connect
与curl类似,使用file_get_connect()函数读取文件但未进行白名单过滤
漏洞成因:没有对url参数修改做出过滤