最近、私は Webshell アンチウイルスについて研究していて、その経験から新しい点を思いつきました。理由は、php7.1では変数関数のアサートが使えないので、php7の新機能を使ってアンチキリングルールをバイパスし、最後に某シールドと「某d0g」をバイパスすれば良いのではないかとふと思いついたからです。
実験環境は7.1.9で、php7以下の環境では全馬が使用できません。
Dシールドルールベース(最新): 20191227
某d0gが自社製品のテストを行うことで侵害を引き起こす可能性があるため、通報防止のため画像は掲載しておりません。
事前実験
あるシールド
まずは以下のコード
直接的な誤警報。
したがって、パラメーターを 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 では戻り値の型宣言のサポートが追加され、関数を定義するときに `:type` を追加するだけです。
例:
# は、関数の戻り値の型が int である必要があることを意味します。そうしないと、強制的に変換されるか、構文エラーが表示されます。
この機能を備えたウイルス対策ソフトウェアが更新されていない場合、この機能は認識されず、バイパスされます。
例:
#ウイルス対策ソフトウェアを使用してテストできます。
# 検出されませんでした。 ###############使える。 null 合体演算子日常の使用では三項式と `isset()` が同時に使用される状況が多数あるため、null 合体演算子 (*??*) が追加されています。 . 糖衣構文。変数が存在し、その値が **`NULL`** でない場合は独自の値を返し、それ以外の場合は 2 番目のオペランドを返します。
#簡単に言うと、 #` の使い方は? ? ` マークがある場合、強制終了ソフトウェアはこの処理プロセスを理解できないため、バイパスが発生する可能性があります。 次のコードのように、特定の d0g をバイパスしてから、関数 call## を使用できます。
##D シールドに合格していることがわかります#使いやすさをテスト##見てみましょう7.1 の機能について ##php7.1.x
[php マニュアル-php7.0.x の新機能]( https://www.php.net/manual/zh/migration71. new-features.php )
Null 可能な型
型の前に疑問符を追加することで、パラメーターと戻り値の型を Null 可能にできるようになりました。この機能が有効な場合、渡されるパラメーターまたは関数によって返される結果は、指定された型または null のいずれかになります。
7.1 よりも多くの機能がありますか? `関数の戻り値が指定された型でない場合、それは空になります。 同じコードを使用します:驚くことではありません
渡されたシールド D
短い配列構文
短い配列構文 ([]) は list() のフォールバックになりました構文オプション。配列の値を一部の変数 (foreach を含む) に割り当てるために使用できます。
ここでは、角括弧 `[] type` のリストをデモのために使用します。
このようにして、配列の値が` $c`、`$d`に代入されます。`$c='a';$d= 'b' ;`
このように、めったに使用されないこの機能を使用して、静的強制終了を回避できます。
最初に最も単純なものを作成します:
その後、特定の d0g を通過しました。自分でテストしてみてください。
その後、関数を一致させることができます。次のように:
チェックしてください
テストの可用性
list() はキー名をサポートするようになりました
公式説明: list() とその新しい [] 構文は、その中でキー名の指定をサポートするようになりました。これは、任意のタイプの配列をいくつかの変数に割り当てることができることを意味します (短い配列構文と同様)
これは非常にわかりにくいですが、例を見れば理解できるかもしれません。
例:
少し変更するだけで特定の d0g に合格できます (セルフテスト):
Try D Shield
報告レベル 1
カスタム関数を再度使用します。
# ユーザビリティをテストするために D に合格しました。#負の文字列オフセットをサポート
公式説明
オフセットをサポートするすべての文字列演算関数が、負の数値をオフセットとして受け入れることをサポートします。 [] または {} による文字列の添字。この場合、負のオフセットは文字列の末尾からのオフセットとして理解されます。
7.1 より前のバージョンでは、負のオフセットは空の文字列を返します。
例:
7.1.x では `s` を返しますが、以前のバージョンでは ` string(0) "" を返します `
アイデア: ルールが認識できないように文字列を分割できます。最後に、PHP の変数変数
を使用して、特定の d0g を渡すことができます。ただし、Dシールドの場合は、つなぎ文字や可変変数は認識されます。レベル 1 の「不審なファイル」の報告は、本当によく行われていると言わざるを得ません。
End
実際には、「define() による定数配列の定義」など、同様にバイパスできる機能が多数あります。また、カスタム関数だけでなく、クラス、変数なども静的強制終了をバイパスするために使用できます。
`spaceship 演算子 (結合比較演算子)` や `整数除算関数 intdiv()` などを使用して動的強制終了をバイパスすることもできます。
その他の関連記事については、php 中国語 Web サイトの
web サーバー セキュリティ以上がphp7 の新機能を使用してアンチキリング ルールをバイパスするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。