WordPress のシーケンス解除の脆弱性は最近非常に有名になっていますが、具体的な脆弱性については分析しません: http://drops.wooyun.org/papers/596,?
英語の原文も読むことができます: http://vagosec.org/2013/09/wordpress-php-object-injection/。 ?
wp の公式 Web サイトにパッチがあります。パッチを回避しようとしましたが、成功したと思ったら、自分が甘かったことがわかり、wp のパッチを回避できませんでした。ですが、unserialize の小さな機能を発見したので共有したいと思います。?
1. Unserialize() 関数関連のソースコード: ?if ((YYLIMIT - YYCURSOR) ????????yych = *YYCURSOR;?<br style="margin: 0px; padding: 0px;">????????switch (yych) {?<br style="margin: 0px; padding: 0px;">????????case 'C':?<br style="margin: 0px; padding: 0px;">????????case 'O':????????goto yy13;?<br style="margin: 0px; padding: 0px;">????????case 'N':????????goto yy5;?<br style="margin: 0px; padding: 0px;">????????case 'R':????????goto yy2;?<br style="margin: 0px; padding: 0px;">????????case 'S':????????goto yy10;?<br style="margin: 0px; padding: 0px;">????????case 'a':????????goto yy11;?<br style="margin: 0px; padding: 0px;">????????case 'b':????????goto yy6;?<br style="margin: 0px; padding: 0px;">????????case 'd':????????goto yy8;?<br style="margin: 0px; padding: 0px;">????????case 'i':????????goto yy7;?<br style="margin: 0px; padding: 0px;">????????case 'o':????????goto yy12;?<br style="margin: 0px; padding: 0px;">????????case 'r':????????goto yy4;?<br style="margin: 0px; padding: 0px;">????????case 's':????????goto yy9;?<br style="margin: 0px; padding: 0px;">????????case '}':????????goto yy14;?<br style="margin: 0px; padding: 0px;">????????default:????????goto yy16;?<br style="margin: 0px; padding: 0px;">????????}
上記のコードは判定ですシーケンス文字列の処理メソッド (シーケンス文字列 O:4:"test":1:{s:1:"a";s:3:"aaa";} など) このシーケンス文字列を処理するには、まず最初のstring The Character is O, then case 'O':??goto yy13?yy13:?<br style="margin: 0px; padding: 0px;">????????yych = *(YYMARKER = YYCURSOR);?<br style="margin: 0px; padding: 0px;">????????if (yych == ':') goto yy17;?<br style="margin: 0px; padding: 0px;">????????goto yy3;
上記のコードからわかるように、ポインターは移動します2 番目の文字を指す 1 ビットを使用して、その文字が次であるかどうかを判断し、次に yy17?yy17:?<br style="margin: 0px; padding: 0px;">???????yych = * YYCURSOR; に進みます。 ?<br style="margin: 0px; padding: 0px;">??? ????if (yybm[0 yych] & 128) {?<br style="margin: 0px; padding: 0px;">????????????goto yy20;?<br style="margin: 0px; padding: 0px;">??? ????<br style="margin: 0px; padding: 0px;">??????if (yych == ' ') goto yy19;?<br style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;">....?<br style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;">yy19:?<br style="margin: 0px; padding: 0px;"> ???? ???yych = * YYCURSOR;?<br style="margin: 0px; padding: 0px;">?????????if (yybm[0 yych] & 128) {?<br style="margin: 0px; padding: 0px;">????????? goto yy20;?<br style="margin: 0px; padding: 0px;">?????????}?<br style="margin: 0px; padding: 0px;">??????goto yy18;
より 上記からわかるようにコードの場合はポインタが移動し、文字が数字の場合は yy20 に進み、 ' ' の場合は yy19 に進み、次の文字が数字の場合は yy20 に進みます。 yy18 に移動するだけではありません。yy18 はシーケンス処理を直接終了します。yy20 はオブジェクト シーケンスの処理であるため、上記からわかるように:?O: 4:"テスト":1:{s:1:"a";s:3:"aaa" ;} ?<code style="margin: 0px auto; padding: 4px 8px; display: block; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; font-size: 12px; color: #333333; background-color: #f8f8f8; border: 1px solid #cccccc; line-height: 18px; overflow: auto; white-space: normal;">O: 4:"test":1:{s:1:"a";s:3:"aaa";}?<br style="margin: 0px; padding: 0px;">O:4:"test":1:{s:1:"a";s:3:"aaa";}
O:4:"test":1:{s:1:"a";s:3:"aaa";}
はすべて逆シリアル化できますアンシリアライズしても結果は同じです。?
2. 実際のテスト: ?<?php ?<br style="margin: 0px; padding: 0px;">var_dump(unserialize('O: 4:"test":1:{s:1:"a";s:3:"aaa";}'));?<br style="margin: 0px; padding: 0px;">var_dump(unserialize('O:4:"test":1:{s:1:"a";s:3:"aaa";}'));?<br style="margin: 0px; padding: 0px;">?>
出力: ?object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(4) "test" ["a"]=> string(3) "aaa" }?<br style="margin: 0px; padding: 0px;">object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(4) "test" ["a"]=> string(3) "aaa" }
実際には、もう 1 つの ' ' で処理できるオブジェクトの型だけでなく、他の型も処理できます。具体的なテストについてはあまり説明しません。?
3.我们看下wp的补丁:?function is_serialized( $data, $strict = true ) {?<br style="margin: 0px; padding: 0px;">?????????// 文字列でない場合はシリアル化されません?<br style="margin: 0px; padding: 0px;">???????if ( ! is_string( $data ) )?<br style="margin: 0px; padding: 0px;">? ?????????????return false;?<br style="margin: 0px; padding: 0px;">?????????$data = トリム( $data );?<br style="margin: 0px; padding: 0px;">??????? ? if ( 'N;' == $data )?<br style="margin: 0px; padding: 0px;">???????????????return true;?<br style="margin: 0px; padding: 0px;">?????????$length = strlen ( $data );?<br style="margin: 0px; padding: 0px;">?????????if ( $length ???????????????return false;?<br style="margin: 0px; padding: 0px;">?????????if ( ':' !== $data[1] )?<br style="margin: 0px; padding: 0px;">???????????????return false;?<br style="margin: 0px; padding: 0px;">?????????if ( $strict ) {//output?<br style="margin: 0px; padding: 0px;">???????????????$lastc = $data[ $length - 1 ]; ?<br style="margin: 0px; padding: 0px;">??????????????????if ( ';' !== $lastc && '}' !== $lastc )?<br style="margin: 0px; padding: 0px;">?????? ????????????????return false;?<br style="margin: 0px; padding: 0px;">??????????} else {//input?<br style="margin: 0px; padding: 0px;">??????? ???????$semicolon = strpos( $data, ';' );?<br style="margin: 0px; padding: 0px;">???????????????$brace???? = strpos( $data, '}' );?<br style="margin: 0px; padding: 0px;">??????????????????// どちらか ; ?<br style="margin: 0px; padding: 0px;">???????????????if ( false === $semicolon && false === $brace )?<br style="margin: 0px; padding: 0px;">????? ???????????????????return false;?<br style="margin: 0px; padding: 0px;">??????????????????// ただし、どちらも最初の X 文字。?<br style="margin: 0px; padding: 0px;">??????????????????if ( false !== $semicolon && $semicolon ??????? ????????????????return false;?<br style="margin: 0px; padding: 0px;">???????????????if ( false !== $brace && $中括弧 ?????????????????????return false;?<br style="margin: 0px; padding: 0px;">?????????}? <br style="margin: 0px; padding: 0px;">?????????$token = $data[0];?<br style="margin: 0px; padding: 0px;">?????????switch ( $token ) {?<br style="margin: 0px; padding: 0px;">???????? ??????????case 's' :?<br style="margin: 0px; padding: 0px;">?????????????????????if ( $strict ) {?<br style="margin: 0px; padding: 0px;">?????????????????????????????????if ( '"' !== $data[ $length - 2 ] ) ?<br style="margin: 0px; padding: 0px;">????????????????????????????????????return false;?<br style="margin: 0px; padding: 0px;">????????????????????????} elseif ( false === strpos( $data, '"' ) ) {?<br style="margin: 0px; padding: 0px;">??? ????????????????????????????return false;?<br style="margin: 0px; padding: 0px;">??????????????? ??????????}?<br style="margin: 0px; padding: 0px;">???????????????ケース 'a' :?<br style="margin: 0px; padding: 0px;">????????? ????case 'O' :?<br style="margin: 0px; padding: 0px;">?????????????????????エコー "a";?<br style="margin: 0px; padding: 0px;">?? ???????????????????return (bool) preg_match( "/^{$token}:[0-9] :/s", $data ); ?<br style="margin: 0px; padding: 0px;">??????????????????ケース 'b' :?<br style="margin: 0px; padding: 0px;">??????????????????ケース 'i' : ?<br style="margin: 0px; padding: 0px;">??????????????????ケース 'd' :?<br style="margin: 0px; padding: 0px;">????????????????????? ???$end = $strict ? '$' : '';?<br style="margin: 0px; padding: 0px;">?????????????????????return (bool) preg_match( "/^{$token}:[ 0-9.E-] ;$end/", $data );?<br style="margin: 0px; padding: 0px;">?????????}?<br style="margin: 0px; padding: 0px;">?????????return false;?<br style="margin: 0px; padding: 0px;">}
パッチ内?return (bool) preg_match( "/^{$token}:[0-9] :/s", $data );<code style="margin: 0px auto; padding: 4px 8px; display: block; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; font-size: 12px; color: #333333; background-color: #f8f8f8; border: 1px solid #cccccc; line-height: 18px; overflow: auto; white-space: normal;">return (bool) preg_match( "/^{$token}:[0-9] :/s", $data );
「 」をもう 1 つ追加できますバイパス、この方法でシーケンス値をデータベースに書き込みましたが、データベースから抽出されたデータは、再度検証するときにバイパスできません。個人的には、このパッチはデータベースに出入りするデータに変更を加えることができませんでした。データの内外の変更に焦点を当てる必要がなくなりました。 ?
4. 概要?
wp パッチはバイパスされませんが、unserialize() のこの小さな機能は多くの開発者によって無視される可能性があり、その結果、プログラムにはセキュリティ上の欠陥があります。 ?
上記の分析に誤りがある場合は、指摘するメッセージを残してください。 ?
5. 参考?
《WordPress
http:/ /vagosec.org/2013/09/wordpress-php-object-injection/?
《var_unserializer.c ソースコード》?
https://github. com /php/php-src/blob/73cd2e0ab14d804c6bf0b689490bdd4fd6e969b1/ext/standard/var_unserializer.c?
"PHP 文字列のシリアル化と逆シリアル化の間の一貫性のない構文解析によって引き起こされるセキュリティ上の危険"?
http://zone.wooyun.org/content/1664
PHP unserialize の小さな機能

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPが多くのWebサイトよりも優先テクノロジースタックである理由には、その使いやすさ、強力なコミュニティサポート、広範な使用が含まれます。 1)初心者に適した学習と使用が簡単です。 2)巨大な開発者コミュニティと豊富なリソースを持っています。 3)WordPress、Drupal、その他のプラットフォームで広く使用されています。 4)Webサーバーとしっかりと統合して、開発の展開を簡素化します。

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)
