demo1:
<?php
header('X-XSS-Protection: 0');
$xss = isset($_GET['xss'])? $_GET['xss'] : '';
$xss = str_replace(array("(",")","&","\\","<",">","'"), '', $xss);
echo "<img src=\"{$xss}\">";
?>
问题描述
在页面内进行弹窗(反射型xss漏洞的特征)
解决方案:
题目利用replace函数将常见的"(",")","&","\\","<",">","'"都替换成了空格符号,而想进行弹窗操作需要利用到οnerrοr="alert(xxx)"函数。最关键的问题在于怎么绕过对于括号的限制。我们可以利用URLcode编码将括号转变为%28和%29,而URLcode编码会自动将%28和%29识别为括号,又会被限制,我们可以将%转换为相应的%25
而这时浏览器并未将%28和%29识别过来,原因是onerror函数为一个JS函数,在JS中是不允许编码符号的,就是在onerror内部不允许进行符号的编码。故无法进行括号的编码。
解决办法是location函数来解决此问题,其可以将右侧的值转换为变量,而在JS中变量是可以进行编码的,利用JavaScript伪协议如下
demo2:
<?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}\">";
?>
解决:
此问题将上一题目进行升级,将script,alert进行限制。我们可以利用拼接字符串的形式进行绕过
只需要把urlcode无法识别的+转换为对应的%2b即可