目录
题目
<?php
header('X-XSS-Protection: 0');
$xss = isset($_GET['xss'])? $_GET['xss'] : '';
$xss = str_replace(array("(",")","&","\\","<",">","'"), '', $xss);
echo "<img src=\"{$xss}\">";
?>
代码分析
1、下面代码是运用了三目运算符对get是否传到参数进行了判断,并将传到的参数对xss变量进行赋值
$xss = isset($_GET['xss'])? $_GET['xss'] : '';
2、下面代码是通过正则表达式,将get上传的参数进行了过滤,将" ( ", " ) ", " & ", " \\ ", " < ", " > ", " ' "这些符号进行了替换,替换结果为空
$xss = str_replace(array("(",")","&","\\","<",">","'"), '', $xss);
3、通过get传参,进行打印<img>标签注入的结果
echo "<img src=\"{$xss}\">";
注入过程及思路
1、第一次注入
注入语句:
?xss=1"%20onerror="javascript:alert(1)
思路:
先闭合前面<img>标签的双引号",通过onerror函数进行弹窗。
失败原因:
上传参数中存在(),由于()被正则表达式过滤,使得()被替换成了空,因此弹窗失败。
2、第二次注入
注入语句:
?xss=1"%20onerror="javascript:alert%281%29
思路:
想通过对()进行urlcode编码的方式绕过正则表达式的过滤,实现弹窗,不使用其他编码是因为都被正则表达式过滤掉了,因此只能使用urlcode编码。
失败原因:
在url地址栏中,通过用urlcode对()编码,在手动敲下Enter的瞬间,url地址栏会将%28和%29解码为(),此时,上传的参数还没有进入到程序当中,因此()被过滤掉了,所以弹窗失败。
3、第三次注入
注入语句:
?xss=1"%20onerror="javascript:alert%25281%2529
思路:
想通过对%28和%29的%将进行urlcode编码,这样在url地址栏解码后就是alert%281%29,此时参数不再是()就会进入到程序当中,从而实现弹窗。
失败原因:
onerror是javascript的函数遵循的javascript的语法,在javascript的语法当中,符号是不能进行编码的,因此%28和%29是无法解码的,因此弹窗失败。
4、第四次注入
注入语句:
?xss=1"%20onerror=location.href="javascript:alert%25281%2529
思路:
通过增加一个location函数和一个javascript的伪协议,将location后面的"javascript:alrt%25281%2529成为变量,在javascript的语法当中变量是可以编码的,因此弹窗成功。