ホームページ > バックエンド開発 > Python チュートリアル > PHP WEBSHELL トロイの木馬を正確に見つける方法 (1)

PHP WEBSHELL トロイの木馬を正確に見つける方法 (1)

WBOY
リリース: 2016-06-16 08:47:10
オリジナル
1193 人が閲覧しました

まず、バックティックによって正常に実行できる名前付きコード スニペットを見てみましょう。コードは次のとおりです。

コードをコピーします コードは次のとおりです。

`ls -al`; `ls -al`;
echo "sss";
$sql = "SELECT `username` FROM `table` WHERE 1"; FROM `table` WHERE 1 '
/*
は、先頭にある空白文字にすぎません。または、コード行の末尾の後に続きます。次の 2 行は、予期しない状況です。 SQL コマンド内のバックティック マークは除外する必要があります。
*/


正規表現の書き方は?
分析:
移植性に関する共通点は何ですか?バッククォートが含まれる他の通常の部分との違いは何ですか?
スペース、タブキー、その他の空白文字を前に置くことができます。プログラム コードを含めることもできますが、引用符 (一重および二重) がある場合は閉じる必要があります。それは危険であり、隠れた危険です。 CFC4N によって与えられる通常のルールは次のとおりです。 [(?:(?:^(?:s+)?)|(?:(?P["'])[^(?P=quote)]+ ?( ?P=quote)[^`]*?))`(?P[^`]+)`]。
説明:
[(?:(?:^(?: s+ )?)|(?:(?P["'])[^(?P=quote)]+?(?P=quote)[^`]*?))]
マッチング開始位置 または、開始位置の後に空白文字またはその前にコードがあり、コードが一重引用符と二重引用符で囲まれています。 (この PYTHON では通常、キャプチャの名前付けと後方参照が使用されます)
[`(?P[^`]+)`] これは比較的単純で、バッククォート間の文字列を照合します。
PHP WEBSHELL トロイの木馬を正確に見つける方法 (1)
PHP WebShell を検出するための特定の Python スクリプトは十分に考慮されていませんでした。
次のリストの最初の要素を見てください。 [(system|shell_exec|exec|popen)]、この規則は、文字列に "system"、"shell_exec"、"exec"、および "popen" の 4 つの文字列グループが含まれている限り、次のように判断されることを意味します。危険なキャラクター。明らかに、この方法は緩すぎます。プログラマが作成したコードにこれら 4 つの文字グループが含まれている場合、それは危険な関数であると判断できます。非常に不正確で、偽陽性率が非常に高くなります。下の図を参照してください。
PHP WEBSHELL トロイの木馬を正確に見つける方法 (1)
PHP WebShell を検出するための特定の Python スクリプトはよく考えられていません。
不審なコードとはどのようなコードですか?キーワードは何ですか?

疑わしいコードは、危険な操作を実行できる関数で構成されている必要があります。暗号化された PHP コードの場合、危険な操作を実行できる最も重要な PHP 関数は「eval」関数です (zend 暗号化メソッドではなく、変形された文字列のみです)。 )、「eval」関数を使用する必要があるため、どの暗号化方式が使用される場合でも、「eval」関数を使用する必要があります。 2 つ目は、上記のコードにある 4 つの「system」、「shell_exec」、「exec」、「popen」などのシステム コマンドを実行できる関数です。もちろんパススルーなど他にもあります。 PHP は、システム コマンドを直接実行するための「·」文字 (ESC キーの下の文字) もサポートしています。 [b(?Peval|proc_open|popen|shell_exec|exec|passthru|system)bs*(] のような正規表現を書くことができます。
PHP WEBSHELL トロイの木馬を正確に見つける方法 (1)
PHP を検出する Python スクリプトwebshel​​l は比較的簡単です。 厳密なマッチング
説明:

[bb] が単語の両側の位置を一致させるために使用されることは誰もが知っています。 [bb] の中間部分が単語であることを確認してください。関数名の前に特殊文字が追加されている場合でも、次の [s*] を使用して空白文字と一致し、その回数は 0 回から数え切れないほどです。前の [(?P)] は、名前付きグループをキャプチャするために使用されます。これを Python コードとして使用して、一致結果のキーを直接参照します。

このコードを入れたらどうでしょうか。画像拡張子を持つファイルは .php と .inc ファイルだけを検出しますか? そうですね、悪意のあるコードが gif、jpg、png、aaa などの拡張子ファイルに含まれている場合は見つかりません。などの場合、Apache や IIS などの Web サービスでは解析できず、インポートするには include/require (_once) を経由する必要があります。その後、 include/require(_once) の後のファイル名が一致するかどうかだけを確認する必要があります。通常の「.php」または「.inc」ファイル。そうでない場合、それは疑わしいファイルです。 *["'](?P.*?(?PHP WEBSHELL トロイの木馬を正確に見つける方法 (1)
PHP の Python スクリプトの検出WEBSHELL はより厳密です
説明します:

最初に [(?Pb( ?:include|require)(?:_once)?b)], [(?P
次の [s*(?s*["'](?P.+?(?.+?(? )] は上で紹介したもので、名前付きキャプチャの場合、結果は match.group("filename") に配置されます。[.*.?] は任意の文字です。 quantifier は「優先度の数量子を無視する」もので、一般に「非貪欲」として知られています。ここでは、少なくとも 0 が一致します (.aa と .htaccess にファイル名がなく、ファイル拡張子のみが導入されるのを防ぎます)。次の [(?
まとめると、最後に、私が与えた Python コードは次のとおりです:
コードをコピーします コードは次のとおりです:

#!/usr/bin/python
#-*-エンコーディング:UTF-8 -*-
###
## @package
##
## @author CFC4N
## @copyright copyright (c) Www.cnxct.Com
## @Version $Id: check_php_shell.py 37 2010-07-22 09:56:28Z cfc4n $
###
import os
import sys
import re
インポート時間
def listdir(dirs,liston='0'):
flog = open(os.getcwd()+"/check_php_shell. log","a+")
if not os.path.isdir(dirs):
print "ディレクトリ %s が存在しません"% (dirs)
return
lists = os.listdir( dirs)
リスト内のリストの場合:
filepath = os.path.join(dirs,list)
if os.path.isdir(filepath):
if liston == '1':
listdir(filepath,'1')
elif os.path.isfile(filepath):
filename = os.path.basename(filepath)
if re.search(r".(?: php|inc|html?)$", filename, re.IGNORECASE):
i = 0
iname = 0
f = open(filepath)
while f:
file_contents = f .readline()
if not file_contents:
break
i += 1
match = re.search(r'''(?Pb(?:include|require)( ?:_once)?b)s*(?s*["'](?P.*?(?if match:
function = match.group("function")
filename = match.group("filename")
if iname == 0:
info = 'n[%s] :n'% (ファイルパス)
else:
info = ''
info += 't|-- [%s] - [%s] line [%d] n'% (function,filename,i)
flog.write(info)
print info
iname += 1
match = re.search(r'b(? Peval|proc_open|popen|shell_exec|exec|passthru|system)bs*(', file_contents, re.IGNORECASE| re.MULTILINE)
if match:
function = match.group("function")
if iname == 0:
info = 'n[%s] :n'% (ファイルパス)
else:
info = ''
info += 't|-- [%s] line [%d] n'% (function,i)
flog.write(info)
印刷情報
iname += 1
f.close()
flog.close()
if '__main__' == __name__:
argvnum = len(sys.argv)
liston = '0'
if argvnum == 1:
action = os.path.basename(sys.argv[0])
print "コマンドは次のとおりです:n %s D:wwwroot n %s D:wwwroot 1 -- サブフォルダーを再帰します"% (action,action)
quit()
elif argvnum == 2:
path = os.path.realpath(sys.argv[1])
listdir(path,liston)
else:
liston = sys.argv[2]
path = os.path.realpath(sys.argv[1])
listdir(path, liston)
flog = open(os.getcwd()+"/check_php_shell.log","a+")
ISOTIMEFORMAT='%Y-%m-%d %X'
now_time = 時間。 strftime(ISOTIMEFORMAT,time.localtime())
flog.write("n----------------------%s がチェックされました ------ ---------------n"% (now_time))
flog.close()
## 最新世代の文章上にあります。2010/07

のみ、参考にしてください。

PHP WEBSHELL の Python スクリプトの検査結果 PHP WEBSHELL トロイの木馬を正確に見つける方法 (1) 问: この方法は完了していますか? 現時点で既知のすべての危険関数の数文が完了していますか?
> 回答: できません、等が含まれているファイルに展開名がない場合、ここでは一致しません。追記:コマンドを実行する「`」のリアクション番号も書き込まれていないため、SQL 文の中でリアクション番号が混ざってしまいがちです。もう一度言いますが、この文はコードを制限するだけであり、人間を拒否するものではありません。次に、その人が出した Python代コード随便制、随便伝達、愛留版权就留版权、不愛留就删了相关字符、即ち您爱干吗干吗。)
我先休息一会、明天再说。(前半は三国杀曹仁的台词、哈。)
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート