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