当先锋百科网

首页 1 2 3 4 5 6 7

0 概述

学习路线,如如下图所示,

在这里插入图片描述

上图只是个参照,具体我们主要通过本地靶场初步认识xss及分类,通过xss平台进一步理解,然后我们会做一些在线xss靶场练习,最后做下总结。

1 环境准备

开始学习之前,准备下环境,服务器环境+本地靶场,具体列表如下:

软件版本说明
kali linux6.3.0渗透测试系统
phpstudyX1.29集成环境
docker20.10.25容器
area39/pikachulatestpikachu本地漏洞靶场docker镜像

相关软件安装配置自行查询相关文档,或者参考最后的连接,界面如下图1-1所示:

在这里插入图片描述

下面我们将结合本地靶场讲解下xss

2 反射型xss

2.1 概述

反射型跨站脚本攻击(Reflected XSS)是一种常见的Web安全漏洞类型,它涉及将恶意脚本注入到URL参数或输入字段中,然后这些恶意脚本被服务器返回并在受害者的浏览器中执行。

攻击过程如下:

  1. 注入恶意脚本:攻击者构造一个恶意URL,其中包含注入的恶意脚本。通常,攻击者会将恶意脚本作为参数添加到URL中。
  2. 用户点击恶意链接:攻击者通过各种方式诱使用户点击包含恶意脚本的链接,例如通过社交工程、钓鱼邮件等。
  3. 服务器响应:受害者点击链接后,恶意的URL参数被发送到服务器。服务器接收到参数后,将恶意脚本包含在返回的响应中。
  4. 浏览器执行恶意脚本:受害者的浏览器接收到响应后,会解析并执行恶意脚本。这可能导致攻击者在受害者的上下文中执行任意代码,例如窃取用户的敏感信息、会话劫持等。

要防止反射型XSS攻击,可以采取以下措施:

  • 输入验证和过滤:在服务器端对输入数据进行验证和过滤,确保输入数据不包含恶意脚本。验证数据是否符合预期的格式和范围。
  • 输出编码:在将用户生成的内容呈现在网页上之前,确保对其进行适当的编码,以防止恶意脚本的执行。使用适合上下文的编码函数。
  • 使用CSP:实施内容安全策略(CSP),限制允许在网页上运行的脚本源。这有助于减轻反射型XSS攻击的影响。
  • 警惕点击不明链接:作为用户,要警惕点击不明链接,尤其是来自不信任来源的链接。
  • 教育用户:教育用户识别和避免点击可疑链接,提高他们对网络安全的意识。
  • 正则安全审计和渗透测试:定期审计代码,寻找潜在的反射型XSS漏洞。进行渗透测试,发现并解决可能被忽视的漏洞。
  • 使用安全库和框架:使用已验证和被广泛接受的安全库和框架来处理用户输入和输出,以减少XSS风险。

通过综合采取这些措施,可以显著减少反射型XSS攻击的风险,从而保护Web应用程序和用户的安全。

2.1 靶场-反射型xss(get)

首先F12观察输入框,如下图2.1-1所示

在这里插入图片描述

  1. 有长度限制,这个好解决,直接修改长度

  2. 也可以在url参数位置直接输入

  3. 输入最简单的js弹窗函数alert(1)

    效果如下图2.1-2所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I3diGOrE-1692025472178)(L:\BaiduSyncdisk\study\security\web\xss\images\2023-08-03_230158-pikachu-reflect-get-effect.png)]

我们看下相应xss_reflected_get.php源代码:

<?php
<!-- 省略 -->

$html='';
if(isset($_GET['submit'])){
    if(empty($_GET['message'])){
        $html.="<p class='notice'>输入'kobe'试试-_-</p>";
    }else{
        if($_GET['message']=='kobe'){
            $html.="<p class='notice'>愿你和{$_GET['message']}一样,永远年轻,永远热血沸腾!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
        }else{
            $html.="<p class='notice'>who is {$_GET['message']},i don't care!</p>";
        }
    }
}



?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">反射型xss(get)</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="管tmd什么xss,首先你应该输入kobe看一下再说">
                点一下提示~
            </a>

        </div>
        <div class="page-content">



            <div id="xssr_main">
                <p class="xssr_title">Which NBA player do you like?</p>
                <form method="get">
                    <input class="xssr_in" type="text" maxlength="20" name="message" />
                    <input class="xssr_submit" type="submit" name="submit" value="submit" />
                </form>
                <?php echo $html;?>
            </div>

<!-- 省略 -->

?>

基本处理逻辑:

  1. message接收input输入框中内容
  2. 点击sumit提交给当前php处理
  3. 如果通过get方式提交的message为空,$html赋值字符串,在表单下方显示
  4. 如果不为空把message内容拼接在字符串内,显示在表单下方

后端php把输入框输入的内容不做任何处理,返回前端,浏览器解析返回值,如果为js代码会执行相应的逻辑。

3 存储型xss

3.1 概述

存储型跨站脚本攻击(Stored XSS)是一种常见的Web安全漏洞类型,与反射型XSS攻击相比,存储型XSS攻击将恶意脚本永久地存储在目标服务器上,然后在其他用户访问受影响页面时执行。

攻击过程如下:

  1. 注入恶意脚本:攻击者将恶意脚本注入到目标应用程序中,通常是通过输入字段、评论框、消息等用户可输入内容的地方。这些恶意脚本会被存储在应用程序的数据库或其他数据存储中。
  2. 存储恶意脚本:应用程序将恶意脚本永久地存储在服务器上。
  3. 用户访问受影响页面:其他用户访问受影响页面,例如查看评论、浏览消息等。
  4. 服务器返回恶意脚本:当用户请求受影响页面时,服务器将存储的恶意脚本包含在响应中。
  5. 浏览器执行恶意脚本:用户的浏览器接收到响应后,解析并执行恶意脚本。这可能导致攻击者在受害者的上下文中执行任意代码,从而可能窃取敏感信息、会话劫持等。

要防止存储型XSS攻击,可以采取以下措施:

  • 输入验证和过滤:在服务器端对输入数据进行验证和过滤,确保输入数据不包含恶意脚本。验证数据是否符合预期的格式和范围。
  • 输出编码:在将用户生成的内容呈现在网页上之前,确保对其进行适当的编码,以防止恶意脚本的执行。使用适合上下文的编码函数。
  • 限制脚本执行:使用内容安全策略(CSP)来限制允许在网页上运行的脚本源,从而减轻存储型XSS攻击的影响。
  • 输入限制和白名单:限制用户输入的内容,使用白名单来定义允许的HTML标签和属性,阻止不安全的内容进入数据库。
  • 定期安全审计和渗透测试:定期审查应用程序代码,寻找潜在的存储型XSS漏洞。进行渗透测试,发现并解决可能被忽视的漏洞。
  • 教育用户:教育用户识别和避免点击可疑链接,提高他们对网络安全的意识。

通过采取这些措施,可以降低存储型XSS攻击的风险,确保Web应用程序和用户的安全。

3.2 靶场-存储型xss

如下图3.2-1操作

在这里插入图片描述

步骤:

  1. 在留言板输入框中输入js代码,点击submit
  2. 相应的内容显示留言列表中,当我们点击留言,浏览器解析执行js代码

我们查看下xss_stored.php源代码:

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


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_stored.php"){
    $ACTIVE = array('','','','','','','','active open','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

include_once $PIKA_ROOT_DIR."inc/config.inc.php";
include_once $PIKA_ROOT_DIR."inc/mysql.inc.php";


$link=connect();
$html='';
if(array_key_exists("message",$_POST) && $_POST['message']!=null){
    $message=escape($link, $_POST['message']);
    $query="insert into message(content,time) values('$message',now())";
    $result=execute($link, $query);
    if(mysqli_affected_rows($link)!=1){
        $html.="<p>数据库出现异常,提交失败!</p>";
    }
}


if(array_key_exists('id', $_GET) && is_numeric($_GET['id'])){

    //彩蛋:虽然这是个存储型xss的页面,但这里有个delete的sql注入
    $query="delete from message where id={$_GET['id']}";
    $result=execute($link, $query);
    if(mysqli_affected_rows($link)==1){
        echo "<script type='text/javascript'>document.location.href='xss_stored.php'</script>";
    }else{
        $html.="<p id='op_notice'>删除失败,请重试并检查数据库是否还好!</p>";

    }

}


?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php">xss</a>
                </li>
                <li class="active">存储型xss</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="无用提示:这个留言板的框框是可以拉长和拉宽的,还行不,大兄弟!">
                点一下提示~
            </a>

        </div>
        <div class="page-content">

            <div id="xsss_main">
                <p class="xsss_title">我是一个留言板:</p>
                <form method="post">
                    <textarea class="xsss_in" name="message"></textarea><br />
                    <input class="xsss_submit" type="submit" name="submit" value="submit" />
                </form>
                <div id="show_message">
                    <br />
                    <br />
                    <p class="line">留言列表:</p>
                    <?php echo $html;
                    $query="select * from message";
                    $result=execute($link, $query);
                    while($data=mysqli_fetch_assoc($result)){
                        echo "<p class='con'>{$data['content']}</p><a href='xss_stored.php?id={$data['id']}'>删除</a>";
                    }

                    echo $html;
                    ?>



                </div>
            </div>



        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>

源码解析:

  1. 输入框输入内容,点击submit
  2. php接收内容,存入数据库表message中
  3. php查询message表,把留言记录显示在输入框下方

看下数据库表message存储内容,如下图所示

在这里插入图片描述

4 DOM型xss

4.1 概述

DOM-based XSS(DOM XSS)是一种特殊类型的跨站脚本攻击,与存储型和反射型XSS略有不同。DOM XSS攻击是基于浏览器的,它利用网页的DOM(Document Object Model)结构中的漏洞来执行恶意脚本。

攻击过程如下:

  1. 构造恶意输入:攻击者通过在URL参数、输入字段或其他可控制的地方输入恶意数据。
  2. 网页加载和解析:受害者浏览器加载和解析带有恶意输入的网页。恶意输入可能会被浏览器解释为脚本。
  3. DOM修改:恶意输入触发了网页中的脚本,该脚本修改了网页的DOM结构。
  4. 恶意脚本执行:由于DOM结构的修改,恶意脚本被插入并执行在受害者的浏览器上下文中。

与传统的XSS攻击不同,DOM XSS攻击并不总是涉及将恶意脚本从服务器传递到浏览器。相反,攻击是在浏览器内部发生的,因为恶意脚本是通过修改DOM而不是服务器响应来触发的。这使得防御和检测变得更加复杂。

要防止DOM XSS攻击,可以采取以下措施:

  • 输入验证和过滤:仍然需要在服务器端对输入数据进行验证和过滤,以防止恶意数据进入应用程序。
  • 输出编码:确保在将用户输入显示在页面上之前对其进行适当的编码,以防止脚本注入。
  • 避免直接操作DOM:避免通过字符串拼接等方式直接操作DOM,因为这可能会导致不当的脚本插入。
  • 使用安全的API:使用安全的DOM操作API来动态修改网页内容,以避免不受控制的脚本插入。
  • 安全库和框架:使用已验证和被广泛接受的安全库和框架来处理用户输入和输出,以减少XSS风险。
  • 教育用户:教育用户识别和避免点击可疑链接,提高他们对网络安全的意识。

由于DOM XSS攻击的特殊性质,防御措施可能需要更多的专业知识和技术。对于开发人员来说,了解DOM操作的安全最佳实践以及相关的Web安全原则至关重要。

4.2 靶场-DOM型xss

直接查看源代码,如下所示:

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


$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);

if ($SELF_PAGE = "xss_dom.php"){
    $ACTIVE = array('','','','','','','','active open','','','','','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}

$PIKA_ROOT_DIR =  "../../";
include_once $PIKA_ROOT_DIR.'header.php';

include_once $PIKA_ROOT_DIR."inc/config.inc.php";
include_once $PIKA_ROOT_DIR."inc/mysql.inc.php";


if(isset($_GET['text'])){
    $haha = "这里是后台的处理逻辑";
}

?>

<div class="main-content">
    <div class="main-content-inner">
        <div class="breadcrumbs ace-save-state" id="breadcrumbs">
            <ul class="breadcrumb">
                <li>
                    <i class="ace-icon fa fa-home home-icon"></i>
                    <a href="xss.php" target="_blank" rel="external nofollow" >xss</a>
                </li>
                <li class="active">DOM型xss</li>
            </ul><!-- /.breadcrumb -->

            <a href="#" target="_blank" rel="external nofollow"  style="float:right" data-container="body" data-toggle="popover" data-placement="bottom" title="tips(再点一下关闭)"
               data-content="先到这里把什么是dom搞明白了在说http://www.w3school.com.cn/htmldom/">
                点一下提示~
            </a>

        </div>
        <div class="page-content">

            <div id="xssd_main">
                <script>
                    function domxss(){
                        var str = document.getElementById("text").value;
                        document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
                    }
                    //试试:'><img src="#" onmouseover="alert('xss')">
                    //试试:' onclick="alert('xss')">,闭合掉就行
                </script>
                <!--<a href="" target="_blank" rel="external nofollow"  onclick=('xss')>-->
                <input id="text" name="text" type="text"  value="" />
                <input id="button" type="button" value="click me!" onclick="domxss()" />
                <div id="dom"></div>
            </div>


        </div><!-- /.page-content -->
    </div>
</div><!-- /.main-content -->





<?php
include_once $PIKA_ROOT_DIR.'footer.php';
?>

处理逻辑:

  1. 把我们输入的内容直接放在了a标签的href属性中

利用方式

  1. 闭合href属性或者a标签,后接js代码就可以
  2. 代码处理直接在前端操作DOM,由浏览器解析执行

5 问题总结

6.1 再次启动pikachu容器报错

报错提示如下

┌──(root💀kali)-[~]
└─# docker container start pikachu
Error response from daemon: driver failed programming external connectivity on endpoint pikachu (3b21e12093978ba2477a22cd872ee2074e50854990788188dd79636fc42734c0):  (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 3306 -j ACCEPT: iptables: No chain/target/match by that name.
 (exit status 1))
Error: failed to start containers: pikachu

  • 参考stackoverflow 解决方法
  1. 第一步 Clear all chains
sudo iptables -t filter -F
sudo iptables -t filter -X
  1. 第二步,重启docker服务
systemctl restart docker

结语

❓QQ:806797785

⭐️文档笔记地址:https://gitee.com/gaogzhen/math

参考:

[1]2021Kali系列 – Kali安装与配置[CP/OL].

[2]Kali Linux安装及基本配置[CP/OL].

[3]phpstudy-linux面板(小皮面板)[CP/OL].

[4]安全漏洞靶场docker安装系列-pikachu[CP/OL].

[5]centos7安装docker并搭建DVWA靶场和Pikachu靶场[CP/OL].