それは約2年前に書かれました...
サイトでバグを見つけたハッカーはどのように機能しますか? もちろん、彼はWebシェルを取得しようとしています! 何らかのバグを介して、彼はこの不運なシェルを埋めようとするか、いずれかのファイルに悪意のあるコードを追加しようとします。 彼はこのシェルを控えめな名前、たとえばconfig.phpなどで偽装しています。 多くの場合、管理者はこれに気づきさえしません。 さて、管理者にファイルが変更されたこと(ハッカーが既存のファイルに悪意のあるコードを入力した場合)、または新しいファイルが追加されたことを通知するコードを書きましょう。
サイトの構造に変更が加えられたかどうかを理解するために、何を修正する必要があります。 データベース内のすべてのフォルダーとファイル(および最後の変更のファイルサイズと日付)を入力します。 これらの値を持つテーブルをインデクサーと呼びます。このようなテーブルを作成するためのsqlクエリは次のとおりです。
[SQLリクエスト]
テーブルインデクサーの作成(object_id int not null主キー、object_name varchar(100)not null、object_type varchar(255)not null、object_size varchar(50)not null、object_date varchar(50)not null )
説明:
object_id-一意のファイル/フォルダー番号
object_name-フォルダー/ファイル名
object_type-タイプ(フォルダー/ファイル)
object_path-フォルダー/ファイルへのパス
object_size-フォルダー/ファイルサイズ
object_date-フォルダー/ファイルの最終変更日
将来的には、日記を読み、データベースの値を確認します!
次のコードを挿入します。
フォームアクション= indexer.phpメソッド= "POST"
名前を選択= doサイズ= 2
オプション値=データベース内のudateUpdate値/オプション
オプション値= checkCompare /オプション
オプション値=書き込み不可
/選択
もちろん、これらはすべてデータベースに保存できますが、プロセスを自動化することをお勧めします。特に、プロジェクトが毎日開発および更新される場合は、この作業を簡単なスクリプトに入れる方がはるかに便利です。
if(isset($ _ REQUEST ["do"])&& $ _REQUEST ["do"] == "update"){
$ delete_table = mysql_query( "DELETE FROM indexer"); //過去の値を削除します
//テーブルに配置
$ dir = $ _REQUEST ["dir"]; //インデックスを作成するフォルダーの名前//
$ chdir = realpath($ dir); //フォルダへの実際のパスを見つける//
$ dir_open = opendir(realpath($ chdir)); //ディレクトリを開きます
while($ read_dir = readdir($ dir_open)){// read ...
// echo $ read_dir。」
";
if($ read_dir == "。" || $ read_dir == ".."){// if read_dirが等しい場合。 または// ...スキップ...
続ける;
}
$ id_object = mysql_num_rows(mysql_query( "SELECT id FROM indexer")); //エントリの数を調べる//
$ object_id ++; //増加
$ object_name = $ read_dir; //名前を割り当てます...
$ object_type = is_dir($ read_dir)? 「ディレクトリ」:「ファイル」; //タイプ...
$ object_size = filesize($ read_dir); //サイズ...
$ object_date = date( "dmy H:i:s"、filemtime($ read_dir)); //変更日...
$ object_path = str_replace( "\\"、 "/"、realpath($ read_dir)); //そして最後にパス
if(is_file($ read_dir)){//オブジェクトがファイルの場合、アクションが実行されます
$ insert_table = mysql_query( "INSERT INTOインデクサー(id、object、object_type、object_path、object_size、object_date)VALUES( '$ id_object'、 '$ object'、 '$ object_type'、 '$ object_path'、 '$ object_size byte'、 '$ object_date')”);
}
else {//オブジェクトがフォルダーの場合、アクションが実行されます
$ insert_table = mysql_query( "INSERT INTOインデクサー(id、object、object_type、object_path、object_date)VALUES( '$ id_object'、 '$ object'、 '$ object_type'、 '$ object_path'、 '$ object_date')");
}
if($ insert_table){//すべてが成功した場合、お知らせください...
echo " $ read_dirがデータベースに正常に追加されました!
";
}
その他{//または失敗した場合:(
echo " $ read_dirのエラー
";
}
}
closedir($ dir_open);
}
データベースがいっぱいになったので、ハッカーが何かを削除したかどうかを確認する必要があります。最も重要なことをバックアップするスクリプトを書くことをお勧めします。問題なくスクリプトを書いてから、Asyaをノックするか、手紙を書くことができます!
elseif(isset($ _ REQUEST ["do"])&& $ _REQUEST ["do"] == "check"){
//フォルダであるオブジェクトを選択します
$ query_dir = mysql_query( "SELECT * FROMインデクサーWHERE object_type = 'directory'");
if($ query_dir){//リクエストが完了した場合...
while($ read = mysql_fetch_array($ query_dir)){
if(!is_dir($ read ["object_path"])){//そのようなフォルダーが既に存在しない場合は、削除された//!
echo " "。$ read ["object"]。 "存在しません!
";
mail( 'admin_address'、 'alarm_list_ topic'、 'letter_ body')//ヘルメットの手紙//不運な管理者へ
}
}
}
//ファイルであるオブジェクトを選択します
$ query_file = mysql_query( "SELECT * FROMインデクサーWHERE object_type = 'file'");
if($ query_file){
while($ read = mysql_fetch_array($ query_file)){
if(!is_file($ read [“ object_path”]))){//既にそのようなファイルが存在しない場合、//削除された!
echo " "。$ read ["object"]。 "存在しません!
";
mail( 'admin_address'、 'alarm_list_ topic'、 'letter_ body')//ヘルメットの手紙//不運な管理者へ
}
}
}
}
それでは、ハッカーが奇妙なものを追加したかどうかを確認しましょう! これは非常に簡単に行われます。まず、確認するディレクトリの名前を設定し、次に値を配列に入力します。 その後、データベースからフォルダーであるオブジェクトを選択し、ループをチェックします。一致が見つかった場合、ファイルが存在し、変数$ errorを0に設定します。ループを終了した後、変数$ errorの値を確認します。削除されました! ファイルについても同様です。 ところで、ファイルサイズをチェックする必要があることを忘れていました。 これは非常に簡単に行われます。ファイル名を確認した後、サイズを確認します。
$ error_size = 1;
$ size = sizeof($オブジェクト[$ i]);
if($ size == $ db_object ["object_size"]){
$ error_size = 0;
}
完全な確認コードは次のとおりです。
elseif(isset($ _ REQUEST ["do"])&& $ _REQUEST ["do"] == "unwrite"){
$ dir = $ _REQUEST ["dir"]; // diraの名前を取得します
$ chdir = realpath($ dir); // dirの実際の方法を見つけます
$ dir_open = opendir(realpath($ chdir)); //開く...
while($ read_dir = readdir($ dir_open)){
if($ read_dir == "。" || $ read_dir == ".."){// if。 または...スキップ
続ける;
}
$オブジェクト[] = $ read_dir; //配列に書き込みます
}
for($ i = 0; $ i <count($ objects); $ i ++){
if(is_dir($ objects [$ i])){// if the folder ...
//データベースからフォルダーであるオブジェクトのみを選択します
$ query_object = mysql_query( "SELECT * FROMインデクサーWHERE object_type = 'directory'");
if(query_object){
$エラー= 1;
while($ db_object = mysql_fetch_array($ query_object)){
if($ objects [$ i] == $ db_object ["object"]){//そのようなディレクトリがある場合...
$エラー= 0; //値をゼロにします
休憩; //ループを終了します
}
その他{
続ける;
}
}
}
if($ error == 1){
エコー」
データベースにないディレクトリが見つかりました-$オブジェクト[$ i]
";
}
}
//同じアクション、ただしファイルのみ
if(is_file($ objects [$ i])){
$ query_object = mysql_query( "SELECT * FROMインデクサーWHERE object_type = 'file'");
if(query_object){
$エラー= 1;
while($ db_object = mysql_fetch_array($ query_object)){
if($ objects [$ i] == $ db_object ["object"]){
$エラー= 0;
休憩;
}
その他{
続ける;
}
}
}
if($ error == 1){
エコー」
データベースにないファイルが見つかりました-$オブジェクト[$ i]
";
}
}
}
}
データベースにないファイルやフォルダ、またはサイズが変更されたファイルを入力するテーブルを作成することもできます! この表は次のようになります。
作成テーブルerror_object(id int not null primary key、object varchar(100)not null、object_type varchar(100)null、object_size varchar(100)not null、object_date varchar(100)not null、object_path varchar(100)not null)