目录
一、CSRF和XSS区别
1.原理不同
CSRF:利用网站A本身的漏洞,通过伪造请求,冒充用户在站内的正常操作。攻击者通常通过一些技术手段欺骗用户的浏览器去访问一个用户以前认证过的站点并运行一些操作(如转账、发送消息等)。由于浏览器之前已经认证过,被访问的站点会认为这是真正的用户操作而去执行。
XSS:恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面时,嵌入其中的Script代码会被执行,从而达到攻击用户或服务器的目的。XSS主要基于JavaScript(或其他脚本语言)来完成恶意的攻击行为。
2.目标不同
CSRF:目标是用户,攻击者通过伪造用户的正常操作,以用户的名义发送恶意请求,对服务器来说这个请求是完全合法的,但却完成了攻击者所期望的操作(如转账、发送邮件等)。
XSS:目标主要是服务器,通过执行恶意脚本代码,攻击者可以窃取用户信息、劫持会话、进行网络钓鱼、放马挖矿、广告刷流量等,也可以劫持后台、篡改页面等。
3.实现方式不同
CSRF:需要用户先登录目标网站获取cookie,然后攻击者通过一些技术手段(如链接欺骗、隐藏iframe等)欺骗用户的浏览器发起请求。这些请求在用户不知情的情况下携带了用户的cookie信息,从而以用户的身份执行操作。
XSS:攻击者直接向目标网站注入JS代码,这些代码被存储在服务器上或作为请求的一部分发送给服务器,当其他用户访问该页面时,嵌入的JS代码会被执行。XSS攻击可以分为反射型、存储型和DOM型三种。
二、CSRF攻击步骤
1. 用户登录受信任网站
用户首先登录了一个受信任的网站A,如网上银行或社交媒体平台。在登录过程中,用户的身份被验证,并且网站A在用户的浏览器中设置了一个包含会话信息的Cookie。
2. Cookie存储在浏览器中
登录成功后,用户的浏览器会存储网站A的Cookie。这些Cookie通常包含了用户的会话标识符(Session ID)或其他认证信息,用于后续请求的身份验证。
3. 用户访问恶意网站
在用户不知情的情况下,他们访问了一个恶意的网站B。这个网站可能是通过电子邮件、社交媒体链接或其他方式诱导用户访问的。
4. 恶意网站构造伪造请求
恶意网站B利用HTML、JavaScript或其他技术手段,构造了一个针对受信任网站A的伪造HTTP请求。这个请求可能是一个隐藏的表单提交、一个AJAX请求或任何其他类型的HTTP请求。
5. 浏览器自动携带Cookie发送请求
当恶意网站B的JavaScript代码执行时,它会触发浏览器向受信任网站A发送伪造的HTTP请求。由于浏览器在发送请求时会自动携带与请求域相匹配的Cookie,因此这个伪造请求会包含用户之前登录网站A时设置的Cookie。
6. 网站A验证请求并执行操作
受信任网站A接收到伪造请求后,会验证请求中的Cookie以确认用户的身份。由于Cookie是有效的,网站A会误以为这是用户本人发出的请求,并执行请求中的操作,如转账、修改密码、发布信息等。
7. 攻击成功
一旦网站A执行了伪造请求中的操作,攻击者就成功实现了CSRF攻击。用户可能在没有意识到的情况下遭受了损失或隐私泄露。
三、CSRF手工构造POST型页面方法
手工构造一个用于CSRF攻击的POST型HTML页面,主要涉及到创建一个包含表单(<form>
)的HTML文档,该表单的action
属性设置为目标网站(即受攻击网站)的URL,而表单的method
属性设置为POST
。还需要在表单中添加一些隐藏的输入字段(<input type="hidden">
),这些字段将包含攻击者希望发送到目标网站的数据。
示例:
<!DOCTYPE html>
<html>
<head>
<title>CSRF Attack Example</title>
</head>
<body>
<h1>CSRF Attack Page</h1>
<!-- 构造一个POST请求到目标网站的转账接口 -->
<form action="https://examplebank.com/transfer" method="POST" style="display:none;">
<!-- 假设转账接口需要以下字段:账户ID、转账金额、目标账户 -->
<input type="hidden" name="account_id" value="123456789"> <!-- 攻击者的账户ID -->
<input type="hidden" name="amount" value="10000"> <!-- 转账金额 -->
<input type="hidden" name="target_account" value="987654321"> <!-- 目标账户ID,可能是受害者的 -->
<!-- 提交按钮,虽然这里设置为不可见,但可以通过JavaScript自动提交 -->
<input type="submit" value="Submit" style="display:none;">
<!-- 使用JavaScript自动提交表单 -->
<script>
document.forms[0].submit(); // 提交表单
</script>
</form>
</body>
</html>
表单和提交按钮都被设置为display:none;
,这样用户就看不到它们。然而,表单仍然会被浏览器处理并提交。
通过JavaScript的document.forms[0].submit();
代码,表单会在页面加载时自动提交,而无需用户交互。
四、token类CSRF利用方法
1.XSS(跨站脚本)攻击:
攻击者可以利用XSS漏洞在受害者的浏览器中注入恶意脚本。这些脚本可以读取或修改Token(如果Token存储在DOM中),或者在用户不知情的情况下提交包含有效Token的请求。
2.Token泄露:
如果Token被泄露到日志、网络传输或第三方服务中,攻击者可能会利用这些泄露的Token来构造CSRF攻击。
3.Token预测:
对于某些简单的Token生成算法,攻击者可能能够通过预测算法来生成有效的Token。
4.绕过Token验证逻辑:
如果服务器端的Token验证逻辑存在漏洞,如验证不严格或存在绕过逻辑的路径,攻击者可能会绕过Token验证。
5.浏览器插件或扩展:
恶意的浏览器插件或扩展可以读取和修改HTTP请求,包括Token。
6.CSRF Token复用:
在某些情况下,如果用户在不同的请求中使用了相同的Token(尽管这通常不是设计上的预期),攻击者可能会捕获并重用该Token。
五、SSRF常用伪协议
1.file://:
用途:用于从文件系统中获取文件内容。
示例:file:///etc/passwd
可以读取Linux系统中的用户密码文件;file:///proc/net/arp
可以显示ARP缓存表,帮助发现内网中的其他主机。
说明:这是SSRF攻击中最简单也是最直接的利用方式之一,通过读取敏感文件来获取系统信息或用户数据。
2.dict://:
用途:字典服务协议,用于访问字典资源。
示例:dict://ip:6739/info:
可以访问字典服务器上的信息。
说明:虽然dict协议主要用于查询词典或字典内容,但在SSRF攻击中,它也可以被用来进行端口扫描等操作。
3.ftp:// 和 sftp://:
用途:FTP(File Transfer Protocol,文件传输协议)和SFTP(SSH File Transfer Protocol,SSH文件传输协议)用于文件传输。
说明:在SSRF攻击中,这些协议可以用于尝试访问内部网络上的FTP或SFTP服务器,进而获取或修改文件。然而,由于FTP和SFTP通常需要认证,因此直接利用的难度较大。
4.ldap://:
用途:轻量级目录访问协议(Lightweight Directory Access Protocol),用于访问和维护分布式目录信息服务。
说明:在SSRF攻击中,ldap协议可以被用来尝试访问内部网络上的LDAP服务器,获取敏感信息如用户列表、组织结构等。
5.tftp://:
用途:简单文件传输协议(Trivial File Transfer Protocol),用于在不登录到远程计算机的情况下进行文件传输。
说明:虽然tftp协议的安全性较低,但在SSRF攻击中,它也可以被用来尝试访问内部网络上的TFTP服务器,下载或上传文件。
6.gopher://:
用途:分布式文档传递服务协议,早期互联网上的一种文档检索协议。
说明:gopher协议在SSRF攻击中非常强大,因为它可以用来构造复杂的HTTP请求,包括POST请求和包含特殊字符的请求。这使得gopher协议成为攻击者绕过防火墙和防护机制的有力工具。
7.http:// 和 https://:
用途:超文本传输协议(HyperText Transfer Protocol)和安全超文本传输协议(HyperText Transfer Protocol Secure),用于在Web上传输数据。
说明:虽然HTTP和HTTPS协议本身是安全的,但在SSRF攻击中,攻击者会利用服务器对URL的解析漏洞,构造恶意的HTTP或HTTPS请求来访问内部网络资源或执行其他恶意操作。
六、SSRF pikachu靶场通关
1.第一关 SSRF(curl)
curl是一个非常实用的、用来与服务器之间传输数据的工具;支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl设计为无用户交互下完成工作
出现一个url地址
http协议通过网址访问链接
修改URL为:url=http://www.baidu.com 访问百度页面
file协议读取本地主机文件
修改URL为:url=file:///D:\software\PHP\PHPstudy\phpstudy\phpstudy_pro\WWW\pikachu-master\vul\ssrf\ssrf.txt
2.第二关 SSRF(file_get_content)
file_get_contents() 把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法,如果服务器操作系统支持,还会使用内存映射技术来增强性能。
出现一个file地址
file协议读取本地主机文件
修改file为:file=file:///D:\software\PHP\PHPstudy\phpstudy\phpstudy_pro\WWW\pikachu-master\vul\ssrf\ssrf.txt,查看文件内容
七、SSRF靶场通关时根据源代码说明漏洞成因
1.ssrf_curl.php
无过滤机制
2.ssrf_fgc.php
无过滤机制