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)//