目录
一、总结CSRF和XSS区别
在原理、攻击方式、目标及防御策略上存在显著差异。
1. 原理不同
CSRF:CSRF利用网站对用户身份验证的信任,通过伪造用户请求来攻击网站。攻击者构造一个与受信任网站相同的请求,诱导用户在已登录状态下访问该请求,从而达到冒充用户进行非法操作的目的。CSRF攻击主要依赖用户的Cookie或Session等身份验证信息。
XSS:XSS则是通过向Web页面注入恶意的Script代码,当用户浏览该页面时,嵌入的Script代码会被执行,从而达到攻击用户或服务器的目的。XSS攻击主要基于JavaScript等脚本语言,利用Web页面对用户输入的不严格过滤来实现。
2. 攻击方式不同
CSRF:CSRF攻击通常不需要用户进行任何操作,只需用户处于已登录状态,并诱导用户访问攻击者构造的恶意链接或表单。攻击者可以利用图片标签(如`<img>`)、隐藏的表单(如`<form>`)等方式触发GET或POST请求。
XSS:XSS攻击则需要攻击者将恶意代码注入到Web页面中,通常是通过用户输入(如评论、留言板等)或服务器端的漏洞(如未对输入进行过滤)来实现。用户在浏览被注入恶意代码的页面时,浏览器会执行这些恶意代码。
3. 目标不同
CSRF:CSRF的目标主要是冒充用户在网站上的正常操作,如转账、修改密码等,从而窃取用户的数据或进行非法操作。CSRF攻击的目标主要是用户,利用用户的身份进行恶意操作。
XSS:XSS的目标则更加广泛,既可以攻击用户(如窃取用户的Cookie、Session等信息),也可以攻击服务器(如执行恶意代码、篡改网页内容等)。XSS攻击的目标主要是服务器和用户的浏览器。
4. 防御策略不同
CSRF:为了防御CSRF攻击,可以采取以下措施:
(1) 验证HTTP请求的来源地址(Referer)和表单提交地址(如通过Token验证)。
(2) 使用POST请求代替GET请求进行敏感操作。
(3)设置Cookie的HttpOnly属性,防止JavaScript读取Cookie。
(4)使用验证码或二次确认机制。
XS:为了防御XSS攻击,可以采取以下措施:
(1) 对用户输入进行严格过滤,避免恶意代码注入。
(2)使用HTTP头指定内容的类型,避免输出内容被作为HTML解析。
(3)对输出内容进行编码(如HTML实体编码),防止浏览器执行恶意代码。
(4)使用内容安全策略(CSP)限制外部资源的加载和执行。
二、总结CSRF攻击步骤
CSRF攻击常常利用用户已登录状态,诱导用户在不知情的情况下执行非预期操作。步骤如下:
1. 用户登录受信任网站
用户C使用浏览器打开并登录受信任的网站A(如银行网站、电子邮件服务等),输入用户名和密码。
网站A验证用户信息后,生成Cookie信息并返回给用户的浏览器,以标识用户的登录状态。
2. 浏览器保存Cookie
用户的浏览器保存了网站A的Cookie,这些Cookie包含了用户的认证信息,允许用户在后续的请求中保持登录状态。
3. 访问恶意网站
在用户未退出网站A的情况下,用户在同一浏览器中打开一个新的标签页或窗口,访问恶意网站B(由攻击者控制)。
4. 恶意网站发送请求
恶意网站B在用户不知情的情况下,向用户的浏览器发送攻击性代码或构造一个请求,该请求指向受信任的网站A。
这些攻击性代码或请求可能通过嵌入在网页中的图片、脚本、表单提交等方式实现。
5. 浏览器携带Cookie发起请求
用户的浏览器在接收到恶意网站B的请求后,会携带网站A的Cookie信息(因为浏览器之前已经认证过网站A),向网站A发出请求。
6. 网站A处理请求
网站A收到请求后,由于请求中包含了有效的Cookie信息,因此会误认为是用户C发起的合法请求,并按照请求执行相应的操作(如转账、修改密码、发送邮件等)。
7. 攻击成功
攻击者通过诱导用户访问恶意网站B,并利用用户在网站A的登录状态,成功执行了非预期的操作,从而达到攻击目的。
三、总结CSRF手工构造POST型页面方法
通过构建一个看似无害的页面(通常是钓鱼页面),诱导用户在其已登录的状态下提交表单。
1. 分析目标网站的POST请求
首先,使用浏览器的开发者工具(如Chrome的DevTools)来观察和分析目标网站在执行敏感操作时(如转账、修改密码等)所发送的POST请求。
注意请求的URL、HTTP方法(应为POST)、请求头(如Content-Type)以及请求体中的参数和值。
2. 创建钓鱼页面
在钓鱼页面中,创建一个`<form>`元素,并将其`action`属性设置为目标网站的POST请求URL。
将表单的`method`属性设置为`POST`,以匹配目标网站的请求方式。
根据目标POST请求的请求体,在表单中添加相应的`<input>`字段,并设置其`name`和`value`属性以匹配请求体中的参数和值。
为了避免用户察觉,可以将表单设置为隐藏(通过CSS的`display:none;`)或使用`<iframe>`等方式隐藏表单的提交过程。
3. 自动提交表单
在钓鱼页面的`<script>`标签中编写JavaScript代码,以在用户加载页面时自动提交表单。这可以通过调用表单的`submit()`方法来实现。
确保钓鱼页面在加载时立即执行表单提交操作,不给用户留下查看或修改表单内容的机会。
4. 诱骗用户访问
创建一个看似无害的链接或消息,诱导用户点击或访问钓鱼页面。诱饵的内容可以根据目标用户的兴趣和习惯进行设计。
通过电子邮件、社交媒体、即时通讯工具等渠道将诱饵分发给目标用户。
5. 监控和评估
在目标网站上设置日志记录机制,以跟踪和记录来自钓鱼页面的POST请求。
分析日志记录,评估钓鱼页面的成功率和攻击效果。根据评估结果调整钓鱼页面的设计和分发策略。
四、说明token类CSRF利用方法
1.Token泄露:
如果Token在客户端的某个地方以明文形式存储(例如,在HTML源代码、JavaScript变量或URL参数中),并且这个存储位置可以被第三方访问(例如,通过XSS攻击),那么攻击者就可以窃取Token。
2.预测Token:
如果Token的生成算法不够复杂,或者存在某种可预测的模式(如基于时间戳、用户ID的简单哈希),攻击者可能通过猜测或暴力破解的方式获得有效的Token。
3.Token重用:
在某些情况下,如果Token在多个请求之间被重复使用(特别是那些不需要频繁更改用户状态的请求),攻击者可能通过捕获一个有效的Token并在其过期前重用它来执行CSRF攻击。
4.绕过Token验证:
如果应用程序的某些部分没有正确实施Token验证,或者存在逻辑错误允许绕过Token验证,攻击者就可以利用这些漏洞执行CSRF攻击。
5.会话固定攻击:
此攻击则间接地帮助攻击者绕过Token机制。攻击者预先设置一个有效的会话ID(或Token),并诱使受害者使用该会话ID登录。一旦登录,攻击者就可以使用该会话ID(或Token)来执行恶意操作。
五、SSRF常用伪协议
1.file://
主要用于任意文件读取,从文件系统中获取文件内容。
格式:file://[文件路径]。
示例:file:///etc/passwd用于读取系统密码文件,file:///proc/net/arp用于显示ARP缓存表,从而寻找内网其他主机。
2.dict://
字典服务协议,用于访问字典资源。可用于扫描内网主机的开放端口、获取内网信息、爆破密码等用处。
示例:dict://ip:6739/info,其中ip是字典服务器的IP地址,6739是默认的字典服务端口。
3.ftp://
文件传输协议,用于网络文件的上传和下载。虽然ftp协议主要用于文件传输,但在SSRF攻击中,它也可以被用来进行网络端口扫描。不过,ftp扫描的效率较低,描结果可能不准确。
4.gopher://
早期互联网上的一种文档检索协议,与HTTP类似但更为简单和结构化。
gopher协议在SSRF攻击中的应用非常广泛,它可以用来构造GET和POST请求,攻击内网中的Redis、FastCGI、SQL等服务。此外,由于gopher协议可以发送换行的数据,因此它还可以用来攻击那些需要交互的应用。
5.http:// 和 https://
超文本传输协议及其安全版本,用于在Web上传输数据。
在SSRF攻击中,http和https协议主要用于向目标服务器发送HTTP请求,以探测内网中那些可以通过HTTP请求进行攻击的应用。由于GET请求的参数直接加在URL中,因此可以使用http协议来探测内网中的GET请求漏洞。
6.Ldap://
轻量级目录访问协议,用于访问和维护分布式目录信息。
在SSRF攻击中,ldap协议可以被用来访问内网中的LDAP服务,从而获取敏感信息或执行未授权操作。
7.tftp://
简单文件传输协议,用于在局域网中传输小文件。
虽然tftp协议在SSRF攻击中的应用相对较少,但理论上它也可以被用来进行文件传输等操作。
六、SSRF pikachu靶场通关
第一关:SSRF(url)
(1).点击蓝色链接进入,可以观察到url后面跟的网址,疑是直接跳转网站
(2)尝试在url后面改为百度的网址,然后直接跳转,说明没有对其URL进行限制,所以我们可以直接修改该网站的url,实现URL跳转,那么现在就可以尝试在这里进行手动的端口扫描:可以利用dict协议访问ip的某端口来确定该端口是否开启
比如说可以探测3306,返回了数据,说明3306端口是开启的:
再探测3278无返回数据,则说明端口关闭
第二关:SSRF(file_get_content)
- 这次进入之后,发现是file=,说明从一个url中读取了一个php文件
2.这里可以利用file伪协议的方法制造恶意的payload去获取本地配置的信息:
file=file:///c:/windows/win.ini
3.也可以利用file伪协议的方法制造恶意的payload去获取本地文件
file=php://filter/read=convert.base64-encode/resource=../../../phpinfo.php
解码base64可得:
这时与phpinfo.php验证:
七、SSRF靶场通关时根据源代码说明漏洞成因
在Pikachu靶场源代码中,举例的漏洞地址如下:
B:\phpstudy_pro\WWW\pikachu-master\vul\ssrf\ssrf_fgc.php
在这段代码中,一是因为$_GET['url']直接用于file_get_contents()函数,没有对$url进行任何验证或过滤,攻击者可能会通过修改URL参数来构造恶意请求,从而触发SSRF漏洞;
二是缺乏对$filename的验证和过滤,特别是没有检查该文件名是否指向了服务器本地文件系统中的有效和安全的文件。
为了防止此漏洞,除了对$_GET['file']的值进行严格验证和过滤,确保它只包含预期内的、安全的值,也可以使用白名单来限制允许的文件名或路径。