開山-web安全基礎(1)常見web漏洞解析

歡迎來到theFlyer的博客—希望你有不一樣的感悟

前言:第一次使用markdown,文章裏面可能有各種嘗試,看官見諒。web安全基礎需要各位看官有一定html/js/php等基礎知識(我也是萌新),知識多而雜,需要多看多動手。

目錄

XSS

全稱:Cross Site Script
中文名稱:跨站腳本
危害:盜取用戶信息、釣魚、製造蠕蟲等
概念:黑客通過“HTML注入”篡改網頁,插入了惡意腳本,當用戶在瀏覽網頁時,實現控制用戶瀏覽器行爲的一種攻擊方式。

xss三種類型

XSS類型		  存儲型				反射型             DOM型

觸發過程   1.黑客構造XSS腳本	  正常用戶訪問攜帶	  	 正常用戶訪問攜帶
		  2.正常用戶訪問攜帶   XSS腳本的URL(參數)     XSS腳本的URL(哈希) 
	        XSS腳本的頁面
數據存儲	     數據庫			   URL				    URL
誰來輸出	  後端WEB應用程序		後端WEB應用程序	     前端JavaScipt
輸出位置	   HTTP響應中		   HTTP響應中       	 動態構造的DOM節點
 
DOM型:   用戶訪問應用  瀏覽器通過js解析URL內容輸出到DOM中  觸發XSS
個人理解(歡迎指正):主要利用閉合標籤,閉合正常標籤,並加入惡意代碼
                  或添加構造惡意代碼。
"></a><script>alert("xss")</script>來先閉合掉a標籤。然後再用script來運行js代碼
onclick="alert(1)";>123</a>//點擊123觸發onclick來運行js,然後把後面的內容來註釋掉

前人已經對XSS有了比較深入的總結
鏈接:XSS的原理分析與解剖                          XSS的原理分析與解剖二
防禦xss

原則1:不要在頁面中插入任何不可信數據,除非這些數已經據根據下面幾個原則進行了編碼
原則2:在將不可信數據插入到HTML標籤之間時,對這些數據進行HTML Entity編碼
原則3:在將不可信數據插入到HTML屬性裏時,對這些數據進行HTML屬性編碼

想知道如何防必然對攻要有深刻理解,有時間拜讀此文防禦XSS的七條原則

CSFR

全稱:Cross-site request forgery
中文名稱:跨站請求僞造
危害:執行惡意操作(被轉賬,被髮垃圾評論等)、製造蠕蟲...
概念:利用用戶已登錄的身份,在用戶毫不知情的情況下,以用戶的名義完成非法操作

CSRF攻擊攻擊原理及過程如下:

1.用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登錄網站A;
2.在用戶信息通過驗證後,網站A產生Cookie信息並返回給瀏覽器,此時用戶登錄網站A成功,可以正常發送請求到網站A;
3.用戶未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;
4.網站B接收到用戶請求後,返回一些攻擊性代碼,併發出一個請求要求訪問第三方站點A;
5.瀏覽器在接收到這些攻擊性代碼後,根據網站B的請求,在用戶不知情的情況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求其實是由B發起的,所以會根據用戶C的Cookie信息以C的權限處理該請求,導致來自網站B的惡意代碼被執行。

從上圖可以看出,要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:

1.登錄受信任網站A,並在本地生成Cookie。
2.在不登出A的情況下,訪問危險網站B。

看到這裏,你也許會說:“如果我不滿足以上兩個條件中的一個,我就不會受到CSRF的攻擊”。是的,確實如此,但你不能保證以下情況不會發生:
1.你不能保證你登錄了一個網站後,不再打開一個tab頁面並訪問另外的網站。
2.你不能保證你關閉瀏覽器了後,你本地的Cookie立刻過期,你上次的會話已經結束。(事實上,關閉瀏覽器不能結束一個會話,但大多數人都會錯誤的認爲關閉瀏覽器就等於退出登錄/結束會話了)
3.打開的第三方網站,可能是一個存在其他漏洞的可信任的經常被人訪問的網站。

CSRF 攻擊的應對之道

1.驗證 HTTP Referer 字段
2.在請求地址中添加 token 並驗證
3.在 HTTP 頭中自定義屬性並驗證
文章鏈接如下CSRF 攻擊的應對之道
4.服務端的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶端頁面增加僞隨機數
淺談CSRF攻擊方式

點擊劫持

全稱:Click Jacking
中文名稱:點擊劫持
危害:點擊覆蓋不可見的框架,造成各種精心設計的風險如何刪除、點贊、下載、轉賬等
概念:它是通過覆蓋不可見的框架誤導受害者點擊。雖然受害者點擊的是他所看到的網頁
,<iframe>標籤的透明屬性。

點擊劫持其實是一種視覺上的欺騙手段,攻擊者將一個透明的、不可見的iframe覆蓋在一個網頁上,通過調整iframe頁面位置,誘使用戶在頁面上進行操作,在不知情的情況下用戶的點擊恰好是點擊在iframe頁面的一些功能按鈕上。例:

Flash點擊劫持
點擊劫持與CSRF攻擊有異曲同工之妙,他們都是在用戶不知情的情況下誘使用戶完成一些動作。CSRF在攻擊過程中如果出現與用戶交互的頁面,則攻擊有可能無法完成。而點擊劫持恰恰是利用與用戶交互而完成的攻擊,因此在Flash中這類點擊劫持現象更爲嚴重。攻擊者利用簡單的Flash小遊戲誘使用戶點擊,經過一系列點擊後達到控制用戶電腦的目的。

推薦文章鏈接小漏洞大危害淺析點擊劫持攻擊點擊劫持

URL跳轉

尤其當網址變成短鏈接,就更具有迷惑性了
定義:藉助未驗證的URL跳轉,將應用程序引導到不安全的第三方區域從而導致安全問題。

跳轉實現

1.Header頭跳轉
$url = $_REQUEST["url"];  獲取用戶請求鏈接
header("Location: $url");  跳轉到鏈接地址
2.Javascript跳轉
var site = getQueryString("site"); js腳本獲取用戶請求鏈接
window.location.href=site;  跳轉到鏈接地址
3.META標籤跳轉
$url = $_REQUEST["url"];  獲取用戶請求鏈接
<meta http-equiv="Refresh" content="5; url=<?php echo $url?>" />   5秒後跳轉到鏈接地址

推薦文章鏈接URL重定向/跳轉漏洞解釋說明及修復方案前端一波騷操作

SQL注入

SQL Injection 服務端漏洞
是一種常見的Web安全漏洞,攻擊者利用這個漏洞,可以訪問或修改數據,
或者利用潛在的數據庫漏洞進行攻擊。

正常登錄的流程

POST請求登錄,把用戶名和密碼交給服務器,服務器通過PHP代碼實現獲取到瀏覽器POST的用戶名和密碼,會經過一次MD5處理,服務器會把用戶名和密碼經過MD5處理後的密碼拼接到要執行的SQL語句中。

1.POST請求登錄,
2.獲取請求參數,
3.參數帶入代碼,
4.執行查詢,
5.驗證查詢結果,
6.根據返回結果判斷是否登錄成功
$username = $_POST['username']; 
$password = MD5($_POST['password']); 

SQL注入過程

1.獲取用戶參數
2.拼接到代碼當中
3.SQL語句按照我們構造參數的語義執行成功
admin' --     註釋-- (雙橫槓空格)代表註釋符     ‘爲了閉合前面單引號
查詢數據庫中是否有admin用戶,用戶存在時返回結果根本沒有驗證密碼
$check_query = mysql_query("select id from teacher where name='admin' --  and passwd='$password' limit 1"); 
利用腳本
username = admin' and 1=2 union select version()
username = admin' and 1=2 union select user()

SQL必備條件

1.可以控制輸入的數據
2.服務器要執行的代碼拼接了控制的數據

SQL注入的本質

數據和代碼未分離即數據當作了代碼來執行

SQL注入的危害

1.獲取數據庫信息
2.管理員後臺用戶名和密碼
3.獲取其他數據庫敏感信息:用戶名、密碼、手機號碼、身份證、銀行卡信息......
4.獲取服務器權限
5.植入Webshell,獲取服務器後門
6.讀取服務器敏感文件
7.萬能密碼

推薦文章鏈接認識SQL注入的類型手工注入語句大全

命令注入

應用有時需要調用一些執行系統命令的函數,如PHP中的system、exec、shell_exec、
passthru、popen、proc_popen等,當用戶能控制這些函數中的參數時,就可以將惡意系統命令
拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。

攻擊過程

黑客-> 構造命令-> web應用程序-> 拼接命令並執行注入命令-> 並把結果返回到頁面

WEB應用如何命令注入

  命令注入條件:
1.調用可執行系統命令的函數
2.函數或函數的參數可控
3.拼接注入命令

舉例

1.下面代碼無法執行其他命令,不滿足上面命令注入的第二個條件,函數或其參數可控
<?php
		if (isset($_GET['type'])) {
			$type = $_GET['type'];   ---從參數中獲取type值
		} else {
			$type = 1;
		}
		switch($type){
			case 1:
				exec('ipconfig', $output, $status);   ---type爲1執行ipconfig命令
				break;
			case 2:
				exec('net user', $output, $status);  ---爲2執行net user命令
				break;
			case 3:
				exec('dir', $output, $status);		---爲33執行dir命令
				break;		
		}
		
		foreach($output as $value){  ---輸出命令執行結果
			// 編碼轉換
			echo(mb_convert_encoding($value, "UTF-8", "GB2312"));
			echo("<br />");
		}
	?>
2.參數可控,可以拼接
	<?php
		if (isset($_GET['url'])) {
			$url = $_GET['url'];  ---從參數中獲取url
		} else {
			$url = "http://www.theFlyer.com";
		}
		//調用curl命令,獲取url的響應頭。請求url的網址並返回它的url響應頭
		$cmd = 'curl -I "'. $url . '"';  
		//***拼接curl命令 (curl參數可控,這有個分隔符 "",是爲了將url包住同時也起到了分隔curl命令
		//和數據的作用)可以通過追加 "閉合前面的curl命令,後面用&追加我們想要的命令。
		//注意dir"./ 後面不能在加"因爲php在拼接時會補上這個雙引號						
		//http://www.theFlyer.com" & dir"./						
		//最後拼接代碼如下  curl -I "http://www.theFlyer.com" & dir"./"						
								
		// 執行系統命令
		exec($cmd, $output, $status);   ---執行curl命令
		
		echo "<b>". htmlspecialchars($url) . "</b>"
			 . " 的響應頭如下:<br /><br />";
			 
		// 輸出命令執行結果
		foreach($output as $value){  ---輸出命令結果
			echo htmlspecialchars($value);
			echo "<br/>";
		}
	?>

推薦文章鏈接 命令執行

文件操作漏洞

常見文件操作漏洞:

1.文件上傳漏洞
2.任意文件下載
3.文件包含漏洞

利用文件操作漏洞:

1.文件上傳
	1.1上傳Webshell
	1.2上傳木馬
	...
2.文件下載
	2.1下載系統任意文件
	2.2下載程序代碼
	...

文件操作漏洞原因:

文件處理不當
1.可以上傳可執行腳本
2.腳本擁有執行權限

推薦文章鏈接 文件上傳漏洞及解析任意文件查看與下載漏洞

後記

紙上得來終覺淺,實踐出真知,我也需要多動手,望君亦如此。第一篇算是偏技術文貼,要發了,
但沒剛寫那麼激動,我會繼續寫的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章