当前位置: 首页 > news >正文

pikachu靶场通关笔记14 XSS关卡10-XSS之js输出(五种方法渗透)

目录

一、源码分析

1、进入靶场

2、代码审计

二、渗透实战

1、根据提示输入tmac

2、XSS探测

3、注入Payload1

4、注入Payload2

5、注入Payload3

6、注入Payload4

7、注入Payload5 


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

一、源码分析

1、进入靶场

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

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

2、代码审计

右键查看源码,发现javascript代码,具体如下所示。

接下来查看xss_04.php源码内容,很明显此代码存在 XSS安全风险,核心原因在于直接将未经过滤和验证的 PHP 变量 $jsvar 嵌入到 JavaScript 代码中。$jsvar 的值来自用户通过 GET 请求提交的 message 参数,攻击者可以构造包含恶意 JavaScript 代码的输入,当这些恶意代码被嵌入到 JavaScript 代码块中时,就会在页面加载或执行相应逻辑时被浏览器执行。对应的完整JavaScript代码注释后如下所示。

<script>// 从 PHP 代码中获取 $jsvar 变量的值,并将其赋值给 JavaScript 变量 $ms// 这里是通过 PHP 的 echo 语句将 $jsvar 的值嵌入到 JavaScript 代码中$ms = '<?php echo $jsvar;?>';// 检查 $ms 变量的长度是否不为 0// 即判断 $ms 是否有实际的内容if ($ms.length != 0) {// 检查 $ms 变量的值是否等于 'tmac'if ($ms == 'tmac') {// 如果 $ms 的值等于 'tmac',使用 jQuery 的 text 方法// 将 ID 为 'fromjs' 的元素的文本内容设置为 'tmac确实厉害,看那小眼神..'$('#fromjs').text('tmac确实厉害,看那小眼神..');} else {// 如果 $ms 的值不等于 'tmac'// 注释掉的代码,原本想弹出一个包含 $ms 内容的警告框// alert($ms);// 使用 jQuery 的 text 方法// 将 ID 为 'fromjs' 的元素的文本内容设置为 '无论如何不要放弃心中所爱..'$('#fromjs').text('无论如何不要放弃心中所爱..');}}
</script>

如上代码中提到了jvar变量,相关定义如下图所示。如下所示使用htmlspecialchars函数且参数为ENT_QUOTES对输入参数进行了过滤处理,这说明没法用第08关卡的单引号进行XSS渗透了。

这段 PHP 代码的主要功能是处理用户通过 GET 请求提交的 message 参数。当用户提交表单(即 submit 参数存在)且 message 参数有值时,将 message 的值赋给 $jsvar 变量。若 $jsvar 的值为 tmac,则在页面上显示一张名为 tmac.jpeg 的图片。详细注释后的源码如下所示。

<?php
// 初始化一个空字符串变量 $jsvar,用于存储后续要在 JavaScript 中使用的变量值
$jsvar = '';
// 初始化一个空字符串变量 $html,用于存储后续要输出的 HTML 内容
$html = '';// 检查 $_GET 数组中是否存在名为 'submit' 的元素,并且是否存在名为 'message' 的元素且其值不为 null
// 即判断用户是否通过 GET 请求提交了 'submit' 参数,同时也提交了 'message' 参数且该参数有值
if (isset($_GET['submit']) && $_GET['message'] != null) {// 将用户通过 GET 请求提交的 'message' 参数的值赋给 $jsvar 变量$jsvar = $_GET['message'];// 检查 $jsvar 变量的值是否等于 'tmac'if ($jsvar == 'tmac') {// 如果等于 'tmac',向 $html 变量中追加一个 img 标签// img 标签的 src 属性使用预定义的常量 $PIKA_ROOT_DIR 拼接图片的路径// 用于在页面上显示一张名为 tmac.jpeg 的图片$html .= "<img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/tmac.jpeg' />";}
}
?>

综上,第10关的代码存在 XSS安全风险,原因在于直接将用户输入的内容$_GET['message']赋值给 $jsvar 变量,且未对输入进行任何过滤和验证,接又将未经过滤和验证的 PHP 变量 $jsvar 嵌入到 JavaScript 代码中。$jsvar 的值来自用户通过 GET 请求提交的 message 参数,攻击者可以构造包含恶意 JavaScript 代码的输入,当这些恶意代码被嵌入到 JavaScript 代码块中时,就会在页面加载或执行相应逻辑时被浏览器执行。

二、渗透实战

1、根据提示输入tmac

进入到pikachu靶场XSS关卡最后一关,根据点击提示获得的信息“输入被动态的生成到了javascript中,如何是好。输入tmac试试-_-”,输入tmac,效果如下所示。

页面提示看那小眼神..“tmac确实厉害,看那小眼神..”,就这是因为js代码种输入为tmac,故而fromjs元素被赋值为“tmac确实厉害,看那小眼神..”,同时因为jvar为tmac,页面显示了图片tmac.jpeg,相关源码如下所示。

if ($jsvar == 'tmac') {// 如果等于 'tmac',向 $html 变量中追加一个 img 标签// img 标签的 src 属性使用预定义的常量 $PIKA_ROOT_DIR 拼接图片的路径// 用于在页面上显示一张名为 tmac.jpeg 的图片$html .= "<img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/tmac.jpeg' />";
}
如果输入是tmac时, 将 ID 为 'fromjs' 的元素的文本内容设置为 'tmac确实厉害,看那小眼神..'
如果输入不是tmac时,将 ID 为 'fromjs' 的元素的文本内容设置为 '无论如何不要放弃心中所爱..'

2、XSS探测

输入Payload语句<script>alert('ljn')</script>探测XSS安全风险,如下所示。

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

输入payload后没有任何反应,右键源码,搜索关键字ljn,可知因为ms不是tmac所以输出“无论如何不要放弃心中所爱”。具体代码逻辑如下所示。

由于ms参数未有任何过滤,故而渗透的思路可以通过与上图绿色框中的<script>构造闭合,只要构造出一个js语句就好了。

3、注入Payload1

前提1:语句的开始与上图中绿色的<script>构造闭合,如'</script>即可闭合。

重点:接下来是xss恶意脚本,如<script>alert('ljn')</script>,注入语句如下所示。

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

右键源码-搜索关键字ljn,分析渗透成功的原因,Payload1如何通过闭合语句来进行渗透的。红色框中的闭合如下所示。

<script>$ms=''</script>

绿色框内为恶意弹窗<script>alert('ljn')</script>,效果如下所示。

4、注入Payload2

本次Paylaod的效果为弹框cookie值,注入Payload如下所示。

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

右键查看源码,搜索关键字cookie,闭合构造如下,故而可以弹框成功。

5、注入Payload3

首先要用’;闭合掉当前ms的赋值的语句,然后插入新js语句,然后再用//注释掉老语句遗留下来的’;

开头有<script>
结尾有</script>
只要中间包含xss恶意脚本,如弹框alert('ljn')
那么就变成了<script>alert('ljn')</script>

接下来我们尝试进行闭合,目前可变参数为ms=’string’;

前提1:语句的开始为包含';闭合掉ms赋值语句,如';,在中间插入 xss恶意脚本,如alert('ljn')

前提2:语句的末尾为//,注释掉后ms赋值语句最后的';

本次Paylaod的效果为弹框“ljn”,注入Payload设置为';alert('ljn')//或者或者';alert('ljn');//如下所示。

';alert('ljn')//
';alert('ljn');//

右键源码,搜索关键字ljn,闭合构造的原因如下所示。

Payload中第一个';使得ms赋值函数声明结束,接下来的alert('ljn')就可以是一个新的语句,但是原本ms赋值语句的最后为单引号和分号,故而在他们之前还需要加上//注释掉,从而构造如下闭合语句。

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

其中alert('ljn')<script></script>生成如下脚本,构成弹框

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

6、注入Payload4

本次Paylaod的效果为弹框“1019”,注入Payload如下所示。

';alert(1019);//
';alert(1019)//

右键源码,搜索关键字1019,闭合构造如下,故而可以弹框成功

7、注入Payload5 

本次Paylaod的效果为弹框cookie值,注入Payload如下所示。

';alert(document.cookie);//
';alert(document.cookie)//

相关文章:

  • 01-Redis介绍与安装
  • es地理信息索引的类型以及geo_point‌和geo_hash的关系
  • Android 轻松实现 增强版灵活的 滑动式表格视图
  • Spring AI 之工具调用
  • Legal Query RAG(LQ-RAG):一种新的RAG框架用以减少RAG在法律领域的幻觉
  • 平面上的最接近点对
  • C语言基础(11)【函数1】
  • t021-高校物品捐赠管理系统【包含源码材料!!!!】
  • mac版excel如何制作时长版环形图
  • selenium学习实战【Python爬虫】
  • 智能进化论:AI必须跨越的四大认知鸿沟
  • SQL进阶之旅 Day 14:数据透视与行列转换技巧
  • Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】
  • FFMPEG 提取视频中指定起始时间及结束时间的视频,给出ffmpeg 命令
  • 数据库容量暴涨时优化方案
  • AI全栈之路:Ubuntu云服务器部署Spring + Vue + MySQL实践指南
  • 使用jstack排查CPU飙升的问题记录
  • 匀速旋转动画的终极对决:requestAnimationFrame vs CSS Animation
  • Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
  • GlobalSign、DigiCert、Sectigo三种SSL安全证书有什么区别?
  • 文案转行做网站编辑/推广关键词
  • 河北建设厅注册中心网站首页/怎么做ppt
  • 美妆网站建设方案/查询网址域名
  • 自己做网站和推广/河北搜索引擎优化
  • 镇江网站设计哪家好/湖南株洲疫情最新情况
  • 福州网站建设找百诚互联/营销网站