环境:用kali搭建的pikachu靶场
一.CSRF
1.CSRF漏洞简介
跨站请求伪造(CSRF)漏洞是一种Web应用程序安全漏洞,攻击者通过伪装成受信任用户的请求来执行未经授权的操作。这可能导致用户在不知情的情况下执行某些敏感操作,如更改密码、发送消息等。要防止CSRF攻击,可以使用随机生成的令牌来验证每个请求的来源和合法性。
CSRF利用流程:攻击者发现CSRF漏洞-->构造代码-->发送给受害人-->受害人打开-->受害人执行代码-->完成攻击
CSRF利用条件
1.用到了cookie鉴权
2.被攻击方鉴权未过期
3.知道目标网站请求的详细信息
2.CSRF(Cross-Site Request Forgery)与XSS(Cross-Site Scripting)的不同
-
CSRF攻击利用用户已经登录的身份,在用户不知情的情况下发送恶意请求,执行未经授权的操作。攻击者利用受害者的身份在受害者不知情的情况下执行操作,比如更改密码或发送消息。而XSS攻击则是通过在网页中注入恶意脚本,当用户访问包含这些脚本的页面时,攻击者可以获取用户的信息、劫持会话或者执行其他恶意操作。
-
CSRF攻击是针对用户身份验证机制的漏洞,攻击者利用受害者已经登录的身份来执行操作;而XSS攻击是利用网站对用户输入的信任,将恶意脚本注入到网页中,从而获取用户信息或执行恶意操作。
3.例子
pikachu靶场
1.点击提示,登录vince用户
2.进入到这个页面
3.通过html伪造修改的请求
<form method="get" action="http://192.168.168.128/pik/vul/csrf/csrfget/csrf_get_edit.php">
<input type="text" name="sex" value="1234"></p>
<input class="phonenum" type="text" name="phonenum" value="123"></p>
<input class="add" type="text" name="add" value="123"></p>
<input class="email" type="text" name="email" value="1231"></p>
<input class="sub" type="submit" name="submit" value="submit">
</form>
4.用浏览器打开html文件
5.点击submit
发现页面跳转并修改用户的个人信息
注:如果点击修改个人信息后出现空白
说明PHP版本较高,需要修改一下文件
进入到/var/www/html/pik/vul/csrf/csrfget/目录,修改csrf_get_edit.php文件
删除第七十行MYSQL_ASSOC(因为PHP这个版本识别不了)
然后刷新就可以出来了
4.预防CSRF漏洞
-
同源验证(Same-Site Cookies):使用 SameSite 属性,可以限制浏览器只在请求源站点 (same-site) 发送 Cookie,从而减少 CSRF 的风险
-
CSRF Token:在每个表单中包含一个随机生成的 token,并且验证这个 token,确保请求是来源于合法的网站而不是恶意网站
-
验证 Referer 头:在服务端检查 HTTP 头中的 Referer 字段,确保请求来自合法的来源网站
-
双重提交 Cookie:将 CSRF Token 既以 Cookie 形式存储,也作为隐藏字段的形式加入到表单中,以确保提交请求时两者匹配
-
自定义请求头:要求所有的请求都携带自定义的请求头,服务端验证该请求头来确认请求的合法性
-
限制敏感操作:在网站上进行敏感操作时,要求用户再次输入密码或进行其他形式的二次确认
-
保持安全的开发实践:确保网站的代码安全,遵循最佳实践,包括输入验证、输出编码、使用安全的密码哈希算法等
二.SSRF漏洞
1.SSRF漏洞简介
SSRF(Server-Side Request Forgery)漏洞是一种安全漏洞,攻击者可以利用该漏洞向服务器发起伪造的请求。这些请求伪装成服务器本身发起的请求,因此可以绕过一些安全控制,访问本地系统资源、其他服务器资源,甚至内部网络
SSRF漏洞通常出现在允许用户提供URL并在服务端进行请求的场景中,比如Web应用中的URL解析、文件上传功能、图片处理等。攻击者可以利用这些功能,提供指向内部系统或受信任的外部系统的URL,并执行一系列恶意操作。
攻击者可以利用SSRF漏洞实施以下攻击:
-
访问内部系统信息:攻击者可以利用SSRF漏洞访问内部服务器的敏感信息,如配置文件、日志等。
-
攻击本地系统:攻击者可以利用SSRF漏洞将服务器定向到恶意URL,执行各种攻击,如端口扫描、攻击本地服务等。
-
攻击内部系统:通过SSRF漏洞,攻击者可以攻击内部系统,从而导致数据泄露、服务拒绝或其他安全风险。
为了防止SSRF漏洞,开发者可以采取以下措施:
-
限制请求的目标:仅允许访问受信任的URL,可以通过白名单或者正则表达式进行过滤。
-
使用安全代理:通过安全代理或反向代理,限制请求的目标并过滤恶意请求。
-
使用URL白名单:限制应用程序可以访问的URL范围,避免访问内部网络。
-
验证用户提供的URL:对用户提供的URL进行验证和安全性检查,确保其合法性。
2.CSRF(Cross-Site Request Forgery)和SSRF(Server-Side Request Forgery)有什么不同
-
CSRF (Cross-Site Request Forgery):
- CSRF 是一种利用用户当前已经认证的会话,在用户不知情的情况下执行非法操作的攻击方式。
- 攻击者通过欺骗受害者访问包含恶意代码的网页,使受害者在已认证的会话中执行未经授权的操作。
- 主要针对的是用户的浏览器和其在目标网站上的已验证会话,常见于对在线银行账户、社交媒体账户等进行未经授权的操作。
-
SSRF (Server-Side Request Forgery):
- SSRF 是一种攻击,攻击者能够利用目标服务器上的漏洞,以服务器的身份执行未经授权的网络请求。
- 攻击者通过向应用程序发送包含恶意 URL 的请求,利用服务器端的漏洞执行一些未经授权的操作,例如访问内部系统、执行端口扫描等。
- SSRF 的危害范围更广泛,可以直接影响到服务器上的资源和其他内部系统,而不是仅仅利用用户的会话。
CSRF 主要针对用户会话,而 SSRF 则主要利用服务器漏洞
3.例子
file协议
文件协议(file protocol),通常表示为 "file://",是用于访问本地或网络文件系统中文件和目录的 URL 方案。当浏览器或应用程序遇到以 "file://" 开头的 URL 时,它会理解需要访问的资源位于本地文件系统而不是互联网上。
例如,如果您有一个名为 "example.html" 的文件位于目录 "C:\Users\YourName" 中,您可以使用文件协议来访问它,像这样:
复制代码
file:///C:/Users/YourName/example.html
这将在您的默认 Web 浏览器中打开 "example.html" 文件。类似地,您可以使用文件协议来访问其他类型的文件,如图像、文本文档,甚至目录。然而,需要注意的是,使用文件协议可能会带来安全隐患,特别是当从不受信任的来源访问文件时,由于潜在的安全漏洞。
gopher协议
gopher协议是http出现之前,在internet上常见的且常用的协议
gopher协议可以做很多事情,特别是在SSRF中可以发挥很多重要的作用,利用此协议可以攻击内网的FTP,Telnet,Redis,Memcache,也可以进行GET,post请求
gopher://host:port/数据流
数据流第一个字符会被吞掉,所以第一个字符通常用_
换行符要用%0d%0a
?符号也要进行URL编码
nc -lvvp 888 #监听888端口
curl gopher://127.0.0.1:888/abc #使用gopher协议请求访问资源
发现监听到的第一个字符被吞掉需要再前面加一个_
dict协议
"dict 协议" 是一种用于在计算机网络上查询词典和参考资料的协议。它允许用户通过网络连接到远程词典服务器,并以特定的格式发送查询请求,然后接收并解析服务器返回的结果。dict 协议通常使用 TCP 或 UDP 连接,通常在端口 2628 上。
通过 dict 协议,用户可以查询词典、百科全书、单词释义等参考资料,并获得相关的定义、解释、用法等信息。dict 协议的查询通常基于一组事先定义好的规范和格式,这使得不同的词典服务器可以共同遵循相同的协议,以便客户端能够在不同的服务器上执行相似的查询操作。
file_get_contents()函数
根据关卡名字,可以看到会利用file_get_content函数,上面概述中有介绍这个函数的作用是把整个文件读入一个字符串中!读取时支持file协议和http协议以及php伪协议
file协议读到php源码后,无法采用file协议获取源码想要获取源码 可以通过php伪协议将代码编码一下才能获取代码
php://fi1ter/read=convert.base64-encode/resource=../../index.php
注:如果点击这里出现白屏
说明php-curl依赖没有下载
apt update #更新包管理器
apt install php-curl #下载php-curl依赖
systemctl restart apache2 #重启apache2
重新访问就有内容了