4.14 構造化データの読み込みにまつわる問題
Webアプリケーションには、構造化されたデータを扱うための仕組みとして、シリアライズ、デシリアライズがあります
良く扱われるデータとして、XML・JSONがあります。JSONはJavaScriptのオブジェクト表記構文のサブセットで、JavaScriptの中でオブジェクトを扱うやり方のことです
シリアライズとは、ソフトウェア内部で扱っているデータをそのまま、保存したり送受信することができるように変換することです
デシリアライズは，シリアライズで変換された文字列を、元のデータに戻します

4.14.1 eval にまつわる問題
evalとは、引数に指定した文字列をJavaScriptプログラムコードとして評価・実行する機能をもつ関数です

evalインジェクション脆弱性
eval関数の使い方に問題がある場合、外部から送り込んだスクリプトを実行することによって、本来意図しない不正な処理を行わせる攻撃ですevalインジェクション脆弱性の影響
OSコマンド・インジェクションと同じ影響があります。
・情報漏洩、サイト改竄、不正な機能実行、他サイトへの踏み台
PHPで入力文字列を解釈して実行する機能を持つ関数
関数名説明
create_function()関数を動的に生成する
preg_replace()e修飾子を使用すると実行できる
mb_ereg_replace()
第４引数で、「e」を指定すると実行できる
引数でコールバック関数を指定できる関数
call_user_func() call_user_func_array()array_map()array_walk()array_filter()usort()

uksort()evalインジェクション脆弱性の対策①eval関数を使用しない■処理を代替することが考えられるeval以外のシリアライズ処理■● implode/explode
単純なシリアライズ/デシリアライズに使用可能● json_encode/json_decode
自由度と安全性で推奨● serialize/unserialize
デシリアライズに脆弱な部分がある②eval関数の引数に、外部からのパラメータを含めない③eval関数の引数に、外部からのパラメータを含める場合には、英数字に限定する
evalインジェクション脆弱性の影響①Webサーバ内のファイル閲覧による情報漏洩②任意スクリプト実行による攻撃（サイト改竄、不正な機能実行、他サイトへの踏み台）
Perl のevalインジェクション
Perl言語には、eval関数に、式を記述する形式とブロックを記述する形式とがあります。式を記述する場合に、evalインジェクション脆弱性があります。
eval("\$c = $a / $b;"); $b = '1;system("ls /sbin")';4.14.2 安全でないデシリアライゼーション
デシリアライズ処理の脆弱性
アプリケーションの内部構造データを、保存／伝送するために、シリアライズ／デシリアライズ処理が行われますが、シリアライズ／デシリアライズの連携処理に問題があると、デシリアライズで意図しないオブジェクトが生成されて、本来意図しない不正な処理が行われてしまう可能性があります。
デシリアライゼーション脆弱性の影響
OSコマンド・インジェクションと同じ影響があります。
・情報漏洩、サイト改竄、不正な機能実行、他サイトへの踏み台
PHPでデシリアライゼーションで悪用されやすいメソッド
関数名
説明
デストラクタオブジェクト破棄時
unserialize_callback_func
指定したコールバック関数が定義されていない場合や そのコールバック関数が未定義のクラスの定義に失敗したときに警告する__wakeup()
アンシリアライズしたデータからインスタンスに必要なデータを再構築するときに使う__toString()などのマジックメソッド デシリアライズしたクラスに定義されていて、オブジェクトを文字列に変換しようとした場合に呼ばれる※ PHPの場合のデシリアライズできるクラスは、アプリ内で定義されているか、spl_autoload_register関数などで自動的に読み込まれているものに限ります
Java言語の場合は、デシリアライズ時に、readobjectメソッドが自動的に呼ばれる仕様が悪用されます
デシリアライゼーション脆弱性の対策①シリアライズ／デシリアライズ機能を使用しない（ serialize/unserialize、ｗｄｄｘ(セッション管理) )②デシリアライズ処理に、外部からのパラメータを含めない⇒ シリアライズ形式ではなく、JSON形式によってデータを受け渡す⇒ クッキーやhiddenパラメータではなく、セッション変数など改変できない仕組みで、シリアライズ形式のデータを受け渡す⇒ HMACなどの改竄検出する機能を採用して、受け渡したデータを確認する

4e-001 :evalによるオブジェクト受け渡し(正常系)【ブラウザ】【サーバ： 4e/4e-001.php 】【サーバ： 4e/4e-002.php 】

【ブラウザ→サーバ： リクエスト 4e/4e-001.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 4e/4e-002.php → レスポンス 】【ブラウザ】

4e-001:evalによるオブジェクト受け渡し(攻撃)【ブラウザ】【サーバ： 4e/4e-002.php 】

【ブラウザ→サーバ： リクエスト 4e/4e-002.php → レスポンス 】

：：：
：

：
：

：
：

クエリ文字列として、「data」に対して与えている値はOWASP ZAP上で、文字列を選択した状態で右クリックして「エンコード／デコード／ハッシュ・・・」を指定してツールでデコード内容を確認すると、「0; phpinfo();」をエンコードしたものであると分かる$str = base64_decode($data);eval('$a = ' . $str . ';');であるので、dataを展開し、eval関数の指定はeval ( $a = 0 ; phpinfo(); )となったことがわかる。

【ブラウザ】

4e-010 :好みの色を示すクッキーの設定(正常系)【ブラウザ】①②【サーバ： 4e/4e-010.php 】【サーバ： 4e/4e-011.php 】【ブラウザ→サーバ： リクエスト 4e/4e-010.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 4e/4e-011.php → レスポンス 】【ブラウザ】

4e-900:攻撃用クッキーの生成（攻撃）【ブラウザ】【サーバ：4e-012.php 】【サーバ：4e-900.php 】【サーバ：4e-012.php 】【サーバ：4e-900.php 】【ブラウザ】

【ブラウザ】

右クリック①②

②【ブラウザ→サーバ： リクエスト 4e/4e-011.php → レスポンス 】

【ブラウザ→偽サーバ： リクエスト trap.example.com/4e/4e-900.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 4e/4e-011.php → レスポンス 】

【ブラウザ→サーバ： リクエスト 4e/xinfo.php → レスポンス 】

【ブラウザ→偽サーバ： リクエスト trap.example.com/4e/4e-015.php → レスポンス 】

4e-010a:好みの色を示すクッキーの設定(JSON版)
4e-011a:好みの色を表示(JSON版)【ブラウザ】①②【サーバ： 4e/4e-010a.php 】【ブラウザ】【サーバ： 4e/4e-900.php 】

【ブラウザ→偽サーバ： リクエスト trap.example.com/4e/4e-010a.php → レスポンス 】【ブラウザ→偽サーバ： リクエスト trap.example.com/4e/4e-011a.php → レスポンス 】