网络攻防技术——XSS攻击

发布时间 2023-12-28 16:29:39作者: Leo1017

实验7:XSS攻击实验(Elgg)

实验内容:

跨站点脚本(XSS)是一种常见于web应用程序中的计算机安全漏洞。此漏洞使攻击者有可能将恶意代码(如JavaScripts)注入受害者的web浏览器。

为了演示攻击者可以做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的web应用程序。我们已经注释掉了Elgg的一些保护方法,故意使其容易受到XSS攻击。学生们需要利用这些漏洞发动攻击,就像Samy Kamkar在2005年通过臭名昭著的Samy蠕虫对MySpace所做的那样。此攻击的最终目标是在用户之间传播XSS蠕虫,这样无论谁查看受感染的用户配置文件都会受到感染,无论谁受感染都会将您(即攻击者)添加到他/她的好友列表中。

实验报告:

需要提交一份详细的实验报告和截图,来描述做了什么和观察到了什么。还需要对观察结果进行解释。还请列出重要的代码片段,然后进行解释。仅附加代码而不作任何解释将不得分。

评分要点:

 

 

  1. 主页的文本会直接放入前端DOM树中,直接在攻击者主页中输入script标签即可在被攻击者的浏览器上执行js脚本

当别的用户浏览攻击者的主页时,JS 程序会被成功执行

如果要注入很长的js代码,可以使用链接的方式

  1. 这里是用js代码获取用户的cookie,和任务1一样,直接alert弹出

    `document.cookie`获取用户的cookie

    成功弹出cookie

  2. 任务二中回显的cookie并不能让攻击者看到,所以攻击者有两种思路,一种是直接在要执行的js代码中建立一个socket连接,在套接字中把cookie发送到攻击者主机,攻击者使用nc进行监听,这种方法的好处是可以使用这种方法在socket连接中调用/bin/sh,攻击者直接拿到了shell;第二种思路是在img标签中加上src属性,属性值设置成攻击者主机,浏览器会试图访问src的链接以获取图像,从而让被攻击者访问攻击者主机,并将cookie作为url参数传给攻击者,攻击者同样使用nc进行监听,本实验采用的是第二种方法

    攻击者的主机是100.9.0.9,监听端口5555

被攻击者访问攻击者主页,看似什么都没发生

而攻击者已经收到了cookie

cookie是用户的身份认证凭证,拿到cookie后,攻击者就相当于窃取了被攻击者的身份

这段代码使用XMLHttpRequest()构造了一个Ajax请求,用于异步地发出GET请求,在elgg框架下获取了ts和token信息

查看添加好友时的HTTP请求,发现会访问http://www.seed-server.com/action/friends/add这个API,携带的参数包括要添加的用户的id,elgg框架的时间戳(ts)和elgg框架的token(实际url携带了两份参数,但经过验证一份参数就能添加成功)

我们在js代码中写入一但主页被打开,就向该API发送添加朋友的请求的代码片段

获取samy的用户id为59

将完整的代码补充完成如下,URL为"http://www.seed-server.com/action/friends/add?friend=59"+ts+token

注意要放在 Edit HTML 模式中,该模式不会对用户的输入进行修改

登录其他用户的账号并访问攻击者页面,发现成功添加好友

使用Firefox开发者工具查看网络数据包情况,发现确实发起了添加朋友的GET请求

  1. ts是当前时间戳(time stamp),token是用户身份鉴别凭证,这两个信息可以用来防御跨站请求伪造(CSRF)攻击,在用户向服务器发出请求时,服务器会对ts和token进行校验,只有校验通过客户端的请求才有效。而在elgg框架下可以直接读取这两个值,攻击者相当于在用户的主机上直接执行了恶意代码,请求是由被攻击者发出的,并不是攻击者伪造的

  2. 如果继续采取之前的在Editor Mode下攻击的方法不会成功,因为它会在代码中添加各种标签并转义一些符号,比如把<变成&lt;但是我们可以找到其他的xss注入点,如"brief description"板块不会转义字符,或者我们可以使用一些xss的绕过方法,如编码绕过等方式

  1. 查看修改资料时的HTTP请求,发现会访问http://www.seed-server.com/action/profile/edit这个API,携带的参数包括要修改的用户的id和用户名,elgg框架的时间戳(ts)和elgg框架的token,这些参数都可以使用elgg框架直接获取

    我们在js代码中写入一但主页被打开,就向该API发送修改资料的请求的代码片段

    这里代码比较复杂,我使用了Firefox的开发者工具console进行了js代码的调试,发现粘贴pdf文件的特殊字符没有删掉

将完整的代码补充完成如下

被攻击者访问攻击者主页,发现自己的主页被成功修改

使用Firefox开发者工具查看网络数据包情况,发现确实发起了修改个人资料信息的POST请求

问题:脚本中为什么要判断当前user的guid不等于samy的guid?

         因为攻击者修改完自己的主页后会自动跳转回自己的主页,如果去掉这一行,攻击脚本会将攻击者的主页也进行修改,攻击脚本就被覆盖掉了,那么其他人再访问攻击者主页就不会被修改主页,导致攻击失败

  1. Task6的任务是实现一个可以传播的XSS攻击蠕虫,目前有两种实现方法:

    1. 将脚本放在远端,在主页放入带src属性的img标签,这种方法简单,实现代码短

    2.将xss蠕虫脚本直接放在主页,使用DOMAPI从网页中检索其自身的副本,放入受害者的主页,实现起来相对比较复杂

    本实验采用第二种方法

js代码如下:

被攻击者访问攻击者主页后,自己的主页被修改

Xss蠕虫被成功回显出来

现在另一名用户Alice访问Boby的主页,发现自己的主页也被感染,说明xss蠕虫扩散成功

  1. 注: 在CSP中,nonce是一个用于增强网页安全性的属性,nonce是一个随机生成的字符串,用于验证特定资源加载的合法性。通过将 nonce 添加到网页的CSP头部中,网页可以指定哪些资源可以被加载和执行。只有具有匹配 nonce 的脚本、样式表等资源才会被浏览器接受和执行,而其他来源的资源将被浏览器阻止

    CSP是白名单策略,在网页中执行js代码有两种方式,第一种内联式是把代码直接放在当前的网页中,第二种链接式是把代码放在当前站点或其他站点的文件中,然后把它们引用到当前网页

    打开index.html,分析下面的七个标签:

    第一个标签采用内联的js代码执行方式,有一个nonce值为111-111-111

    第二个标签采用内联的js代码执行方式,有一个nonce值为222-222-222

    第三个标签采用内联的js代码执行方式,没有nonce值

    第四个标签采用链接的js代码执行方式,是从本站目录下链接到js文件

    第五个标签采用链接的js代码执行方式,是从www.example60.com网站的目录下链接到js文件

    第六个标签采用链接的js代码执行方式,是从www.example70.com网站的目录下链接到js文件

    第七个标签采用内联的js代码执行方式,没有放入script标签中,本质和第一、二个标签一样,应该是为了防止DOM XSS

    1. js代码被全部执行,弹窗有效,因为没有开启CSP保护策略,对js代码的来源没有限制,所以都能被执行

       

    2. js代码只有第六个被执行,弹窗没有反应

      观察配置文件发现,开启了CSP保护策略,并且只允许自身站点和example70.com站点的js文件可以被加载并执行,而且对于内联式js代码没有验证nonce值,所以所有内联js代码均不会被加载和执行

      要求我们将第五个标签的js代码也能执行,于是将example60.com站点也加入到CSP白名单

      发现第五个标签成功执行

    3. js代码只有第1、4、6个被执行,弹窗没有反应

      观察配置文件发现,该网站的入口点不是访问index.html,而是phpindex.php,于是去查看该php文件,发现开启了CSP保护策略,对于链接式js代码只允许自身站点和example70.com站点的js文件可以被加载并执行,所以第4、6个标签可以执行对于内联式js代码验证nonce值是否为111-111-111,所以第1个标签可以执行

      要求我们让第2、5个标签也可以执行,于是将example60.com站点和nonce验证值222-222-222也放入白名单中

      发现第1、2、4、5、6个标签都可以执行

  2. 总结

    1. 漏洞概念:Cross Site Scripting(XSS),跨站脚本攻击。

    2. 漏洞原理:攻击者提供一段恶意的 javascript 代码,通过各种方式在受害者浏览器上执行。

    3. 漏洞危害:

    1. 窃取 cookie,伪造被攻击者的身份

    2. 制造网站蠕虫,在互联网上传播并级联执行恶意的脚本代码

    3. 钓鱼

    4. 修复思路:

    1. 在 http 响应头的set-cookie的值中加入 http-only 的内容;

    2. 对输入的内容进行检查、提示,或者转义(html 实体化编码实现)(不推荐)

    3. 对于富文本需求来说,采用成熟的前端编辑器。

    4. 使用CSP白名单策略让输入内容合规(推荐)

    5.总结:

    XSS 攻击的方式多种多样,包括反射型 XSS、存储型 XSS、DOM 型XSS等多个方面。预防 XSS 漏洞的关键在于输入验证和输出过滤。在编写应用程序时,一定要注意对用户输入进行验证和过滤,不要将用户输入直接输出到 HTML 页面中。