目录
csrf token tracker——BurpSuite工具
1.总结CSRF和XSS区别
2.总结CSRF攻击步骤
3.总结CSRF手工构造POST型页面方法
4.说明token类CSRF利用方法
5.SSRF常用伪协议
6.SSRF pikachu靶场通关
7.SSRF靶场通关时根据源代码说明漏洞成因
一.CSRF和XSS的区别
CSRF(跨站请求伪造)是一种网络攻击方式,它允许攻击者诱导受害者在不知情的情况下,以受害者的身份向受信任的网站发送恶意请求
XSS(跨站脚本攻击)是一种代码注入攻击,它允许攻击者在受害者的浏览器中执行恶意脚本
特性 | CSRF(跨站请求伪造) | XSS(跨站脚本攻击) |
定义 | 攻击者诱导受害者在不知情的情况下,以受害者的身份向受信任的网站发送恶意请求 | 攻击者向网站注入恶意脚本代码,这些脚本在用户的浏览器中执行,以达到恶意目的 |
攻击方式 | 利用网站对用户身份验证的依赖,通过伪造请求来冒充用户进行操作 | 利用网站对用户输入处理不当的漏洞,注入并执行恶意脚本 |
攻击目标 | 执行用户未授权的请求,如转账、更改密码等 | 窃取用户的敏感信息、执行恶意操作或进行钓鱼攻击 |
利用漏洞 | 网站对身份验证的依赖以及浏览器自动发送认证信息的机制 | 网站对用户输入数据的处理不当,没有充分过滤或转义 |
防御措施 | 1. 使用CSRF令牌 | 1. 对用户输入进行严格的过滤和转义 |
影响范围 | 主要影响用户的账户安全和隐私,可能导致财产损失 | 不仅影响用户账户安全,还可能影响整个网站的安全性和稳定性,如执行恶意代码、传播蠕虫等 |
攻击手段 | 诱导用户点击恶意链接或访问恶意网站,自动发送伪造请求 | 注入恶意脚本到网站页面,当其他用户访问时执行 |
隐蔽性 | 较高,用户往往不易察觉 | 取决于攻击者的技巧和网站的安全措施,有时也具有较高的隐蔽性 |
二.CSRF攻击步骤
- 用户登录受信任网站A
用户C打开浏览器,访问受信任的网站A,并输入用户名和密码请求登录。
网站A验证用户信息后,生成Cookie信息并返回给浏览器。此时用户成功登录网站A,并可以正常发送请求到网站A。 - 用户访问恶意网站
在用户未退出网站A之前,在同一浏览器中,用户打开一个新的标签页或窗口访问恶意网站B。
网站B可能是一个攻击者构建的网站,用于诱导用户进行某些操作或浏览特定内容。 - 恶意网站发送请求
网站B接收到用户请求后,返回一些攻击性代码(如HTML、JavaScript等)。
这些攻击性代码会构造一个请求,要求浏览器访问第三方站点A(即用户之前登录的受信任网站)。 - 用户浏览器携带Cookie发送请求
浏览器在接收到这些攻击性代码后,会根据网站B的请求,在用户不知情的情况下携带之前从网站A获取的Cookie信息,向网站A发出请求。
由于浏览器之前已经认证过网站A,因此网站A会接受这个请求,并认为它是来自用户的合法请求。 - 网站A处理请求
网站A根据用户C的Cookie信息以C的权限处理该请求,执行恶意代码所指定的操作(如转账、发送消息、修改账户信息等)。
这些操作对服务器来说是合法的,因为它们看起来像是用户自己发起的请求,但实际上是由攻击者通过恶意网站B控制的。 - 攻击成功
一旦网站A执行了恶意代码所指定的操作,攻击者就达到了他们的目的,如窃取用户信息、转移资金等。
三.CSRF手工构造POST型页面
- 确定目标URL和POST参数
首先,需要确定CSRF攻击的目标URL以及该URL在POST请求中期望接收的参数。这通常可以通过分析受攻击网站的HTML表单、使用网络抓包工具(如Burp Suite)拦截并分析正常用户的POST请求来完成。 - 创建HTML表单
使用HTML和JavaScript创建一个表单,该表单的action属性设置为目标URL,method属性设置为POST。在表单内部,为每个需要提交的POST参数创建一个<input>标签,并设置其name属性为目标参数名,value属性为攻击者希望提交的值,或者在某些情况下,使用JavaScript动态设置这些值。
例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>菜鸟驿站</title>
</head>
<body>
<form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="post">
<input type="hidden" name="sex" value="1">
<input type="hidden" name="phonenum" value="1">
<input type="hidden" name="add" value="1">
<input type="hidden" name="email" value="1">
<input type="hidden" name="submit" value="submit">
<input type="submit" value="查看取件码">
</form>
</body>
</html>
- 诱导用户访问该页面
攻击者需要将这个包含恶意表单的HTML页面以某种方式诱导用户访问。这可以通过发送电子邮件、在社交媒体上分享链接、或者利用其他网站上的漏洞(如XSS漏洞)来嵌入这个页面。 - 用户浏览器提交表单
当用户访问这个恶意页面时,由于表单是隐藏的并且包含JavaScript代码来自动提交表单,用户的浏览器会在用户不知情的情况下向目标URL发送POST请求,并包含攻击者预先设定的参数值。 - 攻击成功
如果目标网站没有适当的CSRF防护措施(如CSRF Token验证),那么它将接受这个请求,并认为它是来自用户的合法请求,从而执行相应的操作(如更改用户密码、转账等)。
四.token类CSRF利用
csrf token tracker——BurpSuite工具
csrf token tracker可以自动获取csrf的token,对于一些有csrf限制的请求,它可以绕过该限制,如暴力破解具有csrf token的登录请求,在渗透测试过程中CSRF Token的自动更新,以pikachu靶场的token型csrf为例
1.burpsuite 安装并启用 csrf token tracker
2.抓包放到重放器,开启跟随重定向
3.赋值当前token,配置csrf token tracker
4.更改参数,重放,即可修改信息
5.查看CSRF Token Tracker自动识别到的Token值,之后每次提交的重放都会自动识别并填充token值来实现绕过的目的
潜在的弱点与利用方法
- Token泄露
如果Token被存储在客户端的某个位置(如localStorage),并且该位置可以被跨站脚本(XSS)攻击所访问,那么攻击者可能会窃取Token。一旦Token被窃取,攻击者就可以构造包含该Token的恶意请求来执行CSRF攻击。
防御措施:确保Token不存储在容易受到XSS攻击的位置,如localStorage。可以考虑使用HttpOnly的Cookie来存储Token,这样JavaScript就无法访问它。 - Token预测或重用
如果Token的生成算法不够复杂,或者Token被重复使用(例如,在多个请求中使用相同的Token),那么攻击者可能会尝试预测或重用Token。
防御措施:使用足够复杂的算法来生成Token,并确保每个请求都使用唯一的Token。 - Token验证逻辑漏洞
如果服务器端的Token验证逻辑存在漏洞(例如,没有正确验证Token的来源或有效性),那么攻击者可能会构造绕过验证的恶意请求。
防御措施:确保服务器端的Token验证逻辑是健壮的,并且对所有请求都进行严格的验证。
总结:Token机制是防御CSRF攻击的有效手段之一,但并非万无一失。为了确保网站的安全性,除了使用Token机制外,还需要结合其他安全措施(如HTTPS、XSS防御等)来构建全面的安全防御体系。同时需要密切关注Token机制的实现细节和潜在弱点,并采取相应的防御措施来降低被攻击的风险。
五.SSRF常用伪协议
伪协议是一种特殊的URL格式或语法,用于访问不同的资源或执行特定的操作。这些伪协议通常不直接对应网络上的实际协议,而是提供了一种便捷的方式来处理各种输入输出操作,如读取文件、处理数据流等,而不必依赖于实际的文件或网络资源路径。
常用伪协议
file://
从文件系统中获取文件内容
file:///etc/passwd
读取文件passwd【这个文件用于存储系统的用户信息,包括用户的用户名,用户ID,组ID(GID),用户的根目录,默认的shell等信息】file:///etc/hosts
显示当前操作系统网卡的IP【这个文件存储着映射关系,这些映射关系可能是将主机名映射到内部IP地址用于访问内网,也可能是映射到公网IP来访问公网。简单来说,可以利用它看到当前主机的IP地址】file:///proc/net/arp
显示arp缓存表(寻找内网其他主机)【在能够从局域网中其中一台主机向其余主机发送信息的前提下,通过爆破的方法向其余主机发起连接请求,这样就可以再通过查看/proc/net/arp来查看局域网中还有哪些其它主机】file:///proc/net/fib _trie
显示当前网段路由信息
dict://
字典服务协议,访问字典资源
dict 协议最初是为 UNIX 和类 UNIX 系统设计的,用于从远程服务器上查询词典或字典内容。在互联网上存在一些公共的 dict 服务器,允许用户通过 dict 协议查询广泛的词典资源。
dict://ip.端口号//info
可以进一步探查ip的某个端口是否开着。
一句话:dict伪协议最主要是查找内网主机开放端口
ftp://
可用于网络端口扫描,效率相对较低
使用ftp://同样利用burpsuite对内网依次扫描
查找内网主机开放端口
sftp://
SSH文件传输协议或安全文件传输协议
tftp://
简单文件传输协议
http://
http://ip(:端口)/文件名
用于在获取了存活IP和端口之后进一步扫描其下的文件目录
作用:常规URL形式,允许通过HTTP 1.0的GET方法,以只读访问文件或资源。
ldap://
轻量级目录访问协议
gopher://
分布式文档传输协议
gopher 协议是早期互联网上的一种文档检索协议,与 HTTP 类似,但它更加简单和结构化
基本格式:gopher://<目标IP>:<端口>/<gopher-path>
表格总结
常用伪协议 | 描述 | 在SSRF漏洞利用中的作用 |
file:// | 用于访问本地计算机中的文件 | 读取敏感文件:攻击者可以构造包含file协议的URL,通过服务器读取本地敏感文件,如 (Linux系统上的用户账户信息文件)或 (Windows系统上的配置文件)等。 |
dict:// | 用于查询字典服务 | 探测内网主机和端口:通过构造包含dict协议的URL,攻击者可以探测内网主机的开放端口和获取服务的指纹信息,甚至在某些情况下执行命令(如Redis未设密码时)。 |
ftp:// | 文件传输协议(File Transfer Protocol),用于文件上传和下载 | 文件传输和利用:尽管ftp协议本身在SSRF中的直接利用较为有限,但攻击者可能通过ftp协议在特定条件下(如存在CRLF注入)进行文件传输或执行其他攻击。 |
sftp:// | SSH文件传输协议(SSH File Transfer Protocol),安全文件传输协议 | 安全文件传输:sftp是ftp的安全版本,通过SSH加密通信。在SSRF中,其利用方式与ftp类似,但更加安全,攻击者可能尝试利用sftp进行文件传输,但难度较高。 |
tftp:// | 简单文件传输协议(Trivial File Transfer Protocol),基于lockstep机制的文件传输协议 | 文件获取和上传:攻击者可能通过tftp协议从远程主机获取文件或将文件上传至远程主机,这在SSRF攻击中可能用于数据泄露或恶意文件上传。 |
http:// | 超文本传输协议(HyperText Transfer Protocol),用于互联网上的数据传输 | 访问内网资源:通过构造包含http协议的URL,攻击者可以访问内网资源,获取敏感信息或进行其他形式的攻击。 |
ldap:// | 轻量级目录访问协议(Lightweight Directory Access Protocol),用于访问和管理分布式目录信息服务 | LDAP注入:在SSRF中,ldap协议可能被用于LDAP注入攻击,攻击者可以将LDAP请求重定向到恶意LDAP服务器,导致信息泄露、远程代码执行等安全问题。 |
gopher:// | 分布式文档传递服务,允许用户无缝地浏览、搜索和检索信息 | 利用服务端作为代理:gopher协议在SSRF中可用于构造复杂的请求,利用服务端作为代理访问远程资源或执行命令。然而,由于gopher协议的使用条件较为苛刻,其实际利用难度较高。 |
六.pikachu_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设计为无用户交互下完成工作
1.发现网址
2.改为百度的网址,发现可访问页面
3.本地新建文件,使用file伪协议访问该文件
file_get_content
file_get_contents() 把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法,如果服务器操作系统支持,还会使用内存映射技术来增强性能。
语法:file_get_contents(path,include_path,context,start,max_length)
参数描述
- path 必需。规定要读取的文件。
- include_path 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。
- context 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
- start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。
- max_length 可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。
1.发现file地址
2.file协议读取本地文件
七.SSRF靶场通关时根据源代码说明漏洞成因
curl靶场-源码分析
源码
可以看出服务端没有将传入的url进行校验,而是直接使用传入的url值,使用curl_exec()函数通过PHP对数据进行获取,并且输出返回,明显存在服务端请求伪造,没有对前端的URL进行白名单的过滤
漏洞成因:服务端对用户输入的URL缺乏有效过滤和验证,就可能允许恶意URL或IP地址的输入。
file_get_content靶场-源码分析
源码
使用PHP函数file_get_content()读取文件且未进行白名单过滤
漏洞成因:服务端未对URL进行严格的过滤和验证,也未对响应结果进行有效处理【函数file_get_content()不仅可以读取本地文件系统的文件,还可以通过读取远程文件的内容】