最近在研究webshell免殺,抽出心得的一個新穎的點。原因是突然想到既然php7.1不能利用可變函數的assert,那就利用php7的新特性來繞過查殺正則,最終繞過某盾和“某d0g”。
實驗環境在7.1.9,所有馬兒在php7以下的環境均不能使用。
D盾規則庫(最新):20191227
某d0g因為可能會因為用其產品測試,導致侵權行為,為了防止被舉報所以就不放圖了。
前置實驗
立即學習“PHP免費學習筆記(深入)”;
某盾
首先以下代碼
直接誤報了。
因此,直接傳參到eval里面是不現實的。
所以接下來我們要利用函數,配合php新特性來繞過它。
某d0g
而對于某d0g,只要以下代碼
就會讓其誤報。
因此在寫免殺馬的時候,post中的變量,不要出現在eval中的字符串中。就像上面`b`一樣,盡管他在`eval`中是以變量的形式出現的。有了這個基礎就可以進入正題了。
PHP7.0.x
[php手冊-php7.0.x新特性]( https://www.php.net/manual/zh/migration70.new-features.php)
返回值類型申明
php7增加了返回值類型聲明的支持,在定義函數時增加一個 `:類型`便可以了。
例如:
就是函數返回值類型要為int。否則會強制轉換或者顯示語法錯誤。
如果未更新此特性的查殺軟件,就會不認識此函數,導致被繞過。
例如:
可以用查殺軟件測試一下。
發現沒有被檢測到。
可以使用。
null合并運算符
由于日常使用中存在大量同時使用三元表達式和 `isset()`的情況, 添加了null合并運算符 (*??*) 這個語法糖。如果變量存在且值不為**`NULL`**, 它就會返回自身的值,否則返回它的第二個操作數
簡單來說:
如果運用 `??`符號,查殺軟件不會理解著個處理過程 ,可能就會導致繞過。
就像以下代碼就可以繞過某d0g
再利用函數調用一下
可以發現已經過了D盾
測試一下可用性
接下來看看7.1的特性吧
php7.1.x
[php手冊-php7.0.x新特性](?https://www.php.net/manual/zh/migration71.new-features.php?)
可為空(Nullable)類型
參數以及返回值的類型現在可以通過在類型前加上一個問號使之允許為空。當啟用這個特性時,傳入的參數或者函數返回的結果要么是給定的類型,要么是 null 。
比7.1的特性多了個 `?`函數返回值若不是給定類型,則為空。
使用同樣的代碼:
不出意外
過了D盾
短數組語法
短數組語法([])現在作為list()語法的一個備選項,可以用于將數組的值賦給一些變量(包括在foreach中)。
這里選用中括號 `[]類型`的列表來演示。
這樣,就把數組的值分別賦給了` $c`,`$d`.`$c=’a’;$d=’b’;`
這樣,就可以用這個少用的特性,來繞過靜態查殺
首先寫一個最簡單的:
然后就過了某d0g。自行測試。
之后就可以配合函數。就像這樣:
查殺一下
測試可用性
list()現在支持鍵名
官方說明:現在list()和它的新的[]語法支持在它內部去指定鍵名。這意味著它可以將任意類型的數組 都賦值給一些變量(與短數組語法類似)
這個很繞,看一下例子也許就會明白了。
eg:
稍微改改就能過某d0g(自行測試):
試試D盾
報了一級
再次借助自定義函數。
成功過D,測試可用性。
支持為負的字符串偏移量
官方說明
現在所有支持偏移量的字符串操作函數 都支持接受負數作為偏移量,包括通過[]或{}操作字符串下標。在這種情況下,一個負數的偏移量理解為一個從字符串結尾開始的偏移量。
這個在小于7.1版本中,負的偏移量返回空字串。
eg:
7.1.x中返回 `s`,但是以前的版本中 返回 ` string(0) “” `
思路:我們可以這個拆分字符串,使規則識別不出來。最后再配合php的可變變量:
這樣就可以過某d0g了。但是對于D盾來說,會識別拼接字符,和可變變量。報一級`可疑文件`,不得不說這點做的確實很好。
結尾
其實還有很多特性,就像`通過define()定義常量數組`,也都可以舉一反三去繞過。而且不止自定義函數,還可以配合類,可變變量等,來繞過靜態查殺。
還可以利用 `太空船操作符(組合比較符)`,`整數除法函數 intdiv()`等來繞過動態查殺。
更多相關文章,請關注php中文網web服務器安全欄目!