概念:惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執(zhí)行,從而達到惡意用戶的特殊目的。
危害:
- 盜取用戶COOKIE信息。
- 跳轉(zhuǎn)到釣魚網(wǎng)站。
- 操作受害者的瀏覽器,查看受害者網(wǎng)頁瀏覽信息等。
- 蠕蟲攻擊。
描述:反射型跨站。GET或POST內(nèi)容未過濾,可以提交JS以及HTML等惡意代碼。
代碼:
- <?php echo $_GET['msg']; ?>
- //正常URL
- user.php?msg=henhao
- //帶JS的URL
- user.php?msg=<script>alert(1)</script>
- //惡意跳轉(zhuǎn)URL
- user.php?msg=<script>window.history.back(-1);</script>
解決方法:輸出過濾,php端輸出到view的模板頁面上的數(shù)據(jù)都需要經(jīng)過過濾:
- //輸出過濾HTML JS標簽
- $var = str_replace(array('<iframe','<meta','<script'), '', $var); $var = str_replace(array('..',')','<','='), array('..',')','<','='), $var);
- $var = addslashes($var);
概念:CSRF跨站請求偽造,也被稱成為“one click attack”或者session riding,通常縮寫為CSRF或者XSRF,是一種對網(wǎng)站的惡意利用。XSS利用站點內(nèi)的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網(wǎng)站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。
危害:強迫受害者的瀏覽器向一個易受攻擊的Web應(yīng)用程序發(fā)送請求,最后達到攻擊者所需要的操作行為。
例子:
- <img src=“http://a.com/addfriend.php?id=123”/>
1. 上面是一個圖片的html標簽,但是src中是一個添加id為123好友的新增好友鏈接。
2. 惡意用戶可以將這段代碼植入其它網(wǎng)站網(wǎng)頁上面,甚至可以img設(shè)置為0,0,讓用戶不知不覺中點擊這個鏈接,達到用戶并不像加這個人好友,但是添加的目的。
3. 當很多人都無意加了id為123這個人為好友的時候,id為123的惡意用戶就有權(quán)限來查看這些人的信息,甚至可以發(fā)送很多惡意的信息,達到惡意用戶的目的。
解決方法:
1. http://a.com/addfriend.php?id=123 使用POST方法會相對安全一點。
2. 采用類似隨即碼或者令牌的形式,讓用戶操作唯一性。 (每次用戶登錄網(wǎng)站隨機生成一個token,存放在cookie中,用戶的所有操作中都需要經(jīng)過token驗證)
例子:
- http://images.sohu.com/bill/s2010/liulin/nokia/1602600902.swf?clickthru=javascript:alert(1)
解決方法:在網(wǎng)站根目錄中,添加crossdomain.xml文件,這個文件主要是控制flash的域訪問。
淘寶的:http://www.taobao.com/crossdomain.xml
- <?xml version="1.0" ?>
- <cross-domain-policy>
- <allow-access-from domain="*.taobao.com" />
- <allow-access-from domain="*.taobao.net" />
- <allow-access-from domain="*.taobaocdn.com" />
- <allow-access-from domain="*.tbcdn.cn" />
- <allow-access-from domain="*.allyes.com" />
- </cross-domain-policy>
概念:所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務(wù)器執(zhí)行惡意的SQL命令。
危害:
1. 查詢數(shù)據(jù)庫中敏感信息。
2. 繞過認證。
3. 添加、刪除、修改服務(wù)器數(shù)據(jù)。
4. 拒絕服務(wù)。?id=(BENCHMARK(100000000, MD5(RAND()));
例子:
- $sql = "SELECT name FROM users WHERE id = '". $_GET['id'] . "'";
當ID值為:1’ or 1=’1 SQL語句(已測試可以注入):
- SELECT name FROM users WHERE id = ‘1’ or 1=’1 ‘
說明:1=1的時候,條件語句WHEREOR之前的不起作用。 ‘的作用是組裝SQL語句。
解決方法:
SQL組裝的時候,對外部變量以及所有變量都進行過濾:
PHPWIND中,可以用sqlEscape、sqlImplode、sqlSingle、sqlMulti等函數(shù)過濾組裝。過濾主要是一些’單引號這些可以破壞SQL組裝的數(shù)據(jù)。
- /**
- * SQL組裝-私有SQL過濾
- * @param string $val 過濾的值
- * @param int $iskey 0-過濾value值,1-過濾字段
- * @return string
- */
- private function build_escape_single($val, $iskey = 0) {
- if ($iskey === 0) {
- if (is_numeric($val)) {
- return " '" . $val . "' ";
- } else {
- return " '" . addslashes(stripslashes($val)) . "' ";
- }
- } else {
- $val = str_replace(array('`', ' '), '', $val);
- return ' `'.addslashes(stripslashes($val)).'` ';
- }
- }
概念:和SQL注入原理一樣,XML是存儲數(shù)據(jù)的地方,如果在查詢或修改時,如果沒有做轉(zhuǎn)義,直接輸入或輸出數(shù)據(jù),都將導致XML注入漏洞。攻擊者可以修改XML數(shù)據(jù)格式,增加新的XML節(jié)點,對數(shù)據(jù)處理流程產(chǎn)生影響。
危害:
1. 攻擊者可以新增XML節(jié)點
2. 破壞原來的XML結(jié)構(gòu),影響業(yè)務(wù)流程,甚至產(chǎn)生嚴重的錯誤。
例子:
- $xml = "<USER role=guest><name>“ . $_GET[‘name’] . "</name><email>“ . $_GET[‘email’] . "</email></USER>";
需要得到的XML結(jié)構(gòu):
- <?xml version="1.0" encoding="UTF-8"?>
- <USER role=guest>
- <name>user1</name>
- <email>user1@a.com</email>
- </USER>
惡意代碼:
- user1@a.com</email></USER><USER role=admin><name>test</name><email>user2@a.com
意外的XML文檔:
- <?xml version="1.0" encoding="UTF-8"?>
- <USER role=guest>
- <name>user1</name>
- <email>user1@a.com</email>
- </USER>
- <USER role=admin>
- <name>test</name>
- <email>user2@a.com</email>
- </USER>
解決方法:
1. 對php處理XML文檔的時候,進行標簽過濾
2. 盡量減少直接被外部訪問到xml文檔,可以采用文件名用散列方法等。
概念:Web應(yīng)用程序接收到用戶提交的URL參數(shù)后,沒有對參數(shù)做”可信任URL”的驗證,就向用戶瀏覽器返回跳轉(zhuǎn)到該URL的指令。
危害:釣魚網(wǎng)站
例子:
http://m.yahoo.cn/log.php?c=web&u=http://www.163.com
解決方法:
對跳轉(zhuǎn)的php函數(shù)進行進一步優(yōu)化,使頁面跳轉(zhuǎn)可以在可信任的范圍內(nèi)。 例如可以有跳轉(zhuǎn)域名白名單方法,這個訪問各大公司使用比較多
概念:對文件目錄參數(shù)沒有進行過濾,導致惡意用戶可以通過在參數(shù)中輸入一些執(zhí)行命令,或者跨越訪問的行為,來超出用戶的訪問權(quán)限。
例子:通過一個或多個../跨越目錄限制
- $fp = fopen("image/{$_GET['filename']}", 'r');
Getfile?filename=../../../../etc/passwd
解決方法:
1. 對文本操作的時候一定要謹慎,不可信任
2. 嚴格使用phpwind中安全類庫 escapePath函數(shù)
概念:用戶提交的參數(shù)用于執(zhí)行系統(tǒng)命令的參數(shù)。
解決:
1. 謹慎使用系統(tǒng)命令,對使用系統(tǒng)命令的地方需要進行安全評審
2. 對命令語句進行嚴格過濾
概念:Web應(yīng)用程序在處理用戶上傳的文件時,沒有判斷文件的擴展名是否在允許的范圍內(nèi),或者沒檢測文件內(nèi)容的合法性,就把文件保存在服務(wù)器上,甚至上傳腳本木馬到web服務(wù)器上,直接控制web服務(wù)器。
情況:
1. 未限制擴展名
2. 未檢查文件內(nèi)容
3. 病毒文件
解決方法:
1. 使用安全的,可信任的上傳組件。
2. 檢查文件擴展名,保證文件的類型正確。
3. 檢查文件內(nèi)容,保證用戶不偽造文件類型。
任意文件下載漏洞
解決方法:
1. Apache虛擬目錄指向
2. Java/PHP讀取文件
權(quán)限控制漏洞
概念:屬于業(yè)務(wù)邏輯上的安全管理。
訪問控制:
1. 水平訪問:Web應(yīng)用程序接收到用戶請求,修改某條數(shù)據(jù)時,沒有判斷數(shù)據(jù)的所屬人,或判斷數(shù)據(jù)所屬人時,從用戶提交的request參數(shù)(用戶可控數(shù)據(jù))中,獲取了數(shù)據(jù)所屬人id,導致惡意攻擊者可以通過變換數(shù)據(jù)ID,或變換所屬人id,修改不屬于自己的數(shù)據(jù)。
2. 垂直訪問:由于web應(yīng)用程序沒有做權(quán)限控制,或僅僅在菜單上做了權(quán)限控制,導致的惡意用戶只要猜測其他管理頁面的URL,就可以訪問或控制其他角色擁有的數(shù)據(jù)或頁面,達到權(quán)限提升目的。
存在情況:
1. URL級別的。(例如論壇需要操作評分的時候,有一個提交的URL地址,該地址提交過去,如果不做權(quán)限判斷,那么惡意用戶就可以隨意的拿這個URL地址來進行惡意行為)
2. 菜單級別。(會員中心或者后臺管理中心,會有菜單,管理員可以看到多個功能,普通管理員只能看到一部分功能。但是如果你對管理員操作的功能區(qū)不做權(quán)限判斷,那么普通管理員只要猜測或者獲取管理區(qū)的URL,就可以進行管理員操作了)
危害:
1. 屬于業(yè)務(wù)邏輯的漏洞,這些危害性是巨大的,可以讓普通用戶就可能獲取管理員的權(quán)限,對網(wǎng)站進行惡意破壞或者做非法行為。
解決方案:
1. 項目先期,做一份詳細的權(quán)限規(guī)劃文檔。
2. 在開發(fā)中嚴格按照權(quán)限文檔的要求去做權(quán)限。
3. 后期測試需要覆蓋權(quán)限這一塊功能區(qū)。
4. 程序員需要經(jīng)常注意這些方面的要求。
解決:
cookie httponly flag : 在用到用戶名登陸密碼之類的安全性比較高的cookie的時候,可以在cookie中設(shè)置httponly屬性,該屬性只允許php等訪問cookie,而不允許js訪問。
cookie secure flag : 在涉及到https這樣的情況,需要對cookie加密傳輸,那么可以設(shè)置這個屬性
1. SESSION是保存在服務(wù)器端的,具有比COOKIE一定的安全性。
2. 使用COOKIE的時候,如果長時間沒有動作,可以設(shè)置一個時間值,來對COOKIE進行過期。
3. 盡量讓用戶每次的cookie值都是不同的,這樣可以保證cookie被盜取也不能長期使用的問題。