Thinkphp <= 5.0.10再生バッファgetshell
0x01のビット
キャッシュ機能を使用してシーンを初めて目
次のキャッシュファイルを生成
あなたは、PHPのキャッシュファイルで終わるに直接保存された文字列abcを見ることができます。\ nは改行getshellを使用してみてください
文法は成功getshellバック、文字化けについてのコメント間違っています。
0x02の追跡ソース
まず、キャッシュをフォローアップ:: 18行()関数を設定します
自己::のinitに従ってください()
ライン67は、条件を満たしていないように、上記の呼び出しは、自己::のinit()、パラメータなしであるので、この場合は自己:: $ハンドラは、真にブロック、nullです。
デフォルトのファイルである構成cache.typeの値を表示するには、ライン69、
そのための条件は、ライン72に、満たされていません。自己と呼ばれるパラメータとして、ここでは図の上のキャッシュアレイ::接続()。接続方法に従ってください
ここcache.typeの値に基づいて判断のシリーズは、ファイルのキャッシュが\キャッシュ\ドライバ\のFileクラス44行を考えるように対応し、駆動ました。次にライン51、およびリターンでインスタンス化。
戻る機能に、だけでなく、直接返します
バックトラック続行
ここでは例の方法は、設定が終わっ返す呼び出すです。\キャッシュ\ドライバ\ファイルのセット方法を考えるフォロー
それはgetCacheKeyメソッドを呼び出して142行で見ることができます。
フォローアップの方法getCacheKeyは、デフォルト値のオプションので、ここで見つかった後、[「cache_subdir」]、真であるので、ここで直接ディレクトリ名として最初の2つのパラメータのMD5暗号化後の結果、キャッシュファイル名として残りの30ビット。それまでの.phpステッチ後に返します。
その後戻って、$ 146価値でシリアル化されようとして取得上記の設定ファイル名に続け、その後、149のラインは、そのバイナリ圧縮をgzcompress。そして、151行のデータの前と後のPHPタグをスプライシング、そして最終的にライン152でファイルを書き込みます。
ここでのポイントは、PHPタグにおけるユーザ制御データに線151の抜け穴が存在することです。
0x03の監査アイデア
拿到源码后,找到Cache::set(name, value, expire),其中缓存文件名是跟name相关联的,因此可以看作是一个已知条件。漏洞的关键点就是value是否可控。
0x04 补丁
看一下修复之后的结果(v5.0.15)
这里在data之前加了一个exit()强制退出,基本杜绝了data执行php代码的可能。