ホームページ >バックエンド開発 >PHPチュートリアル >PHP オブジェクトの流入の解析の脆弱性

PHP オブジェクトの流入の解析の脆弱性

WBOY
WBOYオリジナル
2016-06-13 12:14:441057ブラウズ

PHP オブジェクト インジェクションの脆弱性の分析

0、序文

Wuyun Knowledge Base で興味深い翻訳を見つけました: http://drops.wooyun.org/papers/4820

はオブジェクトインジェクションと呼ばれる注入方法について話しています。オブジェクトも注入できますか?

はい、汚染されたデータがある限り注入できないことはありませんが、この脆弱性は少し奇妙すぎるため、興味深いと思います。

1. 原則

プログラムを作成するとき、多くの場合、実行時データをシリアル化する必要があります。いわゆるシリアル化とは、実行時データを特定の形式でローカル ファイルに書き込むことです。このようにして、データをローカルに保存し、使用するときに、ファイルを直接読み取ることで実行時に生成されたデータを読み取ることができます。 PHP には、serialize 関数と unserialize 関数があります。

インジェクションの原理は、次のような逆シリアル化中の汚染されたデータの導入によって引き起こされます。 >$obj = unserialize($_GET[

'

インジェクション']) ;このステートメントを通じて、シリアル化されたデータの形式に従って自分で構築し、必要なオブジェクト $obj

を取得できます。 このオブジェクト $obj

を取得するだけで何の役に立つのかと尋ねる人もいるかもしれません。まずは次の例を見てみましょう。

2. シナリオ

このシナリオも、次の から派生しています。翻訳デモ、ここに復元します:


<?php header("Content-type:text/html;charset=UTF-8");// … 一些include ...class FileClass{    // 文件名     public $filename = "error.log";     //当对象被作为一个字符串会读取这个文件     public function __toString()    {        echo "filename发生了变化==>" . $this->filename ;        return file_get_contents($this->filename) ;                    }} // Main User class class User{    // Class data     public $age = 0;    public $name = '';     // 允许对象作为一个字符串输出上面的data     public function __toString()    {        return 'User ' . $this->name . ' is ' . $this->age . ' years old. <br />';    }} // 用户可控 $obj = unserialize($_GET['usr_serialized']); // 输出 __toStringvar_dump($obj) ;echo $obj;?>

上記のコードは、ユーザー制御可能なデータからシリアル化されたデータを取得し、unserialize メソッド ペア $_GET['usr_serialized'] を呼び出します。 > デシリアライズすると、この $obj は私たちが制御できるようになります。

通常の方法は次のように送信します:

http : //127.0.0.1/code/objin.php?usr_serialized=O:4:"ユーザー":2:{s:3:"年齢";i:20;s:4:"名前";s:4: " John";}

上記のシリアル化されたデータは、クラス User のオブジェクトです。ここで、 $age=20、$name=ジョン

このとき、echo $obj ;直接echo オブジェクトでは、マジック メソッド __toString を呼び出すことができます。このマジック メソッドは User クラスでオーバーロードされています。出力文字列。操作の効果は次のとおりです:


上記のコード ユーザー制御可能なデータからシリアル化されたデータを取得し、unserialize メソッドを呼び出して $_GET['usr_serialized'] を逆シリアル化します。そうすると、この $obj は私たちが制御できるようになります。

通常の方法は次のように送信します:

http://127.0.0.1/code/objin.php?usr_serialized=O:4:"ユーザー":2:{s:3:"年齢";i:20;s: 4:"name";s:4:"John";}

上記のシリアル化されたデータは、ユーザークラス のオブジェクト。$age=20、$name=John

このとき、echo $obj ;直接echo オブジェクトでは、マジック メソッド __toString を呼び出すことができます。このマジック メソッドは User クラスでオーバーロードされています。出力文字列。操作の効果は次のとおりです:

3. 脆弱性マイニング

このタイプの脆弱性は非常に隠されていますが、一度出現すると、それは非常に効果的です。マイニングの主な目的は、unserialize 関数のパラメーターが汚染されたデータかどうかを確認することです。対応するコントロールの場所を見つけて、どのクラスを使用して攻撃を完了できるかを確認します (このシナリオの FileClass クラスなど)。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。