pikachu靶场通关笔记13 XSS关卡09-XSS之href输出

目录

一、href

1、常见取值类型

2、使用示例

3、安全风险

二、源码分析

1、进入靶场

2、代码审计

3、渗透思路

三、渗透实战

1、注入payload1

2、注入payload2

3、注入payload3


本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合,通过对XSS关卡源码的代码审计找到安全风险的真实原因,讲解XSS的原理并进行渗透实践,本文为XSS09关卡XSS之href输出的渗透部分。

一、href

href(Hypertext Reference)是 HTML 中用于定义超链接目标地址的核心属性,常见于 <a>、<link> 和 <area> 标签。href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。

<a>标签的 href 属性是 HTML 中用于创建超链接的关键属性,它定义了链接的目标地址,用于指定超链接目标的 URL。如果用户选择了<a>标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。

1、常见取值类型

其值可以是 URL(如 https://example.com)、锚点(如 #section)或 协议链接(如 mailto:、tel:)具体如下所示。

  • 绝对 URL:指向完整的网页地址,如 https://www.example.com。这是最常见的用法,用于链接到其他网站。

  • 相对 URL:相对于当前页面的路径,如 page2.html 或 ../subfolder/page3.html。常用于链接到同一网站内的其他页面。
  • 电子邮件地址:使用 mailto: 前缀,如 mailto:info@example.com。点击链接时会打开默认的邮件客户端,创建一封新邮件。
  • 锚点:指向当前页面或其他页面中的特定位置,如 #section2。常用于创建页面内的导航链接。

2、使用示例

<a href="https://www.example.com">访问示例网站</a>
<a href="mailto:info@example.com">发送邮件</a>
<a href="#section2">跳转到页面内的特定位置</a>

3、安全风险

通过合理使用 <a> 标签的 href 属性,可以为用户提供便捷的导航和交互体验。但若未过滤用户输入,攻击者可注入 javascript: 伪协议(如 javascript:alert(1))或恶意 data: URI,触发 XSS 攻击。

二、源码分析

1、进入靶场

打开pikachu靶场第09关XSS之href,完整URL地址如下所示,这是一个输入框页面,如下所示。

http://127.0.0.1/pikachu/vul/xss/xss_03.php

2、代码审计

查看xss_03.php源码内容,如下所示使用htmlspecialchars函数且参数为ENT_QUOTES对输入参数进行了过滤处理,这说明没法用上一个关卡的单引号进行XSS渗透了,具体如下所示。

这段 PHP 代码的主要功能是处理用户通过 GET 请求提交的 message 参数。尽管代码使用了 htmlspecialchars 函数并指定 ENT_QUOTES 对用户输入进行处理,但仍然存在 XSS安全风险,主要原因如下:

  • 协议限制缺失:代码没有对用户输入的 URL 协议进行严格限制,攻击者可以使用 javascript: 协议来注入恶意脚本。即使使用 htmlspecialchars 对特殊字符进行了编码,javascript: 协议本身并不会被阻止,仍然可以触发 XSS 攻击。
  • 仅依赖字符编码:仅仅依靠 htmlspecialchars 进行字符编码是不够的。对于 URL 输入,需要额外的验证和过滤机制来确保其安全性,防止恶意协议的使用。

对源码进行详细注释,具体如下所示。

<?php
// 检查 $_GET 数组中是否存在名为 'submit' 的元素
// 这一步用于判断用户是否通过 GET 请求提交了表单,只有提交了表单才会进入后续逻辑
if (isset($_GET['submit'])) {
    // 检查 $_GET 数组中名为 'message' 的元素是否为空
    if (empty($_GET['message'])) {
        // 如果 'message' 为空,向 $html 变量中追加一段提示信息
        // 提示用户应该输入一个 URL
        $html .= "<p class='notice'>叫你输入个url,你咋不听?</p>";
    }
    // 检查用户输入的 'message' 是否等于 'www.baidu.com'
    if ($_GET['message'] == 'www.baidu.com') {
        // 如果等于 'www.baidu.com',向 $html 变量中追加一段提示信息
        $html .= "<p class='notice'>我靠,我真想不到你是这样的一个人</p>";
    } else {
        // 输出在 a 标签的 href 属性里面, 这里注释提示可以使用 javascript 协议来执行 js
        // 并给出防御建议:只允许 http 和 https 协议,其次再进行 htmlspecialchars 处理

        // 使用 htmlspecialchars 函数对用户输入的 'message' 进行处理
        // ENT_QUOTES 标志表示同时对单引号和双引号进行转换
        // 这样可以将特殊字符转换为 HTML 实体,避免一些 XSS 攻击
        $message = htmlspecialchars($_GET['message'], ENT_QUOTES);

        // 向 $html 变量中追加一个超链接元素
        // 超链接的 href 属性使用处理后的 $message 变量,文本提示用户点击自己输入的 URL
        $html .= "<a href='{$message}'> 阁下自己输入的 url 还请自己点一下吧</a>";
    }
}
?>

3、渗透思路

虽然代码使用了 htmlspecialchars 函数对用户输入进行处理,但仍然有XSS安全风险,攻击者可以通过​​​​使用 javascript: 协议来对该XSS安全风险进行攻击。攻击者可以输入 javascript:alert('XSS') 作为 message 参数的值。当用户点击生成的超链接时,浏览器会执行 javascript: 协议后面的代码,弹出一个包含 XSS 的警告框。

三、渗透实战

1、注入payload1

输入注入语句javascript:alert(1019),如下所示弹框“1019”,渗透成功。

2、注入payload2

输入注入语句javascript:alert("ljn"),如下所示弹框“ljn”,渗透成功。

3、注入payload3

输入注入语句javascript:alert('ljn'),如下所示弹框“ljn”,渗透成功。

### Pikachu靶场 XSS POST 攻击通关方法 在Pikachu靶场中,XSS(跨站脚本攻击)是一种常见的漏洞利用方式。对于POST类型的XSS攻击,其核心在于通过提交表单数据来注入恶意JavaScript代码。 #### 关键点分析 1. **HTML结构解析** 靶场中的页面通常会包含一段预定义的`<script>`标签或其他动态加载的内容。为了成功执行XSS攻击,需要先了解目标页面的具体HTML结构并找到可以被注入的位置[^1]。 2. **闭合现有标签** 如果目标页面已经存在未完成的HTML标签(如`<script>`),则需要使用特定字符序列将其正确闭合后再插入自定义JS代码。例如,在某些场景下可以通过以下payload实现: ```html </script><script>alert(1)</script> ``` 这里的`</script>`用于结束原有的<script>标签,而后续部分则是新的可执行脚本片段[^2]。 3. **绕过过滤机制** 很多时候开发者会对用户输入的数据做基本的安全处理比如转义特殊字符或者黑名单匹配关键词等操作。针对这种情况我们需要设计更加隐蔽有效的载荷形式以避开这些防护措施。一种常见技巧就是采用编码转换手段改变原始字符串表现形态但仍保持最终解释效果不变;另外还可以尝试分段构造整个表达式从而降低触发检测概率。 4. **实际应用实例** 下面给出一个适用于post请求下的简单示例代码用来演示如何发送含有xss payload 的form data : ```python import requests url = 'http://localhost/pikachu/vul/xss_post.php' data = {'content': '</script><script>alert("XSS")</script>'} response = requests.post(url, data=data) if response.status_code == 200 and '<script>alert("XSS")</script>' in response.text: print('XSS attack successful!') else: print('Failed to execute XSS.') ``` 此Python脚本模拟了一个向服务器端提交带有潜在危险性的评论内容的过程,并验证返回结果里是否存在预期弹窗提示信息作为判断依据之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值