XSS

一、XSS简介

什么是XSS

  XSS全称(Cross Site Scripting)跨站脚本攻击,是最常见的web应用程序安全漏洞之一,位于OWASP top 10 2013年度第三名,XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的危险代码,当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。

  从上面的一段话,可以得知,xss属于客户端攻击,受害者最终是用户,但特别要注意的是网站管理人员也属于用户之一。这就意味着xss可以进行“服务端”攻击,因为管理员要比普通用户的权限大得多,一般管理员都可以对网站进行文件管理,数据管理等操作,而攻击者一般也是靠管理员身份作为“跳板”进行实施攻击。

  xss攻击最终目的是在网页中嵌入客户端恶意代码,最常用的攻击代码是JavaScript语言,但也会使用其他的脚本语言,例如:ActionScript、VBScript。而如今的互联网客户端脚本基本上是基于JavaScript,所以如果想要深入研究xss,必须要精通JavaScript。

  xss换句话说,JavaScript能够到什么效果,xss的胃里就有多大。这完全不是危言耸听。JavaScript可以用于获取用户的cookie,弹出窗口,那么存在xss漏洞的网站,xss就可以用来盗取用户cookie,废掉页面,导航到恶意网站!更高端的xss代码完全可以进行监控你的键盘操作,模仿windows注销界面,诱导你输入开机密码!而攻击者需要做的仅仅是向你的代码中注入JavaScript代码!

如何挖掘xss

  寻找脚本程序的输出显示代码,搜索关键字,显示输出那个变量,跟踪变量是否过滤。

二、xss的类型

(一)反射型xss或不持久型xss

实例1

<?php
$name = $_GET['name'];
echo "Welcome $name</br>"; ?>

测试结果

 

在这段代码中程序接受name的值,并且输出,如果提交xss1.php?name=111,那么程序将输出111,如果恶意用户输入nam=<sCrIpT>恶意代码</sCrIpT>,因为程序并没有进行xss代码过滤,最终造成反射型xss漏洞。

实例2

在线xss跨站网站:https://public-firing-range.appspot.com/

(二)存储型xss或持久型xss

实例1

与反射型xss相比,唯一的区别就是xss代码被带入数据,在下次浏览时,又被读取出来使用DVWA

mysql -uroot -p

use dvwa;

show tables;

select * from guestbook;

delete from guestbook;

<script>alert(/xss/)</script>

此时xss脚本已经存入数据库

实例2

新建一个xss/index.php文件:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title></title>
</head>
<body>
<div>
<?php

    if(isset($_POST['input']))
    {
        $data = $_POST['input'];
    echo $data;
    }

?>
</div>
<form action="" method="post">
  <p>
    <textarea name="imput" rows="20" cols="60"></textarea>
  </p>
  <p>
    <input type="submit" value="Go" />
  </p>
</form>
</body>
</html>

(三)DOM xss

隐蔽性比较好,扫描器很难扫出!

实例1

DOM
<
script> var urls = document.URL; var index = document.URL.indexOf("url=")+4; var par = urls.substring(index); document.write(decodeURI(par)); </script>

实验如下:

 不知道为什么突然上传不了图片了

(四)变异 xss

http://www.thespanner.co.uk/2014/05/06/mxss/

变异xss是从安全范围引导入到不安全的过滤范围。大多数的常见的变异xss结构是源于错误的阅读innerHTML之间的代码。一个好的变异xss例子是使用listing元素使xss条件满足

<listing>&lt;img src=1 onerror=alert(1)&gt;listing>

 当listing的innerHTML之间被读,它转变进入一个image元素,即使原始的HTML被避开。

下面的代码例子显示出实际是如何被解析的。

<listing id=x>&lt;img src=1 onerror=alert(1)&gt;listing>
<script>alert(document.getElementById('x').innerHTML)</script>

 alert的预期的结果是将输出 “ &lt;img src=1 onerror=alert(1)&gt; ”,然后IE10实际解析返回的结果是 “ <img src=1 onerror=alert(1)> ”。引导者从安全范围引导入不安全的过滤范围。变异xss影响数据多次被读,第一层是真实的HTML,而且每次读innerHTML之间是被看作其它变异,取决于它变异的次数。

http://www.businessinfo.co.uk/lab/mxss/

通过使用mxss tool可以轻松知道矢量变异和执行。因为变异xss影响多个等级,根据下面的HTML将完美有效的,如果你改变等级到2.这读写HTML两次,你当然能增加变异值和无限编译。

<listing id=x>&amp;lt;img src=1 onerror=alert(1)&gt;</listing>

HTML编译器解析经常混乱而又可理解,因为复杂的相互作用的HTML、实体和不同的文本类型。那些混淆发生在HTML和XHTML。在IE9实际文档格式将会被解析软件混乱编译这是一个XHTML元素而不是HTML元素。

(五)专业或相对路径覆盖 xss

http://challenge.hackvertor.co.uk/xss_horror_show/chapter7/rpo.php

 (六)不存储型 xss

只要是输入的地方都可以插入恶意xss代码

四 xss测试技巧

工具扫描

APPscan

awvs

burpsuite

XSSERXSSF

http://www.domxsscanner.com/

手动测试

使用手工检测web应用程序是否存在xss漏洞,最重要的是考虑那里有输入,输入的数据在什么地方输出。

在进行手工检测xss时,人毕竟不像软件那样不知疲倦,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在xss。比如测试某输入是否存在xss漏洞,请不要直接输入xss跨站语句进行测试一步一步来,这样更有利于测试。

第一种情况:可得知输出位置

输入一些敏感字符,例如<、>、"、'、() 等等,在提交请求后去查看HTML源代码,看这些输入的字符是否被转义。

在输出这些敏感字符的时候,很有可能程序已经做过了过滤,那么你在寻找这些字符的时候就不是那么容易了,这时候你可以直接输入“XXSER<>"'&”折床字符串,然后再查找源代码的时候直接进行查找XXSER或许比较方便一些。

第二种情况:无法得知输出位置

非常多的web应用程序源代码是不对外开放的,这时在进行测试xss时就有可能无法得知输入数据到底在何处显示,比如测试某留言本是否存在xss,那么在留言之后,你必须要经过管理员的审核才能进行显示,这时你是无法得知,你输入的数据在后台管理页面处于何种状态,例如:

  在<div>标签之中:<div>XSS test</div>

  在<input>标签之中:<input type="text" name="content" value="xsst test"/>

  对于这种情况通常会采用输入" ">... "来进行测试

  万能测试xss漏洞代码:“ /></textarea><script>alert(1)</script> ”

  有些情况手工检测漏洞效率比全自动检测软件更快(漏洞验证),因为测试人员通过经验可以快速的发现输入点,这是扫描器所无法比拟的。

 另外,一些xss漏洞也不仅仅是直接注入到HTML,或者数据库中才能触发,比如在上传文件时修改文件名“<script>alert(/xss/)</script>”,那么程序在读取文件名后并将文件名显示在HTML文档中,也会触发xss漏洞。

有着输入的地方就有可能存在着风险,如果连输入都没有了,xss也不必检测了,包括其他安全漏洞。

原文地址:https://www.cnblogs.com/little-kwy/p/9502855.html