目录
安装xss-labs靶场,安装压缩包。
level1
xss通关,第一关,我们先来看源码。
可以发现是把url里携带的name参数内容回显到屏幕上。那么第一想法,把name参数改成<script>alert(1)</script>
再来看看会发生什么。
成功写入,那么让我们回页面再试一试。
level2
刚来到第二关。我们就看见了这个条框。
直接输入<script>alert(1)</script>
看看会发生什么。
将内容正常回显,这是为什么,让我们去看页面源码。
从第一处我们可以发现,页面上显示的是被转义的字符,可是我们有能看见。第二处的代码并没有被转义,但是被当成了字符串被输出。那么,我们只需要做到闭合标签,就能顺利通过。
闭合标签,可以看到,成功被独立出来了。第二关页面重试一下,成功,结果如下:
level3
常用事件
1. 点击事件:
1. onclick:单击事件
2. ondblclick:双击事件
2. 焦点事件
1. onblur:失去焦点。
* 一般用于表单验证
2. onfocus:元素获得焦点。
3. 加载事件:
1. onload:一张页面或一幅图像完成加载。
4. 鼠标事件:
1. onmousedown 鼠标按钮被按下。
* 定义方法时,定义一个形参,接受event对象。
* event对象的button属性可以获取鼠标按钮键被点击了。
2. onmouseup 鼠标按键被松开。
3. onmousemove 鼠标被移动。
4. onmouseover 鼠标移到某元素之上。
5. onmouseout 鼠标从某元素移开。
5. 键盘事件:
1. onkeydown 某个键盘按键被按下。
2. onkeyup 某个键盘按键被松开。
3. onkeypress 某个键盘按键被按下并松开。
6. 选择和改变
1. onchange 域的内容被改变。
2. onselect 文本被选中。
7. 表单事件:
1. onsubmit 确认按钮被点击。
* 可以阻止表单的提交
* 方法返回false则表单被阻止提交。
2. onreset 重置按钮被点击。
第三关,老方法,继续注入<script>alert(1)</script>
可以看见。
发现,无论是上面的回显,还是文本框上的显示,都被转义了,那么就放弃把分离<script>alert(1)</script>
这个方法放弃掉。然后考虑,闭合掉value,然后再给input标签一个事件。这里我选择的 onmousemove
鼠标移动事件。也就是,把参数变成 ' onmousemove='javascript:alert(1)
成功,结果如下:
level4
第四关,输入<script>alert(1)</script>
发现回显为scriptalert(1)/script
,也就是说尖括号被过滤掉了。
那我们还有第二种方法,输入' onmousemove='javascript:alert(1)
,去源码看一眼。
是双引号闭合,那我们将代码改为" onmousemove="javascript:alert(1)
成功,结果如下。
level5
第一步,先输入<script>alert(1)</script>
发现回显为<scr_ipt>alert(1)</script>
,所以是把<script>
变成了<scr_ipt>
。
那我们还有第二种方法,输入" onmousemove="javascript:alert(1)
,去源码看一眼。
onmousemove
被替换为o_nmousemove
经过实验,我列出的所有事件都被替换了,那么 我们就闭合标签 创建一个新的标签。"><a href=javascript:alert(1)>test</a>
,创建一个新的链接标签 于文本框之后。结果如下:
level6
现在 我们有三种方法 <script>alert(1)</script>
" onmousemove="javascript:alert(1)
"><a href=javascript:alert(1)>test</a>
取出关键字 <script> onmousemove="javascript:alert(1) href
可以发现,三个现有能用的关键字全被替换了。那么我们可以尝试大小写 看看能不能绕过。输入" ONmouseMove="javascript:alert(1)
发现能成功上传,结果如下:
level7
第七关,先使用<script>alert(1)</script>
进行尝试。
输入之后 发现script
被屏蔽掉了,那么我们先停止继续往下尝试,换个思路,既然script会被屏蔽,那么我们可以通过双写方法,绕过验证。输入
"><sscriptcript>alert(1)</scscriptript>
发现成功,结果如下:
level8
第八关,我们先把所有可能会被处理的内容输入进去,看看那些会被处理,输入
"'><script><sCript><a href=javascript:alert() Onmousemove>
发现所有能用的都被处理掉了,利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议 javascript:alert()
利用在线工具进行Unicode编码后得到,在线Unicode编码解码
javascript:alert()
发现成功,结果如下:
level9
第九关,老方法,继续输入常用数据,看看那些会被处理,输入
发现所有的都被处理过,而且双引号也被处理掉了,无法将value闭合,那么我们只能的思路就只剩下了,想上一关,添加js伪协议
javascript:alert()
,但是我们又发现,在href内,说您的链接不合法?有没有!
那就是说明代码会对我们输入的url进行检测,那么我们输入正常url 例如http://www.baidu.com
发现这样能成功输入,说明对http://
进行了检测
那么我们就对第八关的
javascript:alert()
添加一段http://
并用注释符注释掉,形成
javascript:alert()/* http:// */
然后在进行注入,成功。结果如下:
level10
第10关上强度了啊,不用说,尝试输入
"'><script><sCript><a href=javascript:alert() Onmousemove>
所有手段都被禁用了,因为他直接是以字符串形式存在的,但是并没有对我们的大部分关键字进行处理。那我们来审视代码。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level11.php?keyword=good job!";
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
<?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>';
?>
<center><img src=level10.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
这三句,说明他从url中去获取了t_sort
参数,但是没有获取到,并且对t_sort
参数进行了处理,去除了<>
那么我们需要在url中新增一个t_sort
参数。先来试试效果。因为<>
被过滤了,我们采用增加事件的方式来审视源码。 在url中写入 。
看似成功写入,但是我们需要触发我们的事件,需要调出input第三个框。将type="hidden"
改成type="text"
input的输入框就会被调出。在进行事件触发。发现成功,结果如下:
level11
第11关跟上一关一样,将input输入框隐藏掉了,
发现这次还是可以接收四个参数,第四个有默认值,发现是referer。而且t_ref的ref也是一个提示。我们先把前三个当作参数输入,看看能否成功注入。
?t_link="'><script><sCript><a href=javascript:alert() Onmousemove>&t_history="'><script><sCript><a href=javascript:alert() Onmousemove>&t_sort="'><script><sCript><a href=javascript:alert() Onmousemove>
将他注入到url中。
发现t_sort好像注入成功了,那就拿它下手!先查看源代码,看看有什么被改变了。
发现 所有能用的思路都被替换了 双引号闭合也闭合不了。然后前两个input也没响应。那么我们可以试试,使用post方式传参。
用post传参也没有反应,那么放弃前三个输入框吧,从第四个入手。我们知道了 value
的内容对应的是referer。那么我们使用burpsuite抓包改变referer的值:
发现屏蔽了 <>
那么我们使用
" onmousemove=javascript:alert() type="text
发现成功 结果如下:
level12
第12关,打开f12,寻找到input标签,发现了第四个input和第11关差不多,只不过这次是UA头。不用犹豫,直接打开burpSuite抓包调试。
将 User-Agent
改为
"><script>alert(1)</script>
然后查看源代码:
发现又屏蔽了 <>
那么我们使用
" onmousemove=javascript:alert() type="text
发现成功 结果如下:
level13
第13关,打开f12,直接找到input标签。发现第四关input标签需要的是cookie的值
burpSuite抓包,更改cookie的值,尝试上面的两种方法
"><script>alert(1)</script>
" onmousemove=javascript:alert() type="text
先进入源代码,查看cookie所需要的值。
call me maybe?
分析应该是cookie的元素,使用burpSuite抓包。
找到了call me maybe?
那么我们只需要针对他进行修改。
方法1不中,采用方法2 。输入" onmousemove=javascript:alert() type="text
发现成功,结果如下:
level14
第14关,对不起,不会,望大佬指导
level15
ng-include
include要素察觉,像文件包含漏洞。将1.gif包含一同执行,得以让1.gif显现出来,那么我们去包含别的已知文件,如:level1.php
输入 'level1.php'
页面形如
然后按照老规矩,再level1.php的基础上注入。
但发现对 <script>
进行了处理。参考大佬的文章 XSS常见的触发标签 使用
level16
第16关是,我先按照常理,注入
"'><script><sCript><a href=javascript:alert() Onmousemove>
去寻找被处理的地方。
发现所有能用的都被处理了 那么 我们刚学到的新知识,现在就用一下吧,但是发现这一关有一个特别的地方 他好像把空格也实体化了,问题不大 我们可以尝试用回车替代空格。burpSuite抓包,将参数替换为
<img%0Asrc="x"%0Aonerror=alert(1)>
发现成功,结果如下: