XSS-labs通关挑战(xss challenge)

XSS-labs通关挑战(xss challenge)

0x00 xss-labs

  最近在看xss,今天也就来作一下xss-labs经过挑战。找了很久的源码,终于被我给找到了,由于在GitHub上你们也知道那个下载速度,因此,我也就直接转接到本身的码云上去了,在这也贴出来,欢迎你们下载使用。javascript

  源码连接请点击:https://gitee.com/ruoli-s/xss-labsphp

  安装没啥好说的,直接放进本身搭建好的www目录下,就能够开始闯关了,xss-labs一共有level 20,作着看吧。html

  (其实以为这些图片才是我真正想作xss challenge的最大缘由img)前端

image-20210115185051244

0x01 Level 1 无过滤机制

image-20210115190305848

  看了半天,原来参数在URL里放着呢,java

image-20210115192519758

  修改参数,页面也随之变更,右键查看源代码,发现有跳转到level 2 的JS,而咱们传入的参数是几位的,下面就显示payload的长度。git

image-20210115192731335

  OK,直接走代码:ssh

<script>alert(/xss/)</script>

image-20210115193519094


0x02 Leval 2 闭合标签

image-20210115194005055

  咱们直接输入level 1 的 payload,发现直接输出了,这里应该是作了实体转义。xss

image-20210115193744576

  F12查看前端代码:函数

image-20210115194351470

  第一处就是显示在页面上的代码,第二处是咱们输入的代码,这里应该是作了转义,咱们构造payload,使用">尝试闭合input标签:测试

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

image-20210115194940046


0x03 Leval 3 单引号闭合+htmlspecialchar()函数

image-20210115205058546

  来到Leval 3,咱们仍是先使用上两关测试的payload来验证:

image-20210115205557603

  发现所有被实体转义了,咱们去看源代码:

<?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>";
?>

  咳咳,发现对双引号作了限制,可是却放行了单引号',并且竟然在value这里也加了htmlspecialchars函数,这种状况咱们能够经过事件标签触发表单执行。这里开始构造payload:

'onmouseover='alert(/xss/)

image-20210115221343280

  能够看到,在提交以后,没有马上弹出,这里咱们还须要将鼠标移动到文本框,让事件触发。

image-20210115221850004

补充:

  htmlspecialchars函数

  html事件属性


0x04 Leval 4 双引号闭合+添加事件

image-20210115224342651

  咱们仍是同样,使用前面测试过的,先一一过一遍,固然,结果必然是失败的,那么接下来咱们看全端代码:

image-20210115234612324

  能够发现源代码对><进行了过滤,咱们看源代码:

<?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>';
?>

 确实使用str_replace()尖括号进行了过滤,并且对单引号'作了防护,因此,咱们直接模仿上一题,使用HTML事件,构造payload:

"onmouseover="alert(/xss/)

image-20210115235939043

这里也是成功过关。


0x05 Leval 5 javascript伪协议

image-20210116112615699

终于来到了第五关,咱们使用前面的方式都测了一遍,失败无疑,可是发现了一些其余东西:

image-20210116150442506

  貌似on被作了手脚,咱们继续在o后面输入其余,发现只有on被替换了,这也就意味着事件是不能用了。

image-20210116150807491

  继续尝试发现<script>也被进行了替换<scr_ipt>,

image-20210116151044701

  到这里相信你们都想到了,咱们试试大小写混用:

image-20210116151747433

  咳咳,在线打脸哈,输出全为小写,看来人家也是作了大小写过滤了。

image-20210116151900058

  继续尝试看看可否闭合,咱们输入',",<,>,\进行尝试,发现只有'被实体转义。那应该就是可使用"来构造闭合:

image-20210116151535724

  好,该试的都试过了,接下来咱们试试 javascript 的伪协议

  要看javascript伪协议的请点这里

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

image-20210116153331190

image-20210116153501066

  最后,咱们也是成功的过关了,固然,仍是看一下源码比较踏实:

<?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>';
?>

  也确实如咱们猜的一致,分别对on<script>进行了替换,也作了大小写过滤。好了,继续下一关,欧里给。


0x06 Leval 6 大小写绕过

  顺利来到第6关,咱们正在徒步前行!!!

image-20210116154828872

  咱们直接拿上一关的payload来测试,固然,也不用想,确定是行不通的,直接来看前端代码,哎呦我去,发现了个啥,此次连href也给过滤了,是个狠人。

image-20210116183918429

  咱们也测试一下on<script>等,发现被过滤的明明白白的,且单引号'也被实体转义,可是咱们也发现了其余的东西,貌似没有多虑大小写哈?

image-20210116185419800

  咱们直接撸大小写,使用双引号">构造闭合:

<ScRipt>alert(/xss/)</scRIpT>

image-20210116185731885

  这里也是成功过关。继续,冲冲冲!!!


0x07 Leval 7 双写绕过

  来到第七关,嗯,这个图不错,很魔性有没有?

image-20210116190206085

  废话很少说,先来一波,有木有发现仍是挺管用的?(●'◡'●)。

image-20210116195035217

  发现像script这种关键字被过滤了,难道是双写?咱们直接使用双引号"闭合构造payload:

"><scrscriptipt>alert(/xss/)</scrscriptipt>

image-20210116195454082

  轻松搞定😁,下一个。


0x08 Leval 8 编码绕过

  来到第八关,啥也不是。

image-20210116210245989

  测试payload,能够看见前面测试过的基本都过滤了,大小写也都卡的死死的,可是咱们发现前端代码中直接构造好了<a>标签,既然这样,咱们不妨试试编码,看可否绕过:

image-20210116210823200

  这里,笔者本身通过测试,html实体编码和hex编码均可以绕过,我就只放hex编码吧,看大多数博客上都是HTML实体编码,不熟悉的能够本身再了解了解。

  咱们能够看到,代码转换机制是将script中的ri变成了r_i,因此咱们只编码ri试试:

字母 十进制 hex(十六进制)
r &#114; &#x72;
i &#105; &#x69;

  编码连接请点这里

  构造payload:

javasc&#x72;&#x69;pt:alert(/xss/)

image-20210116213444302

干得漂亮,下一关。


0x09 Leval 9 检测关键字

  越看这些图片越喜欢🤭,按照惯例,咱们仍是先捣鼓一番。

image-20210116213925894

  我去,什么状况,该试的基本都试了一遍,这代码给的是个啥?咱们输入的payload呢??

image-20210116215646648

img

  不行,待老衲去查看源代码:

<?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>';
}
?>

  牛逼了,牛逼上天了,除了之前作过的全部过滤,居然还加了个strpos函数,谁都不服就服你,这函数的意思是我们输入的字符串里面必需要有http://字符,我,吐了呀,这谁能想的到:

  想要更多了解strpos函数的请点这里

  看到这里并无对编码进行过滤,因此咱们仍是延用上题的payload:

javasc&#x72;&#x69;pt:alert('xsshttp://')

image-20210116221407612

  咳咳,这题,,,挺不人道的,下一个,啥也不是。


0x10 Leval 10 隐藏信息

  历经千辛万苦,终于来到了整个挑战的一半,呜呜呜。

image-20210116222501534

  噗噗噗,又吐了呀,全部的都试了,为毛又跑到URL连接上去了?看代码神马都没得呀,可是冒出了个表单是啥?还在页面没有显示?

image-20210116225702764

  没办法,去看源码吧,哎,心碎了💔

<?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>';
?>

  发现没有?感情keyword参数只是一个迷惑而已呀,真正起做用的是t_sort参数,可是有一个问题,它的type类型是hidden,咱们得在前端改成text类型,让其显现出来,且后台只对<>作了过滤,咱们能够用事件来构造:

"onmouseover="alert(/xss/)

image-20210116230805030

image-20210116231027885

注意:必定要在前端修改2次type类型,才能完成弹窗。


0x11 Leval 11

持续更新中·····

相关文章
相关标签/搜索