チェーンの監査を使用してthinkphp5.1.X、デシリアライゼーション

0x00の序文

基本をデシリアライズ:

https://www.cnblogs.com/wangtanzhi/p/12252993.html

https://www.cnblogs.com/wangtanzhi/p/12637819.html

0x01の

TPフレームをインストールし構成します

チェーンソーの使用に関する最初の記録は、明日裁判を継続するために、夜をポップ

脆弱性全体の出発点:

\ Thinkphp \ライブラリ\ \ \ __destructマジック機能のパイプ\ windows.phpをプロセスだと思います。

public function __destruct()
{
	$this->close();
	$this->removeFiles();
}

このページ)(removeFilesを検索

private function removeFiles()
{
    foreach ($this->files as $filename) {
        if (file_exists($filename)) {
            @unlink($filename);
        }
    }
    $this->files = [];
}

リンク解除は、我々は$ファイル名を制御することができれば、あなたは任意のファイルの削除に到達することができ、機能があります見ることができます。
当然のことながら、私たちは、この機能file_exists見るようになりました

$ファイル名は文字列として扱われます。

文字列__toStringとしてオブジェクトを逆シリアル化後に使用された場合でも、我々は、オブジェクトを渡すことによってトリガーされる方法を__toString、トリガされます。方法を__toString検索。我々はピボット・オブジェクトの前を通過するので、ので、この時間は、メソッドを__toStringトリガされます。
グローバル検索の__toString

使用に多くの場所がありますが、我々は従う\ thinkphp \ライブラリ\ \モデル\懸念\換算カテゴリ()メソッドの__toString Conversion.phpが、ここではtoJson()メソッドを呼び出したと思います。その後toJson()メソッドに従ってください。

ここでは、JSON文字列に変換のtoArray()メソッドと呼ばれる、()内のtoArrayをフォローアップし続けています。
\ thinkphp \ライブラリ\ \モデルを考える \懸念\ Conversion.php

基本的に私達の全体のチェーンの使用を妨げることはありません。最初の3つのトラバーサルの分析
>私たちが直接トラバーサルます$ this-の見て追加:

 // 追加属性(必须定义获取器)
        if (!empty($this->append)) {
            foreach ($this->append as $key => $name) {
                if (is_array($name)) {
                    // 追加关联对象属性
                    $relation = $this->getRelation($key);

                    if (!$relation) {
                        $relation = $this->getAttr($key);
                        if ($relation) {
                            $relation->visible($name);
                        }
                    }

ポイント法(パラメータ制御)の> - 私たちは満足$手に負えない変数を見つけることのtoArray()関数が必要です

ここのの$ this - >私たちのコントロール追加し
、このメソッドの値は来る方法ですか?コードの分析は、フォローアップを続けます。

おすすめ

転載: www.cnblogs.com/wangtanzhi/p/12639659.html