目录
声明:本篇博客是基于本人的上一篇博客 “反射型XSS实验(1)” 的基础上实验的进一步改进,所以其中的一部分相似的知识点将不会在本文中赘述,若想要完全理解本次实验过程作者希望读者先去了解本人的上一篇博客 “反射型XSS实验(1)”,里面会对此次实验中的其余知识点进行了详细说明望周知。
反射型XSS实验(1)链接:http://t.csdn.cn/1D1rF
一、实验代码及环境
<?php
header('X-XSS-Protection: 0');
$xss = isset($_GET['xss'])?$_GET['xss']:'';
$xss = str_replace(array("(",")","&","\\","<",">","'"), '', $xss);
if (preg_match('/(script|document|cookie|eval|setTimeout|alert)/', $xss)) {
exit('bad');
}
echo "<img src=\"{$xss}\">";
?>
# preg_match 函数用于执行一个正则表达式匹配。
# exit() 终止正在执行的进程
二、实验要求
通过注入当$xss所接收到的图片发生错误时,通过 οnerrοr=alert(1) js函数触发报错信息生成弹窗显示数字1。
三、实验步骤
3.1 实验代码分析
1.注入的主要思路是通过 get 函数获取错误$xss信息触发报错从而通过echo函数完成弹窗显示1。
$xss = isset($_GET['xss'])? $_GET['xss'] : '';
echo "<img src=\"{$xss}\">";
2.$xss信息通过 str_replace 函数将"(",")","&","\\","<",">",“ ' ”符号替换为空,其本质就是进行了符号的过滤。(注入的难点1)
$xss = str_replace(array("(",")","&","\\","<",">","'"), '', $xss);
3.$xss将接收的函数通过preg_match()函数经正则表达式匹配,再通过exit() 函数终止正在执行的进程,其本质就是函数的过滤,过滤的函数有:script、document、cookie、eval、setTimeout、alert。(注入难点2)
if (preg_match('/(script|document|cookie|eval|setTimeout|alert)/', $xss)) {
exit('bad');
3.2 注入
语句
http://127.0.0.1/css/demo1.php?xss=aaa%22%20onerror=location=%22javas%22%2b%22cript:al%22%2b%22ert%25281%2529
# %22为 " 经过url转码后的结果
# %20为空格经过url转码后的结果
# %28为 ( 经过url转码后的结果
# %29为 ) 经过url转码后的结果
# %25为 % 经过url转码后的结果
# location函数:可以将所有的值变为变量
# location=javascript: location通过javascript的伪协议可以将值变为变量
注入结果
注入成功
成功分析
通过上篇文章我们了解到绕过符号的方法,然而这里我们还需要进行函数过滤的绕过,这里的主要思路是进行函数的拼接绕过分别将被过滤的函数 script、alert 进行以下方法的分散后再拼接 "javas" + "cript:al" + "ert%25281%2529 以组成新的完整语句:javascript:alert%25281%2529,从而注入成功。
注意:
1.这里的 “+” 要输入经url转码后的形式:%2b ,因为直接使用 +时在url地址栏中会被url转义为空格输入到程序中。
2.我们会发现注入语句中输入了6个双引号,原始环境语句中有2个双引号,但在最终接收到的执行语句中有10个双引号,这是因为 location 函数在调用时会自动生成一对双引号,这里要特别注意生成的双引号的位置,防止注入语句中的双引号输入程序后导致整体语句中双引号的位置错乱引发的注入失败。
3.在分散函数时一定要在冒号两边各有前后函数的一部分 例:"cript:al" ,如果以 "javas" + "cript" : "al"+ "ert%25281%2529 的方法进行拼接绕过,虽然都是将 script、alert 这两个函数进行了组合,但程序无法识别组合后的 javascript : alert(1) 这一整体语句导致注入失败。
这里可以看到新的拼接形成的语句,导致注入失败。