代碼審計基礎總結

查閱大量資料後,列出的常見代碼審計漏洞。php

代碼審計
===================================================================================================
*	sql注入
	**	變量未過濾致使
		***	http://www.test404.com/post-811.html
		-	$_SERVER變量未過濾,請求頭中X_FORWARDED_FOR,CLIENT_IP,HTTP_HOST,ACCEPT_LANGUAGE
		-	傳入的參數未強制轉爲int
		-	數組只過濾了value未過濾key,但key也會代入到sql中
		-	$_FILES變量未過濾( http://www.test404.com/post-815.html )

	**	過濾函數的誤用
		***	http://www.test404.com/post-809.html
			-	str_replace將單引號去掉了,結果轉義符反斜槓留下了,致使在sql語句中將真正的單引號轉義了
			-	在帶入sql語句前,stripslashes將轉義符去掉了
			-	多餘的urldecode,致使單引號的「二次編碼」%2527能夠繞過單引號過濾 ( http://www.test404.com/post-808.html )

	**	二次注入
		-	單引號被轉義後入庫或入文件,再次以該字段爲查詢條件時觸發
	
	**	寬字節注入
		-	gpc或addslash添加了轉義符%5c


*	命令注入
	-	popen
	-	proc_open
	-	exec
	-	system
	-	passthru
	-	反引號 


*	代碼注入
	**	pgrep_replace
	**	eval
	**	assert
	**	雙引號
		-	php -r '$a = "${${eval(phpinfo())}}";'
		-	php -r '$a = "${@eval(phpinfo())}";'
		-	php -r '$a = ${@eval("phpinfo();")};
		-	php -r '$a = ${${eval("phpinfo();")}};'


*	xss反射
	**	直接回顯	$_SERVER['HTTP_REFFER']
	**	$_SERVER['PHP_SELF']
	**	$_SERVER['HTTP_URI']
	**	$_SERVER['USER_AGENT']


*	xss存儲
	**	留言板未使用 htmlspecialchars 過濾


*	CSRF
	利用了網站對用戶的信任
	**	敏感表單未加token驗證
	**	防護
		-	不要採用get方式提交
		-	添加令牌驗證
		-	驗證請求來源,http_reffer,但可被繞過
		-	在http頭部添加自定義屬性來驗證


*	文件包含
	**	本地包含,受gpc影響
		-	技巧	%00截斷

	**	遠程包含,須要php.ini中 allow_url_include 與 allow_url_fopen 開啓
		-	技巧:追加 ? # 等字符

	**	僞協議	
		-	php://input,並post提交<?php phpinfo();?>, 須要allow_url_inlcude開啓且php>5.2.0
		-	php://filter/read=convert.base64-encode/resource=based64-php-code.txt, 無需什麼條件


*	動態函數執行與匿名函數執行
	**	動態函數:函數名以參數形式傳進來,直接跟括號獲得調用。
	**	匿名函數:相似lambda函數,但函數體在在定義時引入了外部字符串變量,使得能夠注入惡意代碼。


*	反序列化漏洞
	**	構造的序列化字符串在反序列化後會覆蓋類的成員變量。結合其餘代碼執行漏洞,獲得利用。


*	變量覆蓋漏洞
	**	若是自動註冊全局變量默認開啓,地址欄提交的參數會被定義成變量。
		-	變量未初始化時,會被覆蓋,可致使修改module之類的變量,致使文件包含漏洞;
	**	動態定義變量
		-	http://www.test404.com/post-815.html
		-	使用雙美圓符$$,動態定義變量時。
		-	危險函數extract,會從字典中動態提取鍵值對來定義變量

	

*	文件管理漏洞
	**	危險函數copy、unlink,存在時間競爭漏洞。
		-	http://www.test404.com/post-875.html
		-	上傳頭像-->生成臨時文件(tmp.php)-->不斷請求tmp.php(在上層目錄生成shell.php文件)-->刪除當前目錄下tmp.php等非jpg文件,但留下了上層目錄下的shell.php文件-->成功!


*	上傳漏洞
	**	危險函數:好比getimagesize,若是文件頭部以GIF89a開頭,那麼該文件就被判斷爲圖片文件。
		-	參見	http://www.test404.com/post-875.html
	**	未受權引用:好比直接訪問上傳接口


*	驗證碼漏洞
	**	抓包構造sid,發送空驗證碼,可繞過條件判斷
		-	不經過頁面訪問時,沒生成驗證碼,弱類型比較時NULL==''爲真
	**	第一次經過頁面刷新獲取驗證碼,後續抓包反覆提交該驗證碼
		-	不管驗證碼是否輸入正確與否,後臺都應該從新生成驗證碼


* php中的奇怪現象
	**	弱類型比較時存在繞過判斷條件的漏洞
	***	傳遞的參數爲數組時,函數通常返回爲NULL。
		-	?goods[]=92%004&goods[]=967&goods[]=993
			$_GET: array(1) { ["goods"]=> array(3) { [0]=> string(4) "924" [1]=> string(3) "967" [2]=> string(3) "993" } } 

			$_GET["goods"]: array(3) { [0]=> string(4) "924" [1]=> string(3) "967" [2]=> string(3) "993" } 
			ereg('123', '456'): bool(false) 
			ereg("^[0-9a-zA-Z]+$", $_GET["goods"]): NULL 
			ereg("^[0-9a-zA-Z]+$", $_GET["goods"])!==False: bool(true) 
			ereg("^[0-9a-zA-Z]+$", $_GET["goods"])!=False: bool(false) 
			$_GET["goods"]>9999999: bool(true) 
			strcmp($_GET["goods"], "123123"): NULL 
			strcmp($_GET["goods"], "123123")==0: bool(true)
		
	***	弱類型的比較
		-	var_dump("1e8">999): bool(true) 
		-	var_dump("1e8">"999"): bool(true)
		-	var_dump("1e8asdfasdf">999): bool(true)
		-	var_dump("1e8asasdf">"999"): bool(false)

		-	var_dump("0e8"==0): bool(true) 
		-	var_dump("0e8"=="0"): bool(true)

		-	var_dump(true=="asfasdfsfsadf"): bool(true)
相關文章
相關標籤/搜索