目 次 1 UNICODE とサニタイジング 回 避 テクニック UNICODE とサニタイジング 回 避 テクニックとは( 本 文 書 の 目 的 ) UNICODE を 使 ったサニタイジング 回 避 テクニックの 本 質 UNICODE を 使 ったサニタイ

Size: px
Start display at page:

Download "目 次 1 UNICODE とサニタイジング 回 避 テクニック 4 1.1 UNICODE とサニタイジング 回 避 テクニックとは( 本 文 書 の 目 的 ) 5 1.2 UNICODE を 使 ったサニタイジング 回 避 テクニックの 本 質 5 1.3 UNICODE を 使 ったサニタイ"

Transcription

1 UNICODE と サニタイジング 回 避 テクニック 2009 年 02 月 14 日 Ver. 1.6

2 目 次 1 UNICODE とサニタイジング 回 避 テクニック UNICODE とサニタイジング 回 避 テクニックとは( 本 文 書 の 目 的 ) UNICODE を 使 ったサニタイジング 回 避 テクニックの 本 質 UNICODE を 使 ったサニタイジング 回 避 テクニックへの 対 策 7 2 UNICODE を 使 ったサニタイジング 回 避 テクニックの 影 響 UNICODE を 使 ったサニタイジング 回 避 テクニックの 影 響 WindowsNT 系 の 場 合 Win32API 系 の 場 合 VisualBASIC6.0SP6 系 の 場 合 NET Framework2.0 の 場 合 Java の 場 合 14 3 UNICODE を 使 ったサニタイジング 回 避 テクニックの 具 体 例 ANSI-C で 書 かれた Windows プログラム Windows ファイルシステム Scripting.FileSystemObject オブジェクト(WSH5.6) open ステートメント(VisualBASIC6.0SP6) NET Framework Windows 上 での Java Windows 上 での Python Windows の OS コマンド 呼 び 出 しについて WindowsScriptingHost 5.6 の WScript.Shell オブジェクトの Run()メソッド WindowsScriptingHost5.6 の WScript.Shell オブジェクトの Exec()メソッド VisualBASIC6.0SP6 の Shell()メソッド Linux/Unix の OS コマンド 呼 び 出 しについて Java1.6.0 の java.lang.runtime.クラスの exec メソッド(PlamoLinux

3 [LANG=EUC-JP]) Java1.6.0 の java.lang.runtime.クラスの exec メソッド(CentOS4.4 [LANG=UTF-8]) PostgreSQL/mySQL の SQL 利 用 時 Windows 上 での PostgreSQL8.0.3(pgODBC )と VisualBASIC6.0SP Windows 上 での mysql4.1.2alpha(myodbc )と VisualBASIC6.0SP MS-XML COM オブジェクト Microsoft.XMLDom オブジェクト(VB6SP6) (XML 文 書 は SJIS) LDAP インジェクション XSS(Cross-Site Scripting) (JavaScript インジェクション) JavaServlet 54 4 アタックベクタ Web アプリケーション IIS5.1 上 の ASP ASP.NET IIS + CGI JavaServlet 73 5 執 筆 者 と 更 新 履 歴 など 執 筆 者 更 新 履 歴 本 文 書 の 最 新 バージョン 82 6 付 記 Win32 系 列 での UNICODE 変 換 リストのプログラムについて MS-VisualBASIC6.0Sp6 での UNICODE 変 換 リストのプログラムについて MS-C#での UNICODE 変 換 リストのプログラムについて Java での UNICODE 変 換 リストのプログラムについて tchar.h を 使 って 引 数 の hex 表 示 をする VC++6.0SP6 プログラム 94 2

4 6.6 Variant 型 の 引 数 を ANSI で 受 け 取 るメソッドと Unicode(Binary)で 受 け 取 るメソッド のある COM(MS-VC++6.0SP6) の COM を 呼 び 出 すテストスクリプト Java で 書 かれたファイルアクセスプログラム Python で 書 かれたファイル 読 み 出 しプログラム VB の Open ステートメントと Scripting.SystemFileObject オブジェクトを 使 ったファ イル 読 み 出 しプログラム (VB6SP6) NET Framework でファイルを 作 るプログラム (C#) WSH の Run メソッドでコマンド 実 行 するスクリプト WSH の Exec メソッドでコマンド 実 行 するスクリプト 外 部 コマンド 呼 び 出 しによって 呼 び 出 されるプログラム 外 部 コマンド 呼 び 出 しを 行 う Java プログラム MS-XML コアサービスの COM オブジェクトを 使 った XML 文 書 検 索 プログラム (VB6SP6) IIS-ASP の 文 字 列 データ(String in Variant)のバイト 列 表 示 (10 進 )(ActiveX DLL by VB6SP6) IIS-ASP の 文 字 列 データ(String in Variant)のバイト 列 表 示 (10 進 )(ActiveX DLL by VB6SP6) JavaScript の 文 字 列 の 初 期 値 として 使 用 する JavaServlet ASP.Net で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 (C#) ASP.Net で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 (VB.NET) CGI として 受 け 取 ったデータのバイト 列 表 示 プログラム JavaServler で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 付 記 2TCHAR の 既 定 文 字 コード MS-VisualStudio6.0 SP6 の 場 合 MS-VisualC++.NET 2003 の 場 合 MS-VisualStudio2005 ExpressEdition の 場 合 MS-VisualStudio2008 ExpressEdition の 場 合 128 3

5 1 UNICODE とサニタイジング 回 避 テクニック 4

6 1.1 UNICODE とサニタイジング 回 避 テクニックとは( 本 文 書 の 目 的 ) 本 文 書 は 2004 年 10 月 30 日 の まっちゃ 139 勉 強 会 ( )のはせがわようすけ 氏 の Unicode とセキュリティ について より 詳 細 に 研 究 した 内 容 を 記 述 する また 本 文 書 の 目 的 は 不 正 行 為 の 助 長 ではなく このようなセキュリティ 上 の 問 題 が 存 在 する ことを 周 知 徹 底 させることが 目 的 であり その 結 果 コンピュータソフトウェアの 更 なる 発 展 を 期 待 するものである ( ) まっちゃ 139 勉 強 会 : UNICODE を 使 ったサニタイジング 回 避 テクニックの 本 質 1.1 UNICODE とサニタイジング 回 避 テクニックとは で 説 明 した 参 考 資 料 の 通 りであるが 少 しだけ 本 質 論 を 記 述 する UNICODE を 使 ったサニタイジング 回 避 テクニックは セキュリティ 対 策 としてのサニタイジン グが 1. サニタイジング 処 理 ( 1) 2. 処 理 実 行 の 二 段 階 で 行 われる 処 理 の 流 れの 中 で 1 のサニタイジング 処 理 を 空 間 の 広 い UNICODE 上 で 行 い 次 段 階 の 2 の 実 際 の 処 理 作 業 時 には ANSI( 2)に 変 換 され 1 のサニタイジングされていな い(サニタイジング 処 理 を 迂 回 した)データ(メタキャラクタ)によってセキュリティ 侵 害 を 起 こす というセキュリティ 侵 害 行 為 テクニックである 結 論 UNICODE プログラムと ANSI プログラムが 並 存 している 環 境 で 発 現 する 危 険 性 がある 5

7 図 : UNICODE を 使 ったサニタイジング 回 避 テクニックの 概 要 1 図 : UNICODE を 使 ったサニタイジング 回 避 テクニックの 概 要 2 (プログラムがサニタイジングするがサニタイジング 範 囲 は 限 定 的 ) 図 : UNICODE を 使 ったサニタイジング 回 避 テクニックの 概 要 3 (プログラムが 呼 び 出 した 関 数 内 部 で ANSI へ 変 換 しているような 場 合 図 1.2-2のサニタイジングを 迂 回 される) ( 1) サニタイジング 処 理 : 本 文 書 では サニタイジング 処 理 と エスケープ 処 理 はほぼ 同 義 である 6

8 ( 2) ANSI : ここでは UNCODE 以 前 の 文 字 コードをさしている つまり 日 本 国 内 の 場 合 ASCII+SJIS または ASCII+EUC-JP などの 文 字 コードのことである 1.3 UNICODE を 使 ったサニタイジング 回 避 テクニックへの 対 策 サニタイジング 処 理 で 対 策 する 1 サニタイジング 処 理 部 で 対 策 するには サニタイジング 処 理 前 にデータを ANSI 文 字 コード に 対 しての 正 規 化 を 行 ってしまえばよい つまり 対 象 データを 一 度 ANSI に 変 換 してから もう 一 度 UNICODE へ 変 換 しなおすと いう 処 理 を 行 うことである 当 然 だが ANSI 化 されることで 国 際 化 プログラムではなくなるが 元 々UNICODE では ないモジュールを 使 っているため 国 際 化 プログラムではなくなるということはデメリット ではないだろう VisualBASIC6 では strconv() 関 数 によって UNICODE と ANSI との 変 換 が 可 能 で ある (srtconv(データ,vbfromunicode) strconv(データ,vbunicode)) VBScript 環 境 では strconv() 関 数 はないが VB の ActiveX-DLL を 作 ってもらい そ れを 使 用 するといいだろう ( 一 応 の Moji_Chk.dll の reg_unicode()を 用 意 した) C++の 場 合 Win32API の WideCharToMultiByte()/MultiByteToWideChar()を 使 って ANSI 文 字 コードに 対 して 正 規 化 した UNICODE 文 字 列 に 変 換 すればよい 図 : UNICODE を 使 ったサニタイジング 回 避 テクニックの 対 策 1 (サニタイジング 前 に ANSI に 対 しての 正 規 化 をしてしまう) 7

9 図 : UNICODE を 使 ったサニタイジング 回 避 テクニックの 対 策 2 ( 普 通 にサニタイジング 処 理 を 実 施 ) 図 : UNICODE を 使 ったサニタイジング 回 避 テクニックの 対 策 3 ( 普 通 に 内 部 的 に ANSI 変 換 するメソッドを 呼 び 出 す) 注 意 点 は 上 記 の 変 換 処 理 (UNICODE ANSI UNICODE)がコンパイラの 最 適 化 によって 省 かれないように 注 意 する 必 要 がある( ) サニタイジング 処 理 で 対 策 する 2 サニタイジング 処 理 時 に ANSI 変 換 によって 同 一 化 する UNICODE 文 字 も 考 慮 してサニタ イジング 処 理 を 行 う この 方 法 は 理 想 的 ではあるが いくつか 問 題 点 がある UNICODE から ANSI へ 変 換 する 関 数 は 複 数 種 類 あるため それぞれに 同 一 化 される 文 字 が 異 なる(2 UNICODE を 使 ったサニタイジング 回 避 テクニックの 影 響 を 参 照 ) 利 用 するモジュールがどのような 変 換 によって UNICODE から ANSI へ 変 換 されるかを モジュールを 利 用 する 側 の 開 発 者 が 把 握 しておく 必 要 があり これは 現 実 的 ではない そもそも 利 用 するモジュール 側 で ANSI 化 されるため UNICODE という 広 い 文 字 空 間 を 維 持 する 必 要 性 が 薄 い 8

10 処 理 側 で 対 策 をする 処 理 側 では 常 に UNICODE で 処 理 を 行 うように 記 述 する (より 正 確 には 与 えられた 文 字 コードのままで 処 理 を 完 結 すること) 具 体 的 には 文 字 列 を 扱 う 場 合 char 型 ではなく wchar 型 を 使 うようにする Windows-VisualC++の 場 合 tchar.h と tchar 型 を 使 い プリプロセッサの 宣 言 を _MBCS から _UNICODE に 書 き 直 す (Windows9x 系 での 動 作 に 支 障 がでる 可 能 性 に 注 意 ) 図 : VC6++SP6 のプリプロセッサの 設 定 画 面 (Win32ConspleApplication & MFC) デフォルトでは _MBCS がついてビルドされる 図 : 呼 び 出 されるメソッド 内 部 も 含 めて そもそも 全 ての 処 理 が UNICODE で 行 われていれば 問 題 はない ( ) 参 考 : 良 いニュースと 悪 いニュース (ここではコンパイラの 最 適 化 によって メモリクリアのコードが 抜 け 落 ちる 可 能 性 を 指 摘 してい る) 9

11 2 UNICODE を 使 ったサニタイジ ング 回 避 テクニックの 影 響 10

12 2.1 UNICODE を 使 ったサニタイジング 回 避 テクニックの 影 響 全 てのプログラムが UNCODE 化 される 近 未 来 においては このセキュテリィ 問 題 は 収 束 するだ ろうと 予 想 できる しかし 一 部 のソフトウェアのみが UNICODE に 対 応 している 現 状 においては U N IC O DE を 使 ったサニタイジング 回 避 テクニック は 広 範 囲 で 潜 在 的 に 存 在 しているものと 推 定 される 例 えば WindowsNT 系 列 の OS は 内 部 的 に UNICODE でありながら ANSI なプログラムを 受 け 入 れるような 下 位 互 換 性 を 保 持 している また Java 言 語 は UNICODE で 記 述 されている また Perl 言 語 Python 言 語 Ruby 言 語 など も 内 部 的 に UNICODE 化 している これらの 言 語 で 開 発 したプログラムやスクリプトが ANSI なモジュールを 利 用 する 時 UNICODE を 使 ったサニタイジング 回 避 テクニックについて 注 意 する 必 要 がある 2.2 WindowsNT 系 の 場 合 WindowsNT では 内 部 的 に UNICODE を 採 用 している 採 用 している UNICODE のコード 体 系 は 16bit 固 定 であり UCS-2 をそのまま 使 っている(UTF-16)( 一 部 に 変 則 あり) Win32API 系 の 場 合 Win32 API には WideCharToMultiByte()/MultiByteToWideChar() と いう 関 数 があり UNICODE(WideChar)と ANSI(MultiByte)の 相 互 変 換 を 行 うことができる この 関 数 を 用 いて どのように 重 複 するか 確 認 した ( 6.1 Win32 系 列 での UNICODE 変 換 リ ストのプログラムについて ) 11

13 その 結 果 は 以 下 である 0x21[!] (u0021, u00a1) 0x2d[ -] (u002d, u00ad) 0x31[ 1] (u00b9) 0x32[ 2] (u0032, u00b2) 0x33[ 3](u0033, u00b3) 0x41[ A](u0041, u00c0 ~ u00c6) 0x43[ C](u0043, u00c7) 0x44[ D](u0044, u00d0) 0x45[E ] (u0045, u00c8 ~ u00cb) 0x49[ I](u0049, u00cc ~ u00cf) 0x4e[ N](u004e, u00d1) 0x4f[ O](u004f, u00d2 ~ u00d8) 0x52[ R](u0052, u00ae) 0x54[ T](u0054, u00de) 0x55[ U](u0055, u00d9 ~ u00dc) 0x59[ Y](u0059, u00dd) 0x5c[ ] (u005c, u00a5) 0x61[ a](u0061, u00aa, u00e0 ~ u00e6) 0x64[ d](u0064, u00f0) 0x65[ e](u0065, u00e8 ~ u00eb) 0x69[ i](u0069, u00ec ~ u00ef) 0x6e[ n](u006e, u00f1) 0x6f[ o](u006f,u00ba,u00f2 ~ u00f8)0x73[ s](u0073, u00df) 0x74[ t](u0074, u00fe) 0x75[ u](u0075, u00f9 ~ u00fc) 0x79[ y](u0079, u00fd, u00ff) 0x7c[ ](u007c, u00a6) 0x3f [?]は 変 換 できない 場 合 に 変 換 されるデフォルトの 文 字 であるため 除 外 した VisualBASIC6.0SP6 系 の 場 合 MS-VisualBASIC6.0SP6 ANSI(MultiByte)の 相 互 変 換 を 行 うことができる には strconv() と いう 関 数 があり UNICODE(WideChar) と この 関 数 を 用 いて どのように 重 複 するか 確 認 した ( 6.2 MS-VisualBASIC6.0Sp6 での UNICODE 変 換 リストのプログラムについて ) その 結 果 は 以 下 である 0x21[!] (u0021, u00a1) 0x2d[ -] (u002d, u00ad) 0x31[ 1] (u0031, u00b9) 0x32[ 2] (u0032, u00b2) 0x33[ 3](u0033, u00b3) 0x41[ A](u0041, u00c0 ~ u00c6) 0x43[ C](u0043, u00c7) 0x44[ D](u0044, u00d0) 0x45[E ](u0045, u00c8 ~ u00cb)0x49[ I](u0049, u00cc ~ u00cf) 0x4e[ N](u004e, u00d1) 0x4f[ O](u004f, u00d2 ~ u00d6,u00d8) 0x52[ R](u0052, u00ae) 0x54[T](u0054, u00de) 0x55[ U](u0055, u00d9 ~ u00dc)0x59[ Y](u0059, u00dd) 0x5c[ ] (u005c, u00a5) 0x61[ a](u0061, u00aa, u00e0 ~ u00e6) 0x63[ c] (u0063, u00a9,u00e7)0x64[ d](u0064, u00f0) 0x65[ e](u0065, u00e8 ~ u00eb)0x69[ i](u0069, u00ec ~ u00ef) 0x6e[n](u006e, u00f1) 0x6f[ o](u006f,u0ba,u00f2 ~ u00f6,u00f8) 0x73[ s](u0073, u00df) 0x74[ t](u0074, u00fe) 12

14 0x75[ u](u0075, u00f9 ~ u00fc)0x79[ y](u0079, u00fd, u00ff) 0x7c[ ](u007c, u00a6) 0x814 3[,] (uff0c, u00b8) 0x814 5[ ] (u00b7, u30fb) 0x815 0[ ] (u00af, uffe3) 0x819 1[ ] (u00a2, uffe0) 0x819 2[ ] (u00a3, uffe1) 0x81c a[ ] (u00ac, uffe2) 0x81e 1[ ] (u226a, u00ab) 0x81e 2[ ] (u226b, u00b) 0x839 4[ヴ] (u3094, u30f4) 0x83c a[μ] (u00b5, u03bc) 0x3f [?]は 変 換 できない 場 合 に 変 換 されるデフォルトの 文 字 であるため 除 外 した (0x81XX 以 降 には u81xx は 含 まない) 大 部 分 は WideCharToMultiByte()/MultiByteToWideChar() 関 数 と 一 致 する NET Framework2.0 の 場 合.NET Framework2.0 には System.Text 空 間 に Encoding クラスがあり このクラスを 使 うこと で UNICODE(WideChar)と ANSI(MultiByte)の 相 互 変 換 を 行 うことができる このクラスを 用 いて どのように 重 複 するか 確 認 した ( 6.3 MS-C#での UNICODE 変 換 リス トのプログラムについて ) 用 いたバージョンは MS-Visual C# 2005 ver (.NET Framework ver ) 13

15 その 結 果 は 以 下 である 0x21[!] (u0021, u00a1) 0x2d[ -] (u002d, u00ad) 0x31[ 1] (u0031, u00b9) 0x32[ 2] (u0032, u00b2) 0x33[ 3](u0033, u00b3) 0x41[ A](u0041, u00c0 ~ u00c6) 0x43[ C](u0043, u00c7) 0x44[ D](u0044, u00d0) 0x45[E ](u0045, u00c8 ~ u00cb)0x49[ I](u0049, u00cc ~ u00cf) 0x4e[ N](u004e, u00d1) 0x4f[ O](u004f, u00d2 ~ u00d6,u00d8) 0x52[ R](u0052, u00ae) 0x54[ T](u0054, u00de) 0x55[ U](u0055, u00d9 ~ u00dc)0x59[ Y](u0059, u00dd) 0x5c[ ] (u005c, u00a5) 0x61[ a](u0061, u00aa, u00e0 ~ u00e6) 0x63[ c] (u0063, u00a9,u00e7)0x64[ d](u0064, u00f0) 0x65[ e](u0065, u00e8 ~ u00eb)0x69[ i](u0069, u00ec ~ u00ef) 0x6e[n ] (u006e, u00f1) 0x6f[ o](u006f,u0ba,u00f2 ~ u00f6,u00f8) 0x73[ s](u0073, u00df) 0x74[ t](u0074, u00fe) 0x75[ u](u0075, u00f9 ~ u00fc)0x79[ y](u0079, u00fd, u00ff) 0x7c[ ](u007c, u00a6) 0x814 3[,] (uff0c, u00b8) 0x814 5[ ] (u00b7, u30fb) 0x815 0[ ] (u00af, uffe3) 0x819 1[ ] (u00a2, uffe0) 0x819 2[ ] (u00a3, uffe1) 0x81c a[ ] (u00ac, uffe2) 0x81e 1[ ] (u226a, u00ab) 0x81e 2[ ] (u226b, u00b) 0x839 4[ヴ] (u3094, u30f4) 0x83c a[μ] (u00b5, u03bc) 0x3f [?]は 変 換 できない 場 合 に 変 換 されるデフォルトの 文 字 であるため 除 外 した 大 部 分 は WideCharToMultiByte()/MultiByteToWideChar() 関 数 と 一 致 する 2.3 Java の 場 合 Java 言 語 は 内 部 的 に UNICODE を 採 用 している Java 言 語 では <String>.getBytes(<ANSI コード 名 >)という String クラスのメソッドを 使 うこ とで UNICODE ANSI への 変 換 が 可 能 である このメソッドを 用 いて どのように 重 複 するか 確 認 した ( 6.4 Java での UNICODE 変 換 リス トのプログラムについて ) その 結 果 は 以 下 である 14

16 0x5c[ ] (u005c, u00a5) 0x7e[ ~] (u007e, u203e) 15

17 3 UNICODE を 使 ったサニタイジ ング 回 避 テクニックの 具 体 例 16

18 3.1 ANSI-C で 書 かれた Windows プログラム WindowsNT 系 の OS は 内 部 的 に UNICODE を 採 用 している しかし WindowsNT 系 の OS で 動 作 するプログラム(アプリケーション)までもが UNICODE 化 されているとは 限 らない WindowsNT 系 の OS で 動 作 するプログラムを ANSI で 記 述 した 場 合 以 降 で 実 験 している 各 種 の UNICODE を 使 ったサニタイジング 回 避 テクニックでのセキュリティ 問 題 が 潜 在 的 にあると いうことになる つまり WindowsNT 系 の OS で 動 作 する ANSI なプログラムでは ファイルパスを 含 む 文 字 列 デー タは ANSI コード(0x00 を 終 端 とする char 型 配 列 )に 縮 退 しているため このようなプログ ラムから NTFS 系 ファイルシステムへアクセスした 場 合 UNICODE を 使 ったサニタイジン グ 回 避 テクニックによって バ ッ ク ス ラ ッ シュ(0x5c) が 無 害 化 されない 危 険 性 がある WindowsNT 系 の OS で 動 作 する ANSI なプログラムでは 外 部 コマンド 呼 び 出 し 用 のコマ ンド 文 字 列 を 含 む 文 字 列 データは ANSI コード(0x00 を 終 端 とする char 型 配 列 )に 縮 退 して いるため このようなプログラムから(CMD.exe 経 由 で) 外 部 コマンドを 呼 び 出 した 場 合 U UNICODE を 使 ったサニタイジング 回 避 テクニックによってサニタイジングが 回 避 される 危 険 性 がある WindowsNT 系 の OS で 動 作 する ANSI なプログラムでは データベースへ 問 い 合 わせを 行 う SQL 文 字 列 を 含 む 文 字 列 データは ANSI コード(0x00 を 終 端 とする char 型 配 列 )に 縮 退 しているため このようなプログラムから(PostgreSQL や mysql などの バックスラッシ ュ(0x5c) でエスケープできる)データベースに 対 して SQL 実 行 を 依 頼 した 場 合 UNICODE を 使 ったサニタイジング 回 避 テクニックによってサニタイジングが 回 避 される 危 険 性 がある その 他 にもモジュールや 関 数 への 入 力 データの 書 式 によって UNICODE を 使 ったサニタイ ジング 回 避 テクニックによってサニタイジングが 回 避 される 危 険 性 がある 当 然 ANSI な Windows プログラム 上 でサニタイジング 処 理 を 実 施 していれば (サニタイジン グ 時 に 文 字 列 データは ANSI コードに 縮 退 しているため) 本 文 書 のサニタイジング 回 避 テクニック による 危 険 性 は 発 生 しない しかし ANSI プログラムの 呼 び 出 し 元 が UNICODE プログラムであり かつその UNICODE プログラムである 呼 び 出 し 元 でサニタイジング 処 理 を 実 施 している 場 合 UNICODE を 使 ったサ 17

19 ニタイジング 回 避 テクニックによってサニタイジングが 回 避 される 危 険 性 がある 一 般 的 に Windows 上 での UNICODE プログラムと ANSI プログラムでは ソースコード レ ベルで 互 換 性 がない つまり UNICODE 系 では 文 字 列 データとして wchar 配 列 を 用 い ANSI 系 では char 配 列 を 用 いる さらに 呼 び 出 す 各 種 関 数 について 異 なっている ( 一 般 的 に UNICODE 系 は W の 付 いている 関 数 を 呼 び 出 し ANSI 系 では A のついている 関 数 を 呼 び 出 す) また Windows9x 系 の OS での UNICODE 系 の 関 数 にバグが 多 かったという 過 去 の 事 例 もあり 多 くのプログラマは Windows9x 系 の OS での 動 作 を 非 動 作 にしてまで UNICODE プログラム を 作 成 するようなこともないと 思 われる 一 方 で Windows プログラムを 作 成 する 際 ANSI な Windows9x 系 と UNICODE な WindowsNT 系 でのソースコードの 互 換 性 を 取 るために tchar.h を 使 うことがしばしばある このように tchar.h を 使 ってソースコードを 作 成 した 場 合 Windows9x 系 では ANSI プログラム として 動 作 し WindowsNT 系 では UNICODE プログラムとして 動 作 させることができる しかし UNICODE 系 になるのか ANSI 系 になるのかは プログラム 実 行 時 に 決 定 されることで はなく コンパイル 時 に 決 定 される つまり プログラムのバイナリ 形 式 は 異 なるのである (よく Win9x 系 と WinNT 系 でインストーラが 異 なるのはこのためである また Setup.exe は 同 一 でありながらそこから 呼 び 出 される msi ファイルが UNICODE 版 と ANSI 版 に 分 けられてい る 場 合 もある) 18

20 図 : tchar.h を 使 ったプログラムの Windows95 SP1 での 実 行 例 図 : tchar.h を 使 ったプログラムの WindowsXP SP2 での 実 行 例 ( 図 3.1-1と 同 一 バイナリ) バイナリが 同 一 だと WinNT 系 でも ANSI なプログラムとして 動 作 する 19

21 図 : tchar.h を 使 ったプログラムの WindowsXP SP2 での 実 行 例 (_UNICODE オプション 付 ビルド) また この tchar.h のデフォルトであるが MS-VisualC++6.0SP6 では _ M B CS である つ まり ANSI である 全 てではないが MS-VisualC++6.0SP6 のウィザードによって 生 成 されるプロジェクトでの ビ ルド 構 成 の 多 くは コンパイル 時 に _MBCS を 指 定 している この 設 定 の 変 更 は プリプロセッサの 定 義 を 変 更 することである ( メニュー プロジェク ト 設 定 C/C++ プリプロセッサの 定 義 ) 以 上 のことから 推 測 すると Windows9x 系 でも WindowsNT 系 でも 動 作 する 同 一 バイナリの Windows プログラムは _ M B CS オプションでコンパイルされているのではないか 思 われる つまり このような Windows プログラムを WindowsNT 系 で 動 作 させた 場 合 UNICODE を 使 ったサニタイジング 回 避 テクニックによってサニタイジングが 回 避 される 危 険 性 を 誘 発 する 恐 れ がある また COM についても 内 部 的 に UNICODE 処 理 していない 場 合 この COM を 呼 び 出 した 場 合 ( 呼 び 出 し 元 は 内 部 的 に UNICODE で 処 理 されるスクリプトなどが 多 いと 思 われる) UNICODE を 使 ったサニタイジング 回 避 テクニックによってサニタイジングが 回 避 される 危 険 性 を 誘 発 する 恐 れがある 以 下 は 6.6Variant 型 の 引 数 を ANSI で 受 け 取 るメソッドと Unicode(Binary)で 受 け 取 るメソッ ドのある COM(MS-VC++6.0SP6) を の COM を 呼 び 出 すテストスクリプト から 呼 び 出 し 結 果 である 20

22 図 : で 紹 介 したプログラムの 実 行 結 果 このように 例 え COM のメソッドであったとしても コーディングのしやすさ(wchar 配 列 のコ ーディング 例 よりも char 配 列 についてのコーディング 指 南 書 や 教 科 書 が 多 い)から モジュール のメソッドの 内 部 で ANSI への 置 換 処 理 を 行 っている 可 能 性 もある 実 際 に 筆 者 の 一 人 が 公 開 しているソフトウェア( i-8.stm 以 下 )の MS-VC++6.0 で 記 述 された COM プログラムは 文 字 列 処 理 として ANSI を 採 用 している 結 論 として Windows 上 でプログラムをする 場 合 極 力 wchar 型 でコーディングすることで UNICODE を 使 ったサニタイジング 回 避 テクニックを 抑 えることが 可 能 である また char 型 で のコーディング 時 には 使 用 者 (モジュールを 使 用 しているスクリプターなど)にその 旨 通 知 し スク リプターは 必 要 に 応 じて ANSI への 正 規 化 処 理 などの UNICODE を 使 ったサニタイジング 回 避 テクニック 対 策 を 実 装 させるようにして 使 わせることでも UNICODE を 使 ったサニタイジング 回 避 テクニックを 抑 えることが 可 能 である 21

23 3.2 Windows ファイルシステム Windows ファイルシステムでは バックスラッシュ(0x5c) がパスのデリミタとして 機 能 して いる つまり UNICODE 上 で バックスラッシュ(u005c) をチェックしていたとしても 円 記 号 (u00a5) をチェックしていないということになり ANSIモジュールによって 円 記 号 (u00a5) が0x5cのANSI 文 字 (バックスラッシュ)へと 置 き 換 えられてしまう Scripting.FileSystemObject オブジェクト(WSH5.6) WSH/ASP/VB などでファイルアクセスする 時 使 われるオブジェクトである ソースコードは 6.10 VB の Open ステートメントと Scripting.SystemFileObject オブジェクト を 使 ったファイル 読 み 出 しプログラム (VB6SP6) を 参 照 今 回 は (WSH や ASP などと 比 較 して)バイナリ 処 理 が 簡 単 な VisualBASIC6.0SP6 を 選 択 した このプログラムでは U N IC O D E B ug チェックをつけると バックスラッシュ(0x5c) を 円 記 号 (u00a5)に 変 換 する a(u00a5)test.txt というファイルを 作 る 流 れが 図 ~ 図 である 図 より u 0 0 a5 がディレクトリデリミタの バックスラッシュ(0x5c) に 置 換 されていないた め Scripting.FileSystemObject を 使 う 限 りにおいて UNICODE を 使 ったサニタイジング 回 避 テクニックのセキュリティ 上 の 問 題 はない 22

24 図 : テストプログラム 実 行 前 図 : ScriptingFileSystem オブジェクトで a(u00a5)test.txt というファイルを 作 る 23

25 図 : 図 の 結 果 ( u00a5 がファイル 名 となり 問 題 はない) open ステートメント(VisualBASIC6.0SP6) VisualBASIC では 旧 来 からファイル アクセス 時 に 用 いている open ステートメントがある この open ステートメントを 使 った 場 合 に UNICODE を 使 ったサニタイジング 回 避 テクニック の 脆 弱 性 があるかどうか 確 かめてみた 図 ~ 図 がそれである ソースコードは 6.10 VB の Open ステートメントと Scripting.SystemFileObject オブジェクト を 使 ったファイル 読 み 出 しプログラム (VB6SP6) を 参 照 この 図 より a(u00a5)test1.txt というファイルを 作 成 しようとしたのにも 関 わらず open ステ ートメントでは u 0 0 a5 をディレクトリ デリミタの バックスラッシュ(0x5c) に 変 換 して しまっていることが 分 かる つまり バ ッ ク ス ラ ッシュ のサニタイジング 処 理 を 回 避 される 可 能 性 がある 24

26 open ステートメントを 呼 び 出 す 前 にディレクトリ トラバーサル 問 題 対 策 のために..(0x5c) などサニタイジング 処 理 を 行 っていたとしても..(u00a5) を 与 えることで 任 意 のファイルへ のアクセスが 可 能 となる 図 : 今 度 は open ステートメントにチェックする 図 : 図 の 結 果 25

27 3.2.3.NET Framework 2.0.NET Framework の 文 字 コードは UNICODE である NTFS のファイル 名 も UNICODE であり.NET のような 比 較 的 最 近 登 場 した 開 発 環 境 がわざわ ざ 内 部 的 に ANSI コードを 利 用 しているとは 考 えにくい とはいえ 実 際 にテストプログラムを 作 成 し 確 認 してみた テストプログラムは C#で 記 述 した 実 験 環 境 は C# 2005 ver net Framework ver (MS-Windows2000 SP4 [ 日 本 語 版 ])である ソースコードは 6.11.NET Framework でファイルを 作 るプログラム (C#) を 参 照 図 を 見 ての 通 り ファイルパス 中 の u00a5 がそのまま UNICODE としてファイル 名 の 一 部 になっていることから 本 文 書 のサニタイジング 回 避 テクニックは 利 用 できない 図 :.NET プログラムと UNICODE ファイルパス 26

28 3.2.4 Windows 上 での Java Java 言 語 は 内 部 処 理 は UNICODE で 行 っている Java 言 語 のファイルシステムへのアクセスでは File クラスを 使 うのが 基 本 的 な 方 法 である 実 際 にテストをしてみた 結 果 Windows 上 での Java プログラムは ファイル 名 を UNICDE で 扱 っており UNICODE を 使 ったサニタイジング 回 避 テクニックの 危 険 性 は 発 生 しない 図 のように c: java a(u00a5)test.txt というファイルが c: java a test.txt とし てファイルが 生 成 されていないことから Windows 上 での Java のファイルアクセスにおいては UNICODE を 使 ったサニタイジング 回 避 テクニックの 危 険 性 は 発 現 しないものと 思 われる 図 : Java プログラムと UNICODE ファイルパスと Windows 27

29 3.2.5 Windows 上 での Python2.4.2 現 在 スクリプト 言 語 全 盛 の 時 代 であるが Perl,Python,Ruby は Windows 上 でも 動 作 する これらのファイルアクセスについても 調 査 した Python の 最 新 版 は UNICODE 化 されており Windows 上 で 動 作 する Python を 用 いてテスト した ( 実 行 環 境 は Python (#67, Sep , 12:41:11) [MSC v bit (Intel)] on win32) ソースコードは 6.9 Python で 書 かれたファイル 読 み 出 しプログラム である 結 果 は 図 である このことから ファイルパス 中 の u00a5 記 号 が ディレクトリデリミタの バックスラッシ ュ(0x5c) に 置 換 されることはないということになる つまり Python で 書 かれたスクリプトで のファイルパスによる UNICODE を 使 ったサニタイジング 回 避 テクニックの 影 響 はない という ことになる 図 : テスト 前 のディレクトリ 状 態 c: z 以 下 c: z a 以 下 には unicode.py 以 外 はない 28

30 図 : テスト 実 行 後 c: z 直 下 にファイルができていることから UNICODE バグの 問 題 はない 29

31 3.3 Windows の OS コマンド 呼 び 出 しについて Windows では (0 x 7 c) が UNICODE から ANSI への 変 換 で 同 一 化 される 文 字 になっている (0x7c) はパイプである しかし Windows シェル(CMD.EXE)は 基 本 的 に UNICODE で 処 理 されるため 問 題 ないはずである また Windows 上 のモジュールはシェルを 経 由 することな く 外 部 コマンドを 実 行 する 場 合 が 多 いため そもそも OS コマンドインジェクション の 危 険 性 は 少 ない( 引 数 の 強 制 指 定 という 脅 威 の 可 能 性 は 否 定 しない) しかし ANSI な system() 関 数 を 用 いている 場 合 (0 x 7 c) のサニタイジングに 注 意 する 必 要 がある WindowsScriptingHost 5.6 の WScript.Shell オブジェクトの Run()メソッド WSH で 外 部 コマンドを 実 行 する 場 合 WScript.Shell オブジェクトの Run メソッドを 使 うこと が 多 い Run メソッド 自 体 は cmd.exe を 呼 び 出 していないため OS コマンドインジェクション とは 無 縁 の 存 在 ではある( 図 と 図 ) ( 引 数 の 強 制 指 定 という 脅 威 の 可 能 性 は 否 定 しない) しかし Run メソッドから cmd.exe を 呼 び 出 して 外 部 コマンドを 使 えば (0 x 7 c) (パイプ)な どのシェルの 機 能 を 利 用 することができる そこで Run メソッドは 内 部 的 にどのような 文 字 コードを 使 っているか 調 査 したのが 図 と 図 である 図 と 図 で 結 果 が 異 なっていることから u00a6 の 記 号 は シェルのパイプ(0x7c) を 意 味 するコードに 変 換 されないことが 分 かる よって WScript.Shell の Run メソッドは UNICODE を 使 ったサニタイジング 回 避 テクニック に 対 して 安 全 である ちなみに 外 部 コマンドとして 呼 び 出 しているプログラムは a.exe,b.exe 共 に 6.14 外 部 コマン ド 呼 び 出 しによって 呼 び 出 されるプログラム を VisualC++6.0SP6 でコンパイルしたものをファ イル 名 を a.exe および b.exe として 保 存 したものである 30

32 図 : a.exe b.exe の 結 果 b.exe.txt がないことから 以 下 はコマンドとして 実 行 されていない (cmd.exe を 明 示 的 に 呼 び 出 す 必 要 がある) 図 : cmd.exe /c a.exe b.exe の 結 果 (cmd.exe を 明 示 的 に 呼 び 出 すことで パイプ 機 能 を 利 用 できる) 31

33 図 : cmd.exe /c a.exe & chrw(124) & b.exe の 結 果 図 と 同 じなので 同 じ 結 果 となっている (chrw() 関 数 の 確 認 ) 図 : cmd.exe /c a.exe & chrw(166) & b.exe の 結 果 図 とは 異 なり 以 下 がコマンドとして 実 行 されていない 32

34 3.3.2 WindowsScriptingHost5.6 の WScript.Shell オブジェクトの Exec()メソッド WSH で 外 部 コマンドを 実 行 する 場 合 WScript.Shell オブジェクトの Exec メソッドを 使 うこと が 多 い Run メソッドは 標 準 出 力 が 取 得 できないが Exec メソッドで 取 得 することができる Exec メソッド 自 体 は cmd.exe を 呼 び 出 していないため OS コマンドインジェクション とは 無 縁 の 存 在 ではある( 図 と 図 ) ( 引 数 の 強 制 指 定 という 脅 威 の 可 能 性 は 否 定 しない) しかし Exec メソッドから cmd.exe を 呼 び 出 して 外 部 コマンドを 使 えば (0 x 7 c) (パイプ)な どのシェルの 機 能 を 利 用 することができる そこで Exec メソッドは 内 部 的 にどのような 文 字 コードを 使 っているか 調 査 したのが とである とで 結 果 が 異 なっていることから u00a6 の 記 号 は シェルのパイプを 意 味 するコード (0x7c) に 変 換 されないことが 分 かる よって WScript.Shell の Exec メソッドは UNICODE を 使 ったサニタイジング 回 避 テクニック に 対 して 安 全 である 33

35 図 : a.exe b.exe の 結 果 b.exe.txt がないことから 以 下 はコマンドとして 実 行 されていない (cmd.exe を 明 示 的 に 呼 び 出 す 必 要 がある) 図 : cmd.exe /c a.exe b.exe の 結 果 (cmd.exe を 明 示 的 に 呼 び 出 すことで パイプ 機 能 を 利 用 できる) 34

36 図 : cmd.exe /c a.exe & chrw(124) & b.exe の 結 果 図 と 同 じなので 同 じ 結 果 となっている (chrw() 関 数 の 確 認 ) 図 : cmd.exe /c a.exe & chrw(166) & b.exe の 結 果 図 とは 異 なり 以 下 がコマンドとして 実 行 されていない 35

37 3.3.3 VisualBASIC6.0SP6 の Shell()メソッド VisualBASIC6.0 で 外 部 コマンドを 実 行 する 場 合 上 記 の WSH のオブジェクトを 利 用 する 場 合 もあるが VisualBASIC6.0 には 外 部 コマンド 呼 び 出 しに Shell()メソッドが 用 意 されている Shell()メソッド 自 体 は cmd.exe を 呼 び 出 していないため OS コマンドインジェクション と は 無 縁 の 存 在 ではある( 図 ~ 図 ) ( 引 数 の 強 制 指 定 という 脅 威 の 可 能 性 は 否 定 しない) しかし Shell()メソッドから cmd.exe を 呼 び 出 して 外 部 コマンドを 使 えば (0 x 7 c) (パイプ) などのシェルの 機 能 を 利 用 することができる そこで Shell()メソッドは 内 部 的 にどのような 文 字 コードを 使 っているか 調 査 したのが 図 ~ 図 である 図 ~ 図 と 図 ~ 図 では 結 果 が 異 なっていることから u00a6 の 記 号 は シェルのパイプを 意 味 するコード (0x7c) に 変 換 されないことが 分 かる よって VisualBASIC6.0SP6 の Shell()メソッドは UNICODE を 使 ったサニタイジング 回 避 テ クニックに 対 して 安 全 である 図 : a.exe b.exe を shell に 与 えた 36

38 図 : 図 の 結 果 b.exe.txt がないことから 以 下 はコマンドとして 実 行 されていない (cmd.exe を 明 示 的 に 呼 び 出 す 必 要 がある) 図 : cmd.exe /c a.exe b.exe を shell()に 与 えた 37

39 図 : 図 の 結 果 cmd.exe を 呼 び 出 せば を 使 うことができる a.exe.txt b.e x e.txt 共 に 作 成 されたので 以 下 がコマンドとして 実 行 された 図 : cmd.exe /c a.exe (u00a6) b.exe を shell()に 与 えた 38

40 図 : 図 の 結 果 を u00a6 に 変 換 した 場 合 は a.exe.txt のみ 作 成 されたので UNICODE を 使 ったサニタイジング 回 避 テクニックは 発 生 しない 39

41 3.4 Linux/Unix の OS コマンド 呼 び 出 しについて Linux/Unix のシェル sh/csh では (0 x 5 c) がエスケープ 文 字 として 定 義 されている Linux/Unix 上 のモジュールは 外 部 コマンドを 呼 び 出 す 場 合 シェルを 経 由 する 場 合 が 少 なくなく そのような 場 合 OS コマンドインジェクション 対 策 としてのエスケープ 処 理 ( (0x5c) を 使 ったエスケープ 処 理 )を 回 避 される 危 険 性 がある Java1.6.0 の java.lang.runtime.クラスの exec メソッド (PlamoLinux4.0.3 [LANG=EUC-JP]) Linux/Unix 上 の Java から 外 部 コマンドを 呼 び 出 す 場 合 についてテストした 実 行 環 境 は PlamoLinux4.0.3 (GNU bash version3.00.0, OUTPUT_CHARSET=EUC-JP, LANG=ja_JP.eucJP) 上 に JDK1.6.0 をインストールした 環 境 で 行 った ソースコードは 6.15 外 部 コマンド 呼 び 出 しを 行 う Java プログラム である 一 般 的 に Linux/Unix 上 で OS コマンドを 呼 び 出 す 場 合 内 部 的 に sh などのシェルが 呼 び 出 され ている 場 合 が 多 い しかし Java1.6.0 の java.lang.runtime クラスの exec メソッドでは シェルを 経 由 せずに 外 部 コマンドが 呼 び 出 されている そのため OS コマンドインジェクション とは 無 縁 の 存 在 ではある ( 引 数 の 強 制 指 定 という 脅 威 の 可 能 性 は 否 定 しない) しかし sh を 呼 び 出 して 外 部 コマンドを 使 えば (0 x 7 c) (パイプ)やリダイレクトのシェルの 機 能 を 利 用 することができる そこで どのようにエスケープされていくかを 調 査 した( 図 ~ 図 ) 図 では 第 二 引 数 (bash -c へ 渡 されるコマンド 文 字 列 )に >(リダイレクト 記 号 ) を 与 えることで 標 準 出 力 のリダイレクトするこができる 事 を 確 認 し 図 では > のエス ケープに > で 可 能 であることを 確 認 した( 画 面 に Hello>out.txt と 表 示 されている) 最 後 に u00a5 を 与 えた 時 の 挙 動 が 図 の 最 後 の 部 分 である 図 の 最 後 の 部 分 から u 0 0 a5 を 与 えることでシェルへ 与 えるテキストインターフェイスに 対 するエスケープ 40

42 処 理 を 迂 回 することがでることが 確 認 された 以 上 より Java を Linux 上 で 実 行 しているアプリケーションでシェル 経 由 で 外 部 コマンドを 呼 び 出 している 場 合 UNICODE を 使 ったサニタイジング 回 避 テクニックにより OS コマンド インジェクション 問 題 が 発 現 する 可 能 性 がある % javajshell usage:java JShellopt1 ComandString opt1 =0:none 1:0x5c escape 2:0x5c->0xa5 and0x5c escape % javajshel 0echo Hello InputData=echo Helo ComandLine=bash -c echo Hello Helo % ls JShell.class JShell.java % javajshel 0echo Hello >out.txt InputData=echo Helo>out.txt ComandLine=bash -c echo Hello>out.txt % ls JShell.class JShell.java out.txt % typeout.txt Helo 図 : usage と 簡 単 な 実 行 例 41

43 % javajshel 1echo Hello >out.txt InputData=echo Helo>out.txt ComandLine=bash -c echo Hello >out.txt Hello>out.txt % ls JShell.class JShell.java % javajshel 2echo Hello >out.txt InputData=echo Helo >out.txt ComandLine=bash -c echo Hello >out.txt % dir JShell.class JShell.java out.txt % typeout.txt Helo 図 : 0x5c へエスケープすることで >(リダイレクト 記 号 ) をエスケープすることができるが u005c を u00a5 に 変 更 することで u00a5 のエスケープが 行 われず 結 果 として 0x5c のエスケープ 漏 れが 発 生 する Java1.6.0 の java.lang.runtime.クラスの exec メソッド (CentOS4.4 [LANG=UTF-8]) Linux/Unix 上 の Java から 外 部 コマンドを 呼 び 出 す 場 合 についてテストした 実 行 環 境 は CentOS4.4 (GNU bash version , LANG=ja_JP.UTF-8) 上 に JDK1.6.0 をイン ストールした 環 境 で 行 った ソースコードは 6.15 外 部 コマンド 呼 び 出 しを 行 う Java プログラム である 環 境 変 数 LANG が UTF-8 の 場 合 呼 び 出 し 先 のシェルが Unicode 化 されているものと 考 え 42

44 れる 結 果 として 図 のように u005c と u00a5 が 区 別 され 本 文 書 が 指 摘 する UNICODE を 使 ったサニタイジング 回 避 テクニックは 利 用 できないことが 確 認 された 図 : シェル(または OS)が Unicode 化 されれば UNICODE を 使 った サニタイジング 回 避 テクニック を 使 うことができない 43

45 3.5 PostgreSQL/mySQL の SQL 利 用 時 PostgreSQL/mySQL では を と エ ス ケ ープすることができる ( を にエ スケープする 必 要 もある) このような 機 能 があるため 円 記 号 (u00a5) と バックスラッシュ(u005c) による 挙 動 を 確 認 してみた Windows 上 での PostgreSQL8.0.3(pgODBC )と VisualBASIC6.0SP6 基 本 的 には デフォルトインストール 状 態 の PostgreSQL に 対 して ODBC 経 由 で VisualBASIC からアクセスした VisualBASIC 上 では と の サ ニ タ イ ジ ング 処 理 を 実 施 している 図 : 中 央 上 のテキストボックス( IE という 文 字 があるボックス)がサニタイジング 対 象 図 : エラー 処 理 などは 実 施 していないので a ru yo naiyo ダイアログよりも エラーとなるかどうかがポイント 44

46 図 : を 与 える U N IC O D E bug にチェックを 入 れると 内 部 的 に バックスラッシュ を 円 記 号 に 変 換 する 図 : 図 の 結 果 ( 円 記 号 が (0x5c) になったため SQL 文 法 エラーとなる) 図 : IE を 与 えた( 円 記 号 が になることを 見 越 して としてみた) 図 : 図 の 結 果 45

47 以 上 より Windows 版 PostgreSQL の SQL 解 釈 部 は ANSI 文 字 で 行 っているものと 推 測 され る よって Windows 版 PostgreSQL と VisualBASIC(VBScript も 同 様 だと 思 われる)の 組 み 合 わせでは UNICODE を 使 ったサニタイジング 回 避 テクニックにより SQL インジェクション 問 題 が 発 現 する 可 能 性 がある Windows 上 での mysql4.1.2alpha(myodbc )と VisualBASIC6.0SP6 基 本 的 には デフォルトインストール 状 態 の mysql に 対 して ODBC 経 由 で VisualBASIC か らアクセスした VisualBASIC 上 では と の サ ニ タ イ ジ ング 処 理 を 実 施 している 図 : 中 央 上 のテキストボックス( IE という 文 字 があるボックス)がサニタイジング 対 象 図 : エラー 処 理 などは 実 施 していないので a ru yo naiyo ダイアログよりも エラーとなるかどうかがポイント 46

48 図 : を 与 える U N IC O D Ebug にチェックを 入 れると 内 部 的 に バックスラッシュ を 円 記 号 に 変 換 する 図 : 図 の 結 果 ( 円 記 号 が (0x5c) になったため SQL 文 法 エラーとなる) 図 : IE を 与 えた( 円 記 号 が になることを 見 越 して としてみた) 図 : 図 の 結 果 以 上 より Windows 版 mysql の SQL 解 釈 部 は ANSI 文 字 で 行 っているものと 推 測 される よって Windows 版 mysql と VisualBASIC(VBScript も 同 様 だと 思 われる)の 組 み 合 わせでは 47

49 UNICODE を 使 ったサニタイジング 回 避 テクニックにより SQL インジェクション 問 題 が 発 現 す る 可 能 性 がある 48

50 3.6 MS-XML COM オブジェクト XML 文 書 を DOM オブジェクトとして 利 用 するために Microsoft は Microsoft XML コアサー ビスを 提 供 している この MS-XML コアサービスでは XPath による XML 文 書 の 検 索 処 理 を 行 うことができる XPath による XML 文 書 の 検 索 では ユーザから 渡 される 汚 染 されたデータは XPath の 検 索 条 件 部 分 に 配 置 される 場 合 が 一 般 的 であろう この MS-XML コアサービスでは この 検 索 条 件 部 分 では 以 下 のエスケープ 処 理 を 行 うことが XPath Injection 対 策 になる が 出 てきたので 本 文 書 による 回 避 テクニックが 使 える 可 能 性 がある Microsoft.XMLDom オブジェクト(VB6SP6) (XML 文 書 は SJIS) WSH/ASP/VB などで XML 文 書 にアクセスする 時 使 われる DOM オブジェクトである ソースコードは 6.16 MS-XML コアサービスの COM オブジェクトを 使 った XML 文 書 検 索 プ ログラム (VB6SP6) を 参 照 今 回 は (WSH や ASP などと 比 較 して)バイナリ 処 理 が 簡 単 な VisualBASIC6.0SP6 を 選 択 した このプログラムでは U N IC O D EB ug チェックをつけると バ ッ ク スラッシュ(u005c) を 円 記 号 (u00a5) に 変 換 する 最 上 位 のテキストボックスが XML 文 書 のファイルパスである 最 下 位 のテキストボックスが XPath による XML 文 書 の 検 索 結 果 である Escape というチェックボックスがオンの 場 合 XPath の 検 索 条 件 を に エ ス ケ ープする 本 文 書 の 回 避 テクニックの 本 質 は UNICODE ANSI 変 換 の 縮 退 と 関 係 があるため XML 文 書 は SJIS とした( 図 ) 49

51 検 索 対 象 に が 含 まれている 場 合 MS-XML コアサービスでは に エ ス ケ ープす る 必 要 がある( 図 ) 次 に 検 索 対 象 に が 含 まれている 場 合 MS-XML コアサービスでは に エス ケープする 必 要 がある( 図 ) 最 後 に 上 記 の 組 み 合 わせであるが 検 索 対 象 に が 含 まれている 場 合 MS-XML コアサービ スでは に エ ス ケ ープする 必 要 がある( 図 ) 最 後 に 検 索 文 字 列 中 の バックスラッシュ(0x5c) を 円 記 号 (u00a5) に 置 換 してみた 結 果 が 図 である UNICODE を 使 ったサニタイジング 回 避 テクニックが 可 能 であると 推 定 していたのであるが 図 を 見 ても 分 かるように 入 力 された 検 索 条 件 中 の u00a5 は (0x5c,0x5c) {エスケー プされた } として 内 部 的 に 解 釈 を 行 っているのではないかと 推 定 される 結 論 として VB/ASP/WSH などから ANSI な XML 文 書 に 対 して MS-XML コアサービスを COM を 使 う 場 合 UNICODE を 使 ったサニタイジング 回 避 テクニックに 対 して 安 全 である 図 : 対 象 とした XML 文 書 (SJIS) 50

52 図 : を 含 んだ 検 索 には を にエスケープする 図 : を 含 んだ 検 索 には を にエスケープする 51

53 図 : を 含 んだ 検 索 には を にエスケープする 図 : を u00a5 にしてみた 結 果 52

54 3.7 LDAP インジェクション LDAP 検 索 フィルタに 対 して 細 工 したデータを 注 入 することによって 検 索 条 件 を 改 変 するセ キュテリィ 侵 害 行 為 は LDAP インジェクション と 呼 ばれている RFC2254 に 検 索 フィルタのエスケープ 処 理 が 規 定 されている RFC2254 では * ( ) ヌル 文 字 を を 前 方 に 付 与 して 2 文 字 の 16 進 表 示 にす る と 規 定 されている が 登 場 しているため UNICODE を 使 ったサニタイジング 回 避 テクニックが 使 えそうだが 上 記 のメタキャラクタを 16 進 表 示 へと 変 換 するため UNICODE を 使 ったサニタイジング 回 避 テクニックは 利 用 できない 基 本 的 には LDAP インジェクション 対 策 としてのエスケープ 処 理 は UNICODE を 使 ったサニ タイジング 回 避 テクニックに 対 して 安 全 であると 思 われる 53

55 3.8 XSS(Cross-Site Scripting) (JavaScript インジェクション) XSS 問 題 のセキュリティ 対 策 としてのサニタイジングは HTML エンコード 処 理 が 基 本 である( 出 力 位 置 のほとんどが HTML 中 のため) HTML 中 に 入 力 された 汚 染 データを 差 し 込 む 場 合 は HTML エンコード 処 理 が 最 適 なエンコー ド 法 であるが 多 くの Web アプリケーションでは JavaScript 中 に 差 し 込 む 場 面 も 多 い まず 入 力 された 汚 染 データが JavaScript コードそのものであってはならない JavaScript 中 の 変 数 の 初 期 値 として 入 力 データを 使 う 場 面 は 多 くの Web アプリケーションで 想 定 されるだろう このような 場 合 入 力 された 汚 染 データを 数 値 として 利 用 する 場 合 数 値 として 適 切 であるかどうかの 判 定 を 行 う 文 字 列 として 利 用 する 場 合 以 下 のエスケープ 処 理 を 実 施 する というサニタイジング 処 理 を 施 すことにより 入 力 データを 適 切 に 扱 うことが 可 能 である さて JavaScript の 文 字 列 値 のエスケープとして が 登 場 したので UNICODE によるサニ タイジング 回 避 テクニックが 使 えるかどうか 調 査 してみた JavaServlet Java での Web アプリケーションの 場 合 について 観 察 した 観 察 した Java 環 境 は WindowsXP SP2 日 本 語 版 で 動 作 する JDK1.5.0_06 + Tomcat で ある ちなみに Eclipse3.1.2 で 開 発 した ソースコードは 6.19 JavaScript の 文 字 列 の 初 期 値 として 使 用 する JavaServlet である Java の 場 合 Request オブジェクトに 対 して setcharacterencoding()メソッドによって 文 字 コ ードを 指 定 することができる ここでは ANSI である Windows-31J を 指 定 している 実 験 のポイントは Tomcat の 仕 様 変 更 である Tomcat4 系 から Tomcat5 系 へのバージョンアッ 54

56 プによって クエリー 文 字 列 は 常 に UTF-8 として 受 け 取 るように 仕 様 が 変 更 された この 仕 様 変 更 に 着 目 することで ANSI の 世 界 でデータ 処 理 そしてデータ 出 力 を 行 っている JavaServlet に 対 して UTF-8 の 世 界 の 文 字 を 与 えることができる よって Client-Side の JavaScript コード 中 に 入 力 データを 差 し 込 む 際 に HTML エンコード 処 理 ではなく JavaScript のエスケープ 処 理 を 行 っている 場 合 かつ 出 力 する HTML が ANSI コ ードの 場 合 本 文 書 のサニタイジング 回 避 テクニックによって 任 意 の JavaScript コードを 挿 入 される 危 険 性 がある( 図 ~ 図 ) 図 : クエリー 文 字 列 に a b を 与 えた 結 果 HTML 中 では HMTL エンコードを 行 い JavaScript 中 では JavaScript のエスケープ 処 理 を 実 施 することで XSS 対 策 のサニタイジング 処 理 となる 55

57 図 : クエリー 文 字 列 に XSS 試 験 用 文 字 列 を 与 えた 結 果 クエリー 中 の %a5 は u00a5( 円 記 号 )が JSEscape()メソッドではエスケープされずに HTML 中 では 0x5c(パックスラッシュ)となり XSS 問 題 が 発 現 する 56

58 4 アタックベクタ 57

59 4.1 Web アプリケーション 以 下 では 各 Webアプリケーションに 対 してWebブラウザから 送 り 込 まれるUNICODEデータは どのように 処 理 されるかを 観 察 する 結 論 としては 当 然 のことだが UNICODE で 受 け 取 るような 設 定 (デフォルトの 場 合 や 開 発 者 が 明 示 する 場 合 )にしていた 場 合 は UNICODE を 使 ったサニタイジング 回 避 テクニックを 利 用 され る 危 険 性 がでてくる 老 婆 心 ながら そもそも Web アプリケーションで 使 われているモジュール 全 てが UNICODE 化 されていれば 本 文 書 の 回 避 テクニックによる 脅 威 はない IIS5.1 上 の ASP IIS 上 で 動 く ASP(Active Server Pages)プログラムは UNICODE をどのように 扱 っているのか を 観 察 する 観 察 した 対 象 は IIS5.1 (WindowsXP Sp2 日 本 語 版 )で 観 察 した 観 察 対 象 は バックスラッシュ(u005c) と 円 記 号 (u00a5) を 使 い 同 一 のバイト 列 に 変 換 さ れるのか 異 なるバイト 列 として 処 理 されるのかを 観 察 する ソ ース コードは 6.18 IIS-ASP の 文 字 列 データ(String in Variant)の バイト 列 表 示 (10 進 )(ActiveX DLL by VB6SP6) および 6.19 JavaScript の 文 字 列 の 初 期 値 として 使 用 する JavaServlet である 通 常 の ASP 開 発 では 特 に CodePage の 設 定 は 行 わないだろう test.asp は CodePage を 設 定 していない ASP プログラムである この test.asp に 対 して %u005c%u00a5 を 与 えた 結 果 が 図 である UNICODE の 円 記 号 (u00a5) が ASP プログラム 中 で 既 に バックスラッシュ(u005c) に 縮 退 しているため 本 文 書 の 回 避 テクニックは 利 用 できない つぎに %a5 を 与 えた 結 果 が 図 である 文 字 化 けしているため 本 文 書 の 回 避 テクニ ックは 利 用 できない 最 後 に UTF-8 表 現 である %2c%a5 を 与 えた 結 果 が 図 である バイナリ 的 には 円 記 号 (u00a5) ではないため 本 文 書 のテクニックは 利 用 できない と 判 断 で きるが 画 面 上 には 円 記 号 が 表 示 されている もう 少 し 検 討 の 余 地 がある 58

60 以 上 の 結 果 から ASP 開 発 者 が 特 別 に CodePage を 設 定 しない 場 合 Web ブラウザから 与 え られたデータは 非 UNICODE 文 字 として 正 規 化 されると 評 価 しても 問 題 ないだろう(UTF-8 書 式 での 入 力 にはまだ 検 討 の 余 地 がある) つまり このような ASP プログラムをインターフェイスとして 本 文 書 の UNICODE を 使 ったサ ニタイジング 回 避 テクニックは 使 用 できない ということである ASP プログラムで UNICODE を 扱 う 場 合 C o d e P a ge を 明 示 的 に 指 定 する 方 法 がある testu.asp では UTF-8 となるように 明 示 している testu.asp に 対 して % u 00a5 % a5 % c 2 % a5 を 与 えた 結 果 が 図 ~ 図 であ る 図 のように バ ッ ク スラッシュ と 円 記 号 が 異 なるバイト 列 で 内 部 的 に 扱 われているのが 分 かる このように ASP プログラムで 明 示 的 に CodePage を UTF-8 を 指 定 している 場 合 この ASP プログラムを 経 由 した 攻 撃 で UNICODE を 使 ったサニタイジング 回 避 テクニックが 利 用 できる ということになる 図 : codepage はデフォルトのままで %u00a5 を 与 えた 場 合 の 結 果 図 : codepage はデフォルトのままで %a5 を 与 えた 場 合 の 結 果 59

61 図 : codepage はデフォルトのままで %c2%a5 を 与 えた 場 合 の 結 果 図 : ASP 上 で 明 示 的 に codepage を UTF-8 に 設 定 し % u00a5 を 与 えた 場 合 の 結 果 図 : ASP 上 で 明 示 的 に codepage を UTF-8 に 設 定 し % a5 を 与 えた 場 合 の 結 果 図 : ASP 上 で 明 示 的 に codepage を UTF-8 に 設 定 し % 2 c % a5 を 与 えた 場 合 の 結 果 ( ) 本 文 書 とは 無 関 係 であるが ASP でコードページを 指 定 する 場 合 の MS-KB を 見 つけたのでリンクする コードページが UTF8 に 設 定 されていると ASP スクリプトでタイプライブラリを 使 用 できない 60

62 4.1.2 ASP.NET IIS 上 で 動 く ASP.NET プログラムは UNICODE をどのように 扱 っているのかを 観 察 する 観 察 した 対 象 は IIS5.0 +.NET Framework (C# または VB.NET) + WebMatrix 0.6 (Windows2000 Sp4 日 本 語 版 )で 観 察 した 観 察 対 象 は バックスラッシュ(u005c) と 円 記 号 (u00a5) を 使 い 同 一 のバイト 列 に 変 換 さ れるのか 異 なるバイト 列 として 処 理 されるのかを 観 察 する ソースコードは 6.20 ASP.Net で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 (C#) および 6.21 ASP.Net で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 (VB.NET) である 通 常 の ASP.NET 開 発 でも 特 に CodePage の 設 定 は 行 わないだろう HexDispCS.aspx/ HexDispVB.aspx でも 特 にコードページの 指 定 はしていない また テキストボックスへ 与 えたデータは POST されるため POST データ 改 変 のために sportredirector2 を 使 用 した sportredirector2 を 使 用 し テキストボックスの 内 容 に %u00a5 % a5 % c 2 % a5 を 付 与 し ASP.NET に 与 えた 結 果 が 図 ~ 図 である 図 ( 図 図 図 図 )から 読 み 取 れる 通 り % u 0 0 a5 % c 2 % a5 を 与 えた 時 に バックスラッシュ と 円 記 号 が 異 なるバイト 列 として 認 識 している このように 特 にコードページを 指 定 していない 場 合 UNICODE を 使 ったサニタイジング 回 避 テ クニックが 利 用 できる ということになる 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %u00a5 を 付 与 してサーバへ 送 る(C#) 61

63 図 : 図 の 結 果 (C#) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %a5 を 付 与 してサーバへ 送 る(C#) 62

64 図 : 図 の 結 果 (C#) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に 0xa5 の UTF-8 表 現 である %c2%a5 を 付 与 してサーバへ 送 る(C#) 63

65 図 : 図 の 結 果 (C#) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %u00a5 を 付 与 してサーバへ 送 る(VB.NET) 64

66 図 : 図 の 結 果 (VB.NET) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %a5 を 付 与 してサーバへ 送 る(VB.NET) 65

67 図 : 図 の 結 果 (VB.NET) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に 0xa5 の UTF-8 表 現 である %c2%a5 を 付 与 してサーバへ 送 る(VB.NET) 66

68 図 : 図 の 結 果 (VB.NET) IIS + CGI IIS 上 で 動 く( _UNICODE または _MBCS オプションでコンパイルされた)CGI プログラム に 対 して UNICODE を 送 り 込 んだ 場 合 IIS は CGI に 対 してどのようにデータを 受 け 渡 すかを 観 察 した IIS5.1 + (WindowsXP SP2 日 本 語 版 )である 送 り 込 む HTTP リクエスト 作 成 のためにバイナリエディタ Stirling ver1.31 を 使 用 し 通 信 プ ログラムとして Netcat1.10[NT] を 使 用 した CGI のソースコードは 6.22 CGI として 受 け 取 ったデータのバイト 列 表 示 プログラム である これを _UNICODE オプションでコンパイルした testcgiu.exe _ M B CS オプションで コンパイルした testcgia.exe を 用 いた ここでの 観 察 目 的 は IIS が CGI プログラムの 属 性 (_UNICODE または_MBCS のどちらでコン パイルされたものであるか)を 検 出 して 相 応 のエンコード 処 理 を 行 って CGI プログラムへクエ リー 文 字 列 やコマンドライン 引 数 フォームデータを 渡 すかどうかというのが 観 察 目 的 である 67

69 UNICODE プログラム testcgiu.exe に 対 しての 実 験 結 果 が 図 ~ 図 である 図 を 見 ると %u00a5 という 円 記 号 (u00a5) が コマンドライン 引 数 では ANSI 空 間 の バックスラッシュ(u005c) に 縮 退 している 点 である この 方 法 では 本 文 書 のサニタイジ ング 回 避 テクニックは 使 用 できない 図 では 標 準 入 力 (ポストされるフォームデータ)に 対 してのみ 円 記 号 (u00a5) として 扱 われている この 方 法 の 場 合 フォームデータについてのみ 本 文 書 のサニタイジング 回 避 テ クニックが 使 用 可 能 である 図 や 図 でのクエリー 文 字 列 やコマンドライン 引 数 での 文 字 化 けが 少 し 気 がかり であるが 本 文 書 の 主 旨 ではないため 割 愛 する 図 ~ 図 は ANSI プログラム testcgia.exe に 対 して 行 った 実 験 結 果 である 当 然 であるが ANSI プログラムであるためアタックベクタとしては 使 用 できない しかし ANSI な CGI プログラムの 前 で UNICODE な ISAPI フィルタでサニタイジングをして いる というような 想 定 をした 場 合 U N IC O DE 上 でサニタイジング ANSI プログラム とな るので 本 文 書 の 回 避 テクニックが 利 用 可 能 である 可 能 性 がある ISAPI フィルタと CGI プログ ラムとの 関 係 については 本 項 目 のテーマではない 図 : testcgiu.exe に 対 して %u00a5 を 送 った 結 果 CGI のコマンドライン 引 数 では ANSI 空 間 へ 縮 退 して 渡 されている 68

70 図 : testcgiu.exe に 対 して 0xa5 を 送 るためのリクエスト 図 : 図 の 結 果 クエリー 文 字 列 とコマンドライン 引 数 では 文 字 化 けを 起 こしているが 標 準 入 力 では UNICODE の 円 記 号 として 扱 われている 69

71 図 : testcgiu.exe に 対 して 0xc2,0xa5 を 送 るためのリクエスト 図 : 図 の 結 果 UNICODE の 円 記 号 としてエンコードされた 箇 所 がない 図 : この 図 のように UTF-16 を 直 送 してみる 70

72 図 : 図 の 結 果 エラーである どうも IIS は 0x00 を 拒 絶 するようだ 図 : この 図 のように UTF-16 を 直 送 すると 無 反 応 になった(Post データ 待 ちの 状 態 であると 推 定 される) 図 : testcgia.exe に 対 して %u00a5 を 送 った 結 果 71

73 図 : testcgia.exe に 対 して 0xa5 を 送 るためのリクエスト 図 : 図 の 結 果 72

74 図 : testcgia.exe に 対 して 0xc2,0xa5 を 送 るためのリクエスト 図 : 図 の 結 果 JavaServlet Java での Web アプリケーションの 場 合 について 観 察 した 観 察 した Java 環 境 は Windows2000SP4 日 本 語 版 で 動 作 する JDK Tomcat であ る ちなみに Eclipse3.1.2 で 開 発 した 73

75 ソースコードは 6.23 JavaServler で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 である Java の 場 合 Request オブジェクトに 対 して setcharacterencoding()メソッドによって 文 字 コ ードを 指 定 することができる 行 ったテスト 内 容 は Post されるデータまたはクエリ 文 字 列 に 円 記 号 を 示 す %u00a5 % a5 及 び 0xa5 の UTF-8 表 現 である %c2%a5 を 与 えた Post データの 改 変 には sportredirector2 を 使 用 した UTF-8 を 使 用 した 場 合 の 図 が 図 ~ 図 である 当 然 だか バ ッ ク ス ラッシュ と 円 記 号 は 異 なるバイト 列 で 保 持 されている よって UNICODE を 使 ったサニタイジング 回 避 テクニックが 利 用 できる ということにな る 文 字 コードに Windows-31J を 指 定 した 場 合 が 図 ~ 図 である 図 を 見 てみると 文 字 化 けはあるが( 後 日 に 別 の 問 題 として 評 価 してみたいがそれは 別 の 話 ) 入 力 データとして 与 えた 円 記 号 がそのまま 評 価 されていないことから UNICODE を 使 っ たサニタイジング 回 避 テクニックを 利 用 できない ということになる Java では ASP/ASP.NET で 通 用 した %uxxxx という 表 現 が 通 用 していないことに 注 意 する 必 要 がある また Post する UNICODE 文 字 は %a5 ではなく UTF-8 表 現 の %c2%a5 でなければな らないようだ 今 回 の 観 察 には Tomcat5 系 を 使 用 したが Tomcat 4 系 からの 仕 様 変 更 がある それは Tomcat5 系 では クエリー 文 字 列 のデフォルト 文 字 コードは UTF-8 となり setcharacterencoding() を 適 用 しない ということである そのことのテストをしてみたのが 図 ~ 図 である 図 ~ 図 では dopost()メソッドではなく doget()メソッドを 使 ってクエリー 文 字 列 を request オブジェクトとして 取 得 した また setcharacterencoding()メソッドによって 文 字 コードを Windows-31J にしている 結 果 的 に setcharacterencoding()で Windows-31J としていてもクエリー 文 字 列 からの 入 力 デ ータを 使 って UNICODE によるサニタイジング 回 避 テクニックが 利 用 できる ということを 図 は 示 している ここで 想 定 外 の 現 象 としてクエリー 文 字 列 に 対 しては u00a5 は UTF-8 表 現 ではなくそのま 74

76 ま %a5 だけでよいという 点 であるが これは 本 文 書 の 回 避 テクニックの 内 容 とは 異 なるので これ 以 上 は 解 析 しない 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %u00a5 を 付 与 してサーバへ 送 る 図 : 図 の 結 果 (Java_UTF8) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %a5 を 付 与 してサーバへ 送 る 75

77 図 : 図 の 結 果 (Java_UTF8) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に 0xa5 の UTF-8 表 現 である %c2%a5 を 付 与 してサーバへ 送 る 図 : 図 の 結 果 (Java_UTF8) 76

78 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %u00a5 を 付 与 してサーバへ 送 る 図 : 図 の 結 果 (Java_Windows-31J) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に %a5 を 付 与 してサーバへ 送 る 77

79 図 : 図 の 結 果 (Java_Windows-31J ) 図 : POST されるデータを 改 変 しテキストデータの 先 頭 に 0xa5 の UTF-8 表 現 である %c2%a5 を 付 与 してサーバへ 送 る 図 : 図 の 結 果 (Java_Windows-31J) 78

80 図 : QueryString に %u00a5 を 付 与 した 結 果 (Java_Windows-31J) 図 : QueryString に %a5 を 付 与 した 結 果 (Java_Windows-31J) 図 : QueryString に 0xa5 の UTF-8 表 現 である %c2%a5 を 付 与 した 結 果 (Java_Windows-31J) 79

81 5 執 筆 者 と 更 新 履 歴 など 80

82 5.1 執 筆 者 5.2 更 新 履 歴 最 初 のバージョン : 2005 年 11 月 15 日 ver1.1 : アップロードを 忘 れて 未 公 開 1.1で 衆 知 徹 底 周 知 徹 底 6.9で c: java a c: z a に 修 正 2.3, 6.4 を 追 加 ver1.2 : 2006 年 12 月 06 日 題 名 を 変 更 文 章 全 体 に 渡 っての 誤 字 脱 字 表 現 の 修 正 Windows の LDAP インジェクションについて 修 正 (LDAP インジェクションに 対 しては 問 題 はないため 削 除 した) 4 アタックベクタ を 追 加 を 追 加 6.10 を 追 加 5.3 の URL が 記 述 ミスだったのを 修 正 1.3 に サニタイジングによる 対 策 2 を 追 加 ver1.3 : 2007 年 02 月 20 日 3.8, 3.2.3, 2.2.2, を 追 加 ver1.4 : 2007 年 03 月 17 日 5.3 を 修 正 3.4, 3.4.1, 6.15 を 追 加 ver1.5 : 2007 年 03 月 18 日 のタイトルに PlamoLinux(EUC-JP) を 追 加 を 追 加 81

83 ver1.6 : 2009 年 02 月 14 日 7 付 記 2 を 新 設 5.3 本 文 書 の 最 新 バージョン 82

84 83 UNICODE とサニタイジング 回 避 テクニック

85 6 付 記 1 84

86 6.1 Win32 系 列 での UNICODE 変 換 リストのプログラムについて /L %I IN (0,1,65535) UnicodeIsSub.bat %I OFF UnicodeIs.exe c%1 SETmyANS=1 IF %ERORLEVEL%==0 SETmyANS=0 IF %ERORLEVEL%==1 SETmyANS=0 IF NOT%myANS%=0 ECHO %1 SETmyANS= UnicodeIs.cpp CWinAp theapp; using namespacestd; intmymain(int hikisu,char hikisuc3,intincode2,intincode,int meate){ unsigned char *p; intansret; unsigned char hako[6]; unsigned char anshako[6]; intmojisu; intans; unsigned char c1; unsigned char c2; unsigned intansint; memset(hako,0x0,sizeof(hako)); memset(anshako,0x0,sizeof(anshako)); p =(unsigned char*)hako; ansret= 0; // i =0x2025; *(p+1)= (char)((int)(incode/256); *p = (char)(int)(incode%256)); 85

87 if(incode2!= 0){ *(p+3)= (char)(incode2/256) +220; *(p+2)= (char)(incode2%256); *(p+1)= (char)((int)(*(p+1)) + 216); } mojisu= WideCharToMultiByte(CP_ACP,NUL,(LPWSTR)p,-1,NULL,0,NULL,NUL); ans= WideCharToMultiByte(CP_ACP,NUL,(LPWSTR)p,-1,(char*)ansHako,sizeof(ansHako)-1,NUL,NULL); p =anshako; c1 = *p; c2 = *(p+1); ansint= 256* (int)(c2)+ (int)(c1); if(hikisu==2){ if(2 <mojisu){ if(0 <(int)(c2) & (int)(c2) < 128 && (int)(c1)< 128){ printf("%d(u%02x%02x) - %d(0x%02x)[%c] n",incode,(int)(incode/256),(int)(incode%256),ansint,ansint,*anshako); ansret= 1; } } }else{ if(ansint==meate){ if(3 <hikisu & hikisuc3 = 'v'){ if(incode2!= 0){ printf("%d,%d(u%02x%02x,%02x%02x)",incode2,incode,(int)(incode2/256),(int)(incode2%256),(int)(incode/2 56),(int)(inCode%256); }else{ printf("%d(u%02x%02x)",incode,(int)(incode/256),(int)(incode%256)); } printf(" - %d(0x%02x)[%c] n",ansint,ansint,*anshako); } ansret= 1; } } returnansret; 86

88 } int_tmain(int argc, TCHAR*argv[], TCHAR*envp[]){ intnretcode= 0; // MFC の 初 期 化 および 初 期 化 失 敗 時 のエラーの 出 力 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, :GetCommandLine(),0){ }else{ cer < _T("Fatal Error:MFC initialization failed") < endl; nretcode = -1; unsigned intmeate= 0; unsigned long i; unsigned long imax; unsigned long imin; unsigned long j; unsigned char c='a'; intansi = 0; imax =6535; // imax =25; imin =0; // imin =20; if(1 <argc){ // 引 数 チェック if(2 <argc){ } i=imin; meate = (unsigned long)atol(argv[2]); if(3 <argc && *argv[3] == 'v'){ } for(i=imin;i<=imax;i+){ } printf("meate :%d(0x%02x) n",meate,meate); c =*argv[3]; ansi =ansi + mymain(argc,c,0,i,meate); for(j=1;j<1024;j++){ for(i=0;i<1024;i++){ } ansi =ansi + mymain(argc,c,j,i,meate); 87

89 } nretcode = ansi; if(3 <argc && *argv[3] == 'v'){ printf("count=%d n",ansi); } }else{ printf("ascii コードを 指 定 して 重 複 する UNICODE 文 字 を 探 す 旅 ver1.0 n"); printf("usage: %s c ASCIcode v n",argv[0]); printf(" printf(" %s c ASCIcode n",argv[0]); %s a n",argv[0]); } } returnnretcode; } 6.2 MS-VisualBASIC6.0Sp6 での UNICODE 変 換 リストのプログラム について PrivateSub Comand1_Click() Dim unicodehako(65535) As Long Dim mybyte(1) As Byte Dim mybyte1() As Byte Dim iaslong Dim jaslong Dim kaslong Dim str As String For i= 0 To unicodehako(i) =0 Next For i= 0 To 255 For j =0 To 255 Rem バイト 配 列 に 値 を 格 納 mybyte(0)= i mybyte(1)= j 88

90 Next Next Rem ここで Str ing 化 str= mybyte Rem ここで 変 換 mybyte1 =StrConv(str, vbfromunicode) unicodehako(i *256 +j)= mybyte1(0) If 0 <UBound(myByte1) Then EndIf unicodehako(i * j) =unicodehako(i * j) *256 +mybyte1(1) Rem 一 致 する 変 換 があったかを 検 索 する Label1.Caption= "0" For i= 0 To Next str = "SJIS="& CStr(i) &"(0x"& Hex(i)& ")"& vbcrlf k= 0 For j =0 To Next Rem [?](63{0x3f})は 除 外 する If (Not i= 63)And unicodehako(j) =i Then EndIf k = k+ 1 If 1< k Then str =str &"unicode=" & CStr(j)&"(0x" & Hex(j) & ")" & vbcrlf Text1.Text =Text1.Text & str End If Label1.Caption =CLng(i) DoEvents Text1.Text = Text1.Text& vbcrlf& "Fin" EndSub 6.3 MS-C#での UNICODE 変 換 リストのプログラムについて using System; 89

91 using System.Text; class unicode{ static voidmain(){ string mystr; string myhexstr; ulong i; ulong j; int count; charc; char[] hako =new char[1]; ulong[]unicodehako= newulong[6536]; // 初 期 化 for(i=0;i<65536;i++){ unicodehako[i] = 0;} for(i=0;i<65536;i++){ c =(char)i; hako[0] =c; mystr = new string(hako); Encoding EncodeObj= Encoding.GetEncoding("Shift_JIS"); byte []mybytehako = EncodeObj.GetBytes(myStr); unicodehako[i]= (ulong)mybytehako[0]; if(1 <mybytehako.length){ unicodehako[i] = 256 * unicodehako[i] +(ulong)mybytehako[1];} myhexstr = BitConverter.ToString(myByteHako); // Console.WriteLine(myHexStr +" n"); } // 縮 退 の 検 索 for(i=0;i<65536;i++){ mystr = "SJIS="+ i.tostring()+ " (0x"+ i.tostring("x")+ ") n"; count = 0; if(63!= i){for(j=0;j<65536;j++){ if(unicodehako[j] = i){ count++; mystr = mystr +"unicode=" + j.tostring() + "(0x" + j.tostring("x") + ") n"; } } } if(1 <count){ Console.WriteLine(myStr); } } Console.WriteLine("Done"); } } 90

92 6.4 Java での UNICODE 変 換 リストのプログラムについて importjava.io.unsupportedencodingexception; importorg.ingrid.util.unicodetool; publicclassunicodetest { public static void main(string[]args){ if (args.length!= 1) { System.out.println("Usage: java -jarunicodetest.jar <encoding>"); System.out.println("<encoding>isEUC-JP, Shift_JISetc.."); System.exit(1); } /* * Unicode=> 他 の 文 字 コード 変 換 マップ 配 列 */ byte[][] array; array =getbytearray(args[0]); /* * Ascii 文 字 の 範 囲 (0~0x7f)で 繰 り 返 し 検 索 */ for (int i= 0; i <0x80;i+) { // 重 複 カウント intcount=0; // 出 力 用 Stri ngbuffer StringBufersb= newstringbuffer(); for(int j =0;j < 0x1000; j+=0x0001) { /* * 変 換 後 の byte の 長 さが 1で * 変 換 後 の byte 値 が 0x3f でなくて * 変 換 後 の byte 値 が 現 在 検 索 中 の Ascii 文 字 と 91

93 * かぶる 場 合 には count+ 1 */ if((array[j].length==1) && (aray[j][0]!=0x3f) && (aray[j][0]==i) { } sb.append("unicode : u" + UnicodeTol.toHexString(char)j)+ " n"); sb.append(" 文 字 表 示 : "+ (char)j + " n"); sb.append(" 変 換 byte:" + UnicodeTool.toHexString(array[j]) + " n"); sb.append(" n"); count += 1; } /* * count = 1は 1つの Uni codeの 変 換 の 結 果 * 1つの Ascii コードに 変 換 されているものが 該 当 *(Unicode と Asciiコードの 重 なっている 部 分 ) * count >= 2の 時 は 複 数 の Uni codeが 1つの Asciiコード * に 変 換 されているものが 該 当 (Un icode バグの 巣 となる 可 能 性 ) */ if (count> 1) { } System.out.print(sb.toString()); } } /* * 変 換 マップ 2 次 元 配 列 を 作 る * aray[2345]には u2345の 変 換 結 果 の byt e[]が 入 る * */ private staticbyte[][]getbytearray(string encoding){ byte[][] array =new byte[6536][]; 92

94 try { for(int i =0x000; i <0x1000;i += 0x001) { String s=string.valueof(char)i); byte[] ba; ba= s.getbytes(encoding); aray[i]= ba; } }catch(unsupportedencodingexceptione){ e.printstacktrace(); System.exit(1); } return array; } } 実 行 結 果 C: cygwin home Owner unicodetest>java -version java version"1.5.0_05" Java(TM) 2 RuntimeEnvironment, Standard Edition(build 1.5.0_05-b05) Java HotSpot(TM) Client VM (build1.5.0_05-b05, mixed mode, sharing) C: cygwin home Owner unicodetest>java -jarunicodetest.jar Shift_JIS Unicode : u005c 文 字 表 示 : 変 換 byt e: 5c Unicode : u00a5 文 字 表 示 : 変 換 byt e: 5c Unicode : u007e 文 字 表 示 : ~ 変 換 byt e: 7e Unicode : u203e 93

95 文 字 表 示 : ~ 変 換 byt e: 7e 6.5 tchar.h を 使 って 引 数 の hex 表 示 をする VC++6.0SP6 プログラ ム テンプレート : Win32ConsoleApplication MFC を 使 った Hello プログラム // argvwin.cpp : コンソール アプリケーション 用 のエントリ ポイントの 定 義 #include "stdafx.h" #include "argvwin.h" #ifdef_debug #define new DEBUG_NEW #undefthis_file staticchar THIS_FILE[] = _FILE_; #endif //////////////////////////////////////////////////// // 唯 一 のアプリケーション オブジェクト CWinAp theapp; using namespacestd; int_tmain(int argc, TCHAR*argv[], TCHAR*envp[]){ intnretcode= 0; inti; intj; intjlen; TCHAR tc; TCHAR *tcp; char *pp; intbai; // MFC の 初 期 化 および 初 期 化 失 敗 時 のエラーの 出 力 if(!afxwininit(::getmodulehandle(null), NULL, :GetCommandLine(),0){ cer < _T("Fatal Error:MFC initialization failed") < endl; nretcode = 1; 94

96 }else{ bai= 1; #ifdef_unicode bai= 2; printf("unicode n"); #endif #ifdef_mbcs bai=1; printf("mbcs n"); #endif for(i=0;i<argc;i++){ jlen =lstrlen(argv[i]); _tprintf(_t("%d: "),i); tcp= argv[i]; for(j=0;j<jlen;j++){ tc = *tcp; _tprintf(_t("%x"),tc); tcp++; } printf(" :"); pp = (char*)argv[1]; jlen =bai *jlen; for(j=0;j<jlen;j++){ printf("%x",(char)(*p)); pp+; } _tprintf(_t(" n")); } } returnnretcode; } 95

97 6.6 Variant 型 の 引 数 を ANSI で 受 け 取 るメソッドと Unicode(Binary) で 受 け 取 るメソッドのある COM(MS-VC++6.0SP6) テンプレート : ATL-COM Wizard ATL クラス(シンプルオブジェクト) // UnicodeTest.cpp: CUnicodeTest のインプリメンテーション #include "stdafx.h" #include "UnicodeCom.h" #include "UnicodeTest.h" #include <comdef.h> //////////////////////////////////////////////////// // CUnicodeTest STDMETHODIMPCUnicodeTest::testANSI(VARIANT vin){ _variant_t myvariant; _bstr_t mybstr; unsigned long mylen; unsigned char *cp; char *pp; unsigned char *p; unsigned char c; // 自 分 のバリアント 型 へコピー myvariant= _variant_t(&vin); // BSTR 型 へ 変 換 myvariant.changetype(vt_bstr,null); // 自 分 の BS TR 型 へコピー mybstr= _bstr_t(myvariant); myvariant.clear(); // 自 分 の Va riant 型 を 解 放 // BSTR 型 の 文 字 長 はいくつですか? mylen = (unsigned long)mybstr.length(); // UNICODE も 考 えて 2 倍 のメモリを 確 保 mylen = 2* mylen +2; cp = (unsigned char*)maloc(mylen); memset(cp,0x00,mylen); 96

98 mylen -= 2; // 確 保 したメモリへコピー pp = (char*)mybstr; strncpy((char*)cp,pp,mylen); p =cp; while(*p!= ' 0'){ } // NUL まで He x で 表 示 c =*p; if(int)c< 10){ } printf("%x",c); p++; printf(" n"); free(cp); returns_ok; // メモリ 解 放 printf("0"); } STDMETHODIMPCUnicodeTest::testUNICODE(VARIANT vin){ _variant_t myvariant; unsigned long mylen; unsigned char *cp; unsigned char *p; unsigned char c; unsigned long i; // 自 分 のバリアント 型 へコピー myvariant= _variant_t(&vin); // unsigned int の SAFEARRAY 配 列 へ 変 換 myvariant.changetype(vt_array VT_UI1,NULL); // 配 列 長 はいくつですか? mylen = (unsigned long)myvariant.paray->rgsabound->celements; mylen+; // メモリを 確 保 してコピーする 97

99 cp = (unsigned char*)maloc(mylen); memset(cp,0x00,mylen); mylen -= 1; memcpy((char*)cp,(char*)myvariant.parray->pvdata,mylen); myvariant.clear(); // 自 分 の Va riant 型 を 解 放 // 長 さ 分 he x 表 示 // NUL まで He x で 表 示 p =cp; for(i=0;i<mylen;i+){ } c =*p; if(int)c< 10){ } printf("%x",c); p++; printf(" n"); fre(cp); returns_ok; // メモリ 解 放 printf("0"); } の COM を 呼 び 出 すテストスクリプト Setobj =WScript.CreateObject("UnicodeCom.UnicodeTest") str= "abcあ xyz" WScript.Echo"Script Start" WScript.Echo"target string: " &str WScript.Echo"TestAnsi exec" obj.testansi(str) 98

100 WScript.Echo"TestUnicode exec" obj.testunicode(str) WScript.Echo"Script End" Setobj =Nothing WScript.Quit 6.8 Java で 書 かれたファイルアクセスプログラム あらかじめ c: java a というディレクトリを 作 成 しておく importjava.lang.*; importjava.io.*; class JavaFileTest{ publicstatic voidmain(string[] args){ Characterch= newcharacter(' u0a5'); StringchStr= ch.tostring(); Stringstr; Stringstr1 = "Helo"; File myfileclas; FileOutputStream fout; if(args.length == 0){ str= "c: java a" +" " + "test.txt"; }else{ str= "c: java a" +chstr+ "test.txt"; } System.out.println("FilePath :" + str); myfileclass = new File(str); try{ fout =new FileOutputStream(myFileClass); try{ fout.write(str1.getbytes()); fout.close(); }catch(ioexceptione){ 99

101 } }catch(filenotfoundexception e){ } } } 6.9 Python で 書 かれたファイル 読 み 出 しプログラム あらかじめ c: z a というディレクトリを 作 成 しておく importos yen= u'c: z a u00a5unicode.txt' f =open(yen, 'a') f.write('test') f.close() 6.10 VB の Open ステートメントと Scripting.SystemFileObject オブジ ェクトを 使 ったファイル 読 み 出 しプログラム (VB6SP6) 図 : GUI 画 面 ラジオボタンで ファイル 読 み 出 しとして Open ステートメントを 使 うか Scripting.FileSystemObject オブジェクトを 使 うかを 決 定 する チェックボックスで 右 二 段 目 のテキストボックスの を 0xa5 に 置 換 してからファイルパスを 生 成 する ファイルパス = 最 上 段 + 右 二 段 目 100

102 OptionExplicit Private Sub Comand1_Click() End EndSub Private Sub Comand2_Click() Dim mypath As String Dim mybyte1() As Byte Dim dispstringasstring Dim iaslong Dim FSObj As Object Dim FileObjAsObject Dim imaxaslong mypath =Text2.Text dispstring = "" mybyte1 = mypath imax = UBound(myByte1) For i= 0 To imax dispstring= dispstring &"(" &CStr(myByte1(i)) & ")" Next Label1.Caption= dispstring IfCheck1.Value =1 Then For i =0 To imax If mybyte1(i) =92Then mybyte1(i) = 165 EndIf Next mypath = mybyte1 End If dispstring = "" mybyte1 = mypath 101

103 imax = UBound(myByte1) For i= 0 To imax dispstring= dispstring &"(" &CStr(myByte1(i)) & ")" Next Label2.Caption= dispstring IfOption1(0).Value = TrueThen Set FSObj = CreateObject("Scripting.FileSystemObject") Set FileObj =FSObj.CreateTextFile(Text1.Text & " " & mypath) FileObj.Write"Hello" FileObj.Close Set FileObj =Nothing Set FSObj = Nothing Else OpenText1.Text & " " & mypath ForOutput As #1 Close #1 End If MsgBox "ファイルできた?", vbokonly,"ok" EndSub Private Sub Comand3_Click() Dim str As String Dim ret As Variant str =" 本 プログラムは UNI CODE バグを 用 いた の 迂 回 可 能 性 をテストするプログラム" vbcrlf & str =str &"VBには open ステートメントによるファイル 読 み 書 きと " & vbcrlf str=str&"com の Scrip ting.filesystemobject を 使 ったファイルアクセス 方 法 がある(こちら 側 は ActiveScriptでも 使 う)"& vbcrlf str =str &"という 事 で ファイル 名 に を 入 れるとそれより 前 は ディレクトリ になる"& vbcrlf str =str &"んで UNIC ODEBug チェックをするとどうなるか?" &vbcrlf str =str &"もう 一 つの がデリミタとして 解 釈 されなければ セキュリティ 問 題 はなし" & vbcrlf str =str &" 解 釈 されれば 危 険 性 あり " vbcrlf & str =str &"という 事 になるよ~ " ret =MsgBox(str,vbOKOnly, "Help") EndSub 102

104 Private Sub Form_Load() Dim str As String Text1.Text = App.Path &" " EndSub PrivateSubText1_OLEDragDrop(DataAsDataObject,EffectAsLong,ButonAsInteger,ShiftAs Integer,X As Single, YAsSingle) Text1.Text = Data.Files.Item(1) & " " EndSub 6.11.NET Framework でファイルを 作 るプログラム (C#) 第 一 引 数 に ファイル 名 第 二 引 数 には 何 かを 渡 す( u を 渡 した 場 合 はファイル 名 中 の u005c を u00a5 に 置 換 した 上 で ファイルを 生 成 する) using System; using System.IO; publicclassfileunicodetest{ publicstatic voidmain(string[] args){ FileStream fs; StreamWritersw; stringfilename= args[0]; Console.WriteLine("InputArgs[0]="+ args[0]); if(args[1][0] = 'u'){ Console.WriteLine("mode=Replace 0x5c ->0xa5"); char[]hako = new char[filename.length]; for(int i=0;i<filename.length;i++){ hako[i] =FileName[i]; if(filename[i] == ' '){ hako[i] =(char)165;} } FileName = new string(hako); }else{ Console.WriteLine("mode=no tatch"); } Console.WriteLine("FileName=" + FileName); try{ 103

105 fs = new FileStream(FileName,FileMode.Create); sw = new StreamWriter(fs); sw.writeline("hello"); sw.close(); fs.close(); }catch(exception e){console.writeline(e.message); } } } 6.12 WSH の Run メソッドでコマンド 実 行 するスクリプト OptionExplicit DimWshObj DimArgObj Dimstr SetWshObj =WScript.CreateObject("WScript.Shell") SetArgObj =WScript.Arguments REM0x7c = 124 [ ] remstr =chrw(124) remstr =chrw(166) remwscript.echo str WScript.EchoArgObj.Count If 0 <ArgObj.Count Then Select CaseCStr(ArgObj(0)) Case"1" WshObj.Run "a.exe b.exe" Case"2" WshObj.Run "cmd.exe /c a.exe b.exe" Case"3" WshObj.Run "cmd.exe /c a.exe "& chrw(124)& " b.exe" Case"4" WshObj.Run "cmd.exe /c a.exe "& chrw(166)& " b.exe" 104

106 End Select Else WScript.Echo "Read Sourcecode" EndIf SetWshObj =Nothing WScript.Quit 6.13 WSH の Exec メソッドでコマンド 実 行 するスクリプト OptionExplicit DimWshObj DimArgObj DimExecObj Dimstr SetWshObj =WScript.CreateObject("WScript.Shell") SetArgObj =WScript.Arguments REM0x7c = 124 [ ] remstr =chrw(124) remstr = chrw(166) remwscript.echo str WScript.EchoArgObj.Count If 0 <ArgObj.Count Then Select CaseCStr(ArgObj(0)) Case"1" str= "a.exe b.exe" Case"2" str= "cmd.exe /c a.exe b.exe" Case"3" str= "cmd.exe /c a.exe " &chrw(124) &" b.exe" 105

107 Case"4" str= "cmd.exe /c a.exe " &chrw(166) &" b.exe" End Select Set ExecObj= WshObj.Exec(str) WhileExecObj.Status= 0 WScript.Sleep100 Wend str ="" WhileNot ExecObj.StdOut.AtEndOfStream str = str & ExecObj.StdOut.Read(1) Wend Set ExecObj= Nothing WScript.Echo str Else WScript.Echo "Read Sourcecode" EndIf SetWshObj =Nothing WScript.Quit 6.14 外 部 コマンド 呼 び 出 しによって 呼 び 出 されるプログラム 本 プログラムが 実 行 されると 実 行 プログラムと 同 一 ディレクトリに 実 行 プログラム +.txt というファイルが 作 成 される /* テストプログラム */ /* プログラム 名 + */ #include <stdio.h> #include <string.h> #include <stdlib.h> intmain(intargc,char *argv[]){ 106

108 unsigned char *filename; unsigned char *p; unsigned long filenamelen; FILE *fp; filenamelen = strlen(argv[0]); filename = (unsigned char*)maloc(filenamelen+5); memset(filename,0x00,filenamelen+5); /* getfilename*/ strcpy(filename,argv[0]); p =filename+ filenamelen; strcpy(p,".txt"); /* write file */ fp = fopen(filename,"w"); fprintf(fp,"helo"); fclose(fp); /* ending*/ printf("write %s n",filename); return0; } 6.15 外 部 コマンド 呼 び 出 しを 行 う Java プログラム importjava.lang.*; importjava.io.*; importjava.util.stringtokenizer; class JShell{ public static void main(string args[]){ String ans; charc1= 92; 107

109 charc2= 165; ans = " +""; / 引 数 を 解 析 if(1< args.length){ if(args[1].equals("")==false){ ans= args[1]; System.out.println("InputData=" +ans); } } if(1< args.length){ if(args[0].equals("2") = true){ ans= ans.replace(c1,c2); // 0x5c -> 0xa5 } if(args[0].equals("1") = true args[0].equals("2") == true){ ans= ans.replaceall(" "," "); ans= ans.replaceall(">"," >"); ans= ans.replaceall(" "," "); } System.out.println("CommandLine=bash -c n "+ ans); Runtime myruntime = java.lang.runtime.getruntime(); try{ / Runtime クラスで 外 部 プロセスを 実 行 String[]cmdaray= {"/bin/sh", "-c", ans}; Process myprocess= myruntime.exec(cmdarray); ans =""+ GetString(myProces, true); // 標 準 出 力 をゲット ans += GetString(myProcess, false); // 標 準 エラー 出 力 をゲット }catch(securityexceptione){ ans= "SecurityException"; }catch(nullpointerexceptione){ans= "NullPointerException"; }catch(indexoutofboundsexception e){ ans= "IndexOutOfBoundsException"; }catch(ioexceptione){ ans= "IOException"; } System.out.println(ans); }else{ System.out.println("usage: java JShell opt1 CommandString"); System.out.println("opt1= 0: none n 1:0x5c escape n 2: 0x5c->0xa5 and 0x5c escape"); } } private staticstring GetString(Proces myprocess,bolean Flg){ String ans= ""; InputStreamReader myinputstreamreader; if(flg == true){ 108

110 myinputstreamreader =new InputStreamReader(myProcess.getInputStream()); }else{ myinputstreamreader =new InputStreamReader(myProcess.getErrorStream()); } BufferedReader mybufferedreader= newbufferedreader((reader)myinputstreamreader); try{ Stringcnt =mybuferedreader.readline(); while(cnt!=null){ ans+=(cnt + " n"); cnt= mybufferedreader.readline(); } }catch(ioexception e){ans+="ioexception(bufferedreader)[error]"; } return ans; } } 図 : JShell.java 6.16 MS-XML コアサービスの COM オブジェクトを 使 った XML 文 書 検 索 プログラム (VB6SP6) 図 : GUI 画 面 最 上 段 のテキストボックスは 読 み 込 む XML 文 書 のファイルパス UNICODE Bug チェックボックスで XPath 検 索 条 件 中 の を 0xa5 に 置 換 してから 検 索 109

111 Escape チェックボックスでは に エ スケープする 最 下 段 のテキストボックスは 検 索 結 果 OptionExplicit Private Sub Comand1_Click() Dim xmlrootobjasobject Dim XMLDocObj As Object Dim XMLDocChildObj As Object Dim imaxaslong Dim iaslong Dim jmaxaslong Dim jaslong Dim str As String Dim obj As Object Dim myobj As Object Dim mybyte() As Byte Rem ここに XPA TH を 書 く Rem str = "xmldocument/bb/name" Rem str = "xmldocument/bb/name[text()='ya ma 'to']" str =Text3.Text Set xmlrootobj= CreateObject("Microsoft.XMLDom") xmlrotobj.load Text1.Text xmlrotobj.async = True Rem 全 部 取 得 Rem Set XMLDocObj= xmlrootobj.childnodes.item(1).childnodes Rem 検 索 して 取 得 mybyte =str imax = UBound(myByte) Rem XPATH 文 字 列 の Hex 表 示 Label1.Caption= "" For i= 0 To imax Next Label1.Caption =Label1.Caption& "("& CStr(CInt(myByte(i)))& ")" 110

112 Rem 92-> 165 IfCheck1.Value =1 Then Label1.Caption ="" For i =0To imax If mybyte(i)= 92 Then mybyte(i) =165 EndIf Label1.Caption = Label1.Caption &"(" &CStr(CInt(myByte(i)) &")" Next str = mybyte End If IfCheck2.Value =1 Then str = Replace(str, " ", " ") str = Replace(str, "'", " '") Label1.Caption ="" mybyte = str imax= UBound(myByte) For i =0 To imax Label1.Caption = Label1.Caption &"(" &CStr(CInt(myByte(i)) &")" Next End If str =Label2.Caption& str& Label3.Caption Set XMLDocObj = xmlrootobj.selectnodes(str) Rem 再 帰 処 理 Text2.Text = "XPath=" &str &vbcrlf &"Search Result" XMLChildXMLDocObj, "",0 Rem 終 了 処 理 Set XMLDocChildObj =Nothing Set XMLDocObj = Nothing Set xmlrootobj= Nothing EndSub Private Sub Comand2_Click() End EndSub 111

113 Private Sub XMLChild(iObj As Object,iStr As String, modeaslong) Dim myobj As Object Dim imaxaslong Dim iaslong Ifmode = 0Then Set myobj = iobj Else Text2.Text= Text2.Text &vbcrlf &istr & iobj.nodename Set myobj = iobj.childnodes End If imax = myobj.length If0 < imaxthen imax= imax - 1 For i =0 To imax XMLChild myobj.item(i), istr &" ", 1 Next Else Text2.Text= Text2.Text &vbcrlf &istr & "=>"& GetValue(iObj) End If Set myobj =Nothing EndSub Private Function GetValue(iObj) As String OnErrorResume Next Dim ans As String ans ="(nul)" ans =CStr(iObj.nodeValue) GetValue= ans EndFunction Private Sub Form_Load() Text1.Text = App.Path &" xpath.xml" EndSub 112

114 6.17 IIS-ASP の 文 字 列 データ(String in Variant)のバイト 列 表 示 (10 進 )(ActiveX DLL by VB6SP6) 6.18 IIS-ASP の 文 字 列 データ(String in Variant)のバイト 列 表 示 (10 進 )(ActiveX DLL by VB6SP6) オブジェクト HexDispCom.Class の GetHexDisp メソッドのソースコード Rem Hex 表 示 というより 10 進 数 表 示 PublicFunctionGetHexDisp(inputStr As Variant) As Variant Dim mybyte() As Byte Dim str As String Dim ans As String Dim iaslong Dim imaxaslong ans ="" str =CStr(inputStr) mybyte =str imax = UBound(myByte) For i= 0 To imax ans = ans & "(" & CStr(CInt(myByte(i)) & ")" Next GetHexDisp = ans EndFunction 6.19 JavaScript の 文 字 列 の 初 期 値 として 使 用 する JavaServlet クエリー 文 字 列 を Client-Side の JavaScript の 文 字 列 の 初 期 値 として 使 用 する JavaServlet プロ 113

115 グラム(Serlvet 本 体 ) ここでは ANSI コードが HTML として 返 されるようにコーディングしている publicclassdispqsservlet extends HttpServlet { protectedvoiddoget(httpservletrequestrequest,httpservletresponseresponse)throwsserv letexception, IOException { StringmyInputStr; request.setcharacterencoding("windows-31j"); myinputstr =request.getparameter("inputstr"); request.setattribute("inputstring",htmlescape(myinputstr); request.setattribute("jsescapestring",jsescape(myinputstr)); // redirect to JSP getservletconfig().getservletcontext().getrequestdispatcher("/result.jsp").forward(request,response); } private String JSEscape(Stringstr){ Stringtmp =str.replaceall(" "," "); tmp= tmp.replaceall("'"," '"); returntmp.replaceall(" ""," ""); } private String HTMLEscape(String str){ Stringtmp =str.replaceall("&","&"); tmp= tmp.replaceall("<","<"); tmp= tmp.replaceall(">",">"); tmp= tmp.replaceall(" "","""); returntmp.replaceall("'","&#39;"); } } クエリー 文 字 列 を Client-Side の JavaScript の 文 字 列 の 初 期 値 として 使 用 する JavaServlet プロ グラム( 上 記 の Servlet から 呼 び 出 される result.jsp) <%@page language="java"contenttype="text/html;charset=windows-31j" %> <html> <body> String: <%=request.getattribute("inputstring")%><br> <hr> <script language="javascript"> <!-- varstr ="<%= request.getattribute("jsescapestring") %>"; document.write(str); //--> </script> <hr> <a href="/dispqs/index.jsp">back</a> 114

116 </body> </html> 6.20 ASP.Net で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 (C#) (HexDispCS.aspx).NET Framework は 内 部 UNICODE(UTF-16)なので バイト 列 を 取 得 するときに エンコード 方 式 を UTF-16 にすることで 内 部 状 態 を 壊 さないようにしている Language="C#" %> <script runat="server"> // ページのコードをここに 記 述 してください // void Buton1_Click(object sender, EventArgs e) { String mystr; String myhexstr; mystr =TextBox1.Text; Encoding EncodeObj = Encoding.GetEncoding("utf-16"); byte[]mybytehako =EncodeObj.GetBytes(myStr); myhexstr =BitConverter.ToString(myByteHako); } Label3.Text =mystr; Label1.Text =myhexstr; </script> <html> <head> </head> <body> <formrunat="server"> 115

117 <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> </form> </body> </html> <asp:label id="label2" runat="server"> 入 力 されたデータを 見 てみる(unicode)</asp:Label> <asp:textboxid="textbox1" runat="server" Width="316px"></asp:TextBox> <asp:buttonid="button1" nclick="button1_click" o nat="server" ru xt="button"></asp:buton> Te <asp:label id="label3" runat="server">label</asp:label> <asp:label id="label1" runat="server">label</asp:label> <!--コンテンツをここに 配 置 してください --> 6.21 ASP.Net で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 (VB.NET) (HexDispCS.aspx).NET Framework は 内 部 UNICODE(UTF-16)なので バイト 列 を 取 得 するときに エンコード 方 式 を UTF-16 にすることで 内 部 状 態 を 壊 さないようにしている <%@Page Language="VB" %> <script runat="server"> ' ページのコードをここに 記 述 してください ' Sub Button1_Click(sender As Object,e As EventArgs) 116

118 Dim mystr As String Dim myhexstr As String Dim EncodeObjAsEncoding Dim mybytehako()asbyte mystr =TextBox1.Text EncodeObj = Encoding.GetEncoding("utf-16") mybytehako= EncodeObj.GetBytes(myStr) myhexstr =BitConverter.ToString(myByteHako) End Sub Label3.Text =mystr Label1.Text =myhexstr </script> <html> <head> </head> <body> <formrunat="server"> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <asp:label id="label2" runat="server"> 入 力 されたデータを 見 てみる(unicode)</asp:Label> <asp:textboxid="textbox1" runat="server" Width="38px"></asp:TextBox> <asp:buttonid="button1" nclick="button1_click" o nat="server" ru xt="button"></asp:buton> Te <asp:label id="label3" runat="server">label</asp:label> <asp:label id="label1" runat="server">label</asp:label> <!--コンテンツをここに 配 置 してください --> 117

119 </form> </body> </html> 6.22 CGI として 受 け 取 ったデータのバイト 列 表 示 プログラム MS-VisualStudio6.0 SP6 にて MFC 付 Win32 Console としてプロジェクトを 構 成 // testcgi.cpp : コンソール アプリケーション 用 のエントリ ポイントの 定 義 #include "stdafx.h" #include "testcgi.h" #ifdef_debug #define new DEBUG_NEW #undefthis_file staticchar THIS_FILE[] = _FILE_; #endif intisnumerics(char*); //////////////////////////////////////////////////// // 唯 一 のアプリケーション オブジェクト CWinAp theapp; using namespacestd; int_tmain(int argc, TCHAR*argv[], TCHAR*envp[]){ intnretcode= 0; // MFC の 初 期 化 および 初 期 化 失 敗 時 のエラーの 出 力 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, :GetCommandLine(),0){ }else{ cer < _T("Fatal Error:MFC initialization failed") < endl; nretcode = 1; unsigned long ul; unsigned long i; unsigned long imax; unsigned long contentlength; unsigned char *phex; unsigned char c; TCHAR *tp; 118

120 TCHAR *tp1; TCHAR *length_char= _T("CONTENT_LENGTH"); TCHAR *query_string =_T("QUERY_STRING"); contentlength = 0; // HTTP ヘッダの 送 信 // 基 本 は AN SI で 出 力 printf("content-type:text/html n n"); if(sizeof(tchar) = 2){ }else{ } ul = 0; printf("unicodecomplie n"); printf("ansicomplie n"); printf("unicodeatack Vector Test n"); while(envp[ul]!= NUL){ tp = envp[ul]; tp1= tp; // あらかじめ 名 前 の 先 頭 (tp)と 値 の 先 頭 (tp1)を 調 べておく while(tp1!=null){ } if(_tcsncicmp(tp1,_t("="),1) = 0){ } tp1++; tp1++; break; // CONTENT_LENGTH と 一 致 するかどうか? // 一 致 するなら 標 準 入 力 のデータ 長 として 取 得 する if(_tcsncicmp(tp,length_char,14) == 0){ contentlength = _ttol(tp1); } if(_tcsncicmp(tp,query_string,12)==0){ *(tp1-1) = NULL; // 値 の 先 頭 のひとつ 前 ( = のあるところ)に NULL を 埋 め 込 み // 名 前 と 値 を 分 断 する _tprintf(_t("%s=%s n"),tp,tp1); imax =_tcslen(tp1) *sizeof(tchar); phex =(unsigned char*)tp1; for(i=0;i<imax;i++){ 119

121 c =*phex; printf("0x%x,",c); phex++; } printf(" n"); } ul+; } printf(" ncomandline List n"); ul = 0; if(0 <argc){ for(ul=0;ul<argc;ul++){ printf("%d :",ul); _tprintf(_t("%s n"),argv[ul]); imax =_tcslen(argv[ul])* sizeof(tchar); phex =(unsigned char*)argv[ul]; for(i=0;i<imax;i++){ c =*phex; printf("0x%x,",c); phex++; } printf(" n"); } } if(contentlength!= 0){ printf(" nstdindata n"); tp = (TCHAR*)calloc(contentLength+1,sizeof(TCHAR)); if(tp == NUL){ printf("memory Error"); }else{ tp1= tp; for(ul=0;ul<contentlength;ul++){ *tp1 =_gettchar(); tp1++; } *tp1 =' 0'; 120

122 _tprintf(_t("%s n"),tp); imax =contentlength * sizeof(tchar); phex =(unsigned char*)tp; for(i=0;i<imax;i++){ c =*phex; printf("0x%x,",c); phex++; } fre(tp); } } printf(" n"); } returnnretcode; } 6.23 JavaServler で Web ブラウザから 受 け 取 ったリクエストのバイト 列 表 示 バイト 列 への 変 換 方 式 を UTF-16 にすることで 内 部 状 態 を 壊 さないようにしている protectedvoiddopost(htpservl etrequestrequest,htpservletr esponseresponse)throwsservle texception, IOException { // QueryString の 場 合 は dopost() ではなくて dog et() にするだけ StringmyStr; StringmyHexStr; inti; intimax; intmyi; myhexstr = "; // request.setcharacterencoding("windows-31j"); // request.setcharacterencoding("utf-8"); // 上 の 行 とどちらか 一 方 のみコメントアウトをはず す mystr = request.getparameter("inputstr"); try{ byte mybyte[] =mystr.getbytes("utf-16"); imax =mybyte.length; for(i=0;i<imax;i++){ 121

123 myi= (int)mybyte[i]; if(myhexstr!= ""){ myhexstr += ","; } myhexstr += myi; } }catch(exception e){ } myhexstr = HTMLEscape(myHexStr); mystr = HTMLEscape(myStr); request.setattribute("inputstr",mystr); request.setattribute("inputhexstr",myhexstr); getservletconfig().getservletcontext().getrequestdispatcher("/result.jsp").forward(request,response); } private String HTMLEscape(String str){ Stringtmp =str.replaceall("&","&"); tmp= tmp.replaceall("<","<"); tmp= tmp.replaceall(">",">"); tmp= tmp.replaceall(" "","""); returntmp.replaceall("'","&#39;"); } 122

124 7 付 記 2 123

125 7.1 TCHAR の 既 定 の 文 字 コードについて プログラム 内 部 での 文 字 列 処 理 に char(unsigned char) 型 (ANSI コード)を 使 っているのか WCHAR 型 (UNICODE)を 使 っているのかというのが 本 文 書 の 問 題 の 本 質 となるのであるが 本 章 では TCHAR 型 について 注 目 してみた TCHAR 型 は UNICODE が 定 義 されている 場 合 は WCHAR 型 としてコンパイルされ そうでな い 場 合 は char(mbcs が 定 義 されていると unsigned char) 型 としてコンパイルされる よって この TCHAR 型 が 各 開 発 環 境 でどのような 状 況 になっているか 調 査 した 7.2 MS-VisualStudio6.0 SP6 の 場 合 MS-VisualStudio6.0 SP6/MS-WindowsXP SP3 で Win32 コンソールアプリケーションのウィ ザードを 利 用 した 場 合 図 7.2-1のように MBCS が 既 定 値 となっている このことから VissualStudio6.0 で 作 成 されるプログラムの 多 くは ANSI コードで 作 成 されるも のと 推 定 される 図 : Win32 コンソールアプリの 場 合 既 定 値 は M B CS となっている 124

126 int_tmain(int argc, _TCHAR* argv[]){ _tprintf(_t("load %s n"),argv[0]); #ifdef_unicode _tprintf(_t("_unicodedefined n"); #else _tprintf(_t("_unicodenot defined n")); #endif _tprintf(_t("end %s n"),argv[0]); return0; } 図 : 実 際 に 作 成 したプログラムはこんな 単 純 なプログラム 図 : 図 7.2-2を 既 定 のままコンパイルする または 設 定 なし と 変 更 すると 非 UNICODE プログラムとなっている 図 : 図 7.2-2の 設 定 を UNICODE に 変 更 すると UNICODE プログラムとなった 125

127 7.3 MS-VisualC++.NET 2003 の 場 合 MS-VisualC++.NET 2003/MS-WindowsXP SP2 で Win32 コンソールアプリケーションのウィ ザードを 利 用 した 場 合 図 7.3-1のように MBCS が 既 定 値 となっている このことから VissualStudio2003 で 作 成 されるプログラムの 多 くは ANSI コードで 作 成 される ものと 推 定 される 図 : Win32 コンソールアプリの 場 合 既 定 値 は M B CS となっている 図 : 図 7.2-2を 既 定 のままコンパイルする または 設 定 なし と 変 更 すると 非 UNICODE プログラムとなっている 図 : 図 7.2-2の 設 定 を UNICODE に 変 更 すると UNICODE プログラムとなった 126

128 7.4 MS-VisualStudio2005 ExpressEdition の 場 合 MS-VisualStudio2005 ExpressEdition/MS-WindowsXP SP2 で Win32 コンソールアプリケー ションのウィザードを 利 用 した 場 合 図 7.4-1のように UNICODE が 既 定 値 となっている このことから VissualStudio2005 で 作 成 されるプログラムの 多 くは UNICODE で 作 成 されるも のと 推 定 される 図 : Win32 コンソールアプリの 場 合 既 定 値 は U N IC O DE となっている 図 : 図 7.2-2を 既 定 のままコンパイルすると UNICODE プログラムとなっている 127

129 図 : 図 7.2-2の 設 定 を MBCS に 変 更 する または 設 定 なし と 変 更 すると 非 UNICODE プログラムとなった 7.5 MS-VisualStudio2008 ExpressEdition の 場 合 MS-VisualStudio2008 ExpressEdition/MS-Windows Server2008 StandardEdition SP0 で Win32 コンソールアプリケーションのウィザードを 利 用 した 場 合 図 7.5-1のように UNICODE が 既 定 値 となっている このことから MS-VissualStudio2008 で 作 成 されるプログラムの 多 くは UNICODE で 作 成 され るものと 推 定 される 図 : Win32 コンソールアプリの 場 合 既 定 値 は U N IC ODE となっている 128

130 図 : 図 7.2-2を 既 定 のままコンパイルすると UNICODE プログラムとなっている 図 : 図 7.2-2の 設 定 を MBCS に 変 更 する または 設 定 なし と 変 更 すると 非 UNICODE プログラムとなった 129

131 以 上 130

目次 1 UNICODE とサニタイジング回避テクニック UNICODE とサニタイジング回避テクニックとは ( 本文書の目的 ) UNICODE を使ったサニタイジング回避テクニックの本質 UNICODE を使ったサニタイジング回避テクニックへの対策 7 2 U

目次 1 UNICODE とサニタイジング回避テクニック UNICODE とサニタイジング回避テクニックとは ( 本文書の目的 ) UNICODE を使ったサニタイジング回避テクニックの本質 UNICODE を使ったサニタイジング回避テクニックへの対策 7 2 U UNICODE と サニタイジング回避テクニック 2007 年 03 月 18 日 Ver. 1.5 目次 1 UNICODE とサニタイジング回避テクニック 4 1.1 UNICODE とサニタイジング回避テクニックとは ( 本文書の目的 ) 5 1.2 UNICODE を使ったサニタイジング回避テクニックの本質 5 1.3 UNICODE を使ったサニタイジング回避テクニックへの対策 7 2 UNICODE

More information

第1回

第1回 やすだ 社 会 学 研 究 法 a( 2015 年 度 春 学 期 担 当 : 保 田 ) 基 礎 分 析 ( 1): 一 変 量 / 二 変 量 の 分 析 SPSSの 基 礎 テ キ ス ト pp.1-29 pp.255-257 デ ー タ の 入 力 [ デ ー タ ビ ュ ー ] で Excelの よ う に 直 接 入 力 で き る [ 変 数 ビ ュ ー ] で 変 数 の 情 報 を

More information

Microsݯft Word - 91 forܠ2009November.docx

Microsݯft Word - 91 forܠ2009November.docx 特 集 : Query & Analysis の 仕 訳 転 送 機 能 SunSystems と 連 携 し て 使 用 す る こ と が で き る Infor Performance Management Query&Analysis( 以 下 Q&A) ( 旧 : SunSystems Vision ) と い う 製 品 が あ り ま す Q&A は Microsoft Excel の

More information

R4財務対応障害一覧

R4財務対応障害一覧 1 仕 訳 入 力 仕 訳 入 力 時 摘 要 欄 で. + Enter を 押 すと アプリケーションでエラーが 発 生 しまインデックスが 配 列 の 境 界 外 です が 出 る 場 合 がある 問 題 に 対 応 しま 2 仕 訳 入 力 仕 訳 入 力 主 科 目 と 補 助 科 目 を 固 定 にすると2 行 目 以 降 の 補 助 科 目 コピーが 動 作 しない 問 題 に 対 応

More information

目 次 1. 大 学 情 報 データベースシステムの 使 用 方 法 について... 1 1.1.EXCEL 一 括 登 録... 1 1.2.EXCEL ダウンロード... 2 1.2.1. 検 索 条 件 の 指 定 プレビュー... 3 1.2.2.EXCEL ダウンロード(データ 抽 出 あ

目 次 1. 大 学 情 報 データベースシステムの 使 用 方 法 について... 1 1.1.EXCEL 一 括 登 録... 1 1.2.EXCEL ダウンロード... 2 1.2.1. 検 索 条 件 の 指 定 プレビュー... 3 1.2.2.EXCEL ダウンロード(データ 抽 出 あ 大 学 情 報 データベースシステム EXCEL 一 括 登 録 マニュアル 目 次 1. 大 学 情 報 データベースシステムの 使 用 方 法 について... 1 1.1.EXCEL 一 括 登 録... 1 1.2.EXCEL ダウンロード... 2 1.2.1. 検 索 条 件 の 指 定 プレビュー... 3 1.2.2.EXCEL ダウンロード(データ 抽 出 あり)... 5 1.2.3.EXCEL

More information

雇用保険被保険者資格取得届(様式)編

雇用保険被保険者資格取得届(様式)編 平 成 2 8 年 3 月 1 日 第 4 版 発 行 e-gov 電 子 申 請 実 務 マ ニ ュ ア ル 香 川 県 社 会 保 険 労 務 士 会 目 次 1. 手 続 検 索 1 2. 申 請 書 の 作 成 3 3. 被 保 険 者 資 格 取 得 届 の 作 成 7 4. 提 出 代 行 証 明 書 の 添 付 8 5. 署 名 の 実 施 1 0 6. 申 請 書 の 送 信 1 1

More information

(Microsoft Word - \203A \225\345\217W\227v\227\314 .doc)

(Microsoft Word - \203A  \225\345\217W\227v\227\314 .doc) ま ち づ く り 推 進 の た め の ア ン ケ ー ト 調 査 及 び 分 析 業 務 委 託 プ ロ ポ ー ザ ル 募 集 要 領 1 趣 旨 本 要 領 は, ま ち づ く り 推 進 の た め の ア ン ケ ー ト 調 査 及 び 分 析 業 務 委 託 の 受 託 者 を 特 定 す る た め, 企 画 提 案 型 プ ロ ポ ー ザ ル 方 式 ( 以 下 プ ロ ポ ー

More information

平成27年度大学改革推進等補助金(大学改革推進事業)交付申請書等作成・提出要領

平成27年度大学改革推進等補助金(大学改革推進事業)交付申請書等作成・提出要領 平 成 7 年 度 大 学 改 革 推 進 等 補 助 金 ( 大 学 改 革 推 進 事 業 ) 交 付 申 請 書 等 作 成 提 出 要 領 交 付 申 請 等 に 当 たっては 大 学 改 革 推 進 等 補 助 金 ( 大 学 改 革 推 進 事 業 ) 取 扱 要 領 ( 以 下 取 扱 要 領 という ) も 参 照 の 上 以 下 の 関 係 書 類 を 作 成 し 各 大 学 短

More information

の と す る (1) 防 犯 カ メ ラ を 購 入 し 設 置 ( 新 設 又 は 増 設 に 限 る ) す る こ と (2) 設 置 す る 防 犯 カ メ ラ は 新 設 又 は 既 設 の 録 画 機 と 接 続 す る こ と た だ し 録 画 機 能 付 防 犯 カ メ ラ は

の と す る (1) 防 犯 カ メ ラ を 購 入 し 設 置 ( 新 設 又 は 増 設 に 限 る ) す る こ と (2) 設 置 す る 防 犯 カ メ ラ は 新 設 又 は 既 設 の 録 画 機 と 接 続 す る こ と た だ し 録 画 機 能 付 防 犯 カ メ ラ は 小 牧 市 地 域 防 犯 カ メ ラ 等 設 置 補 助 金 交 付 要 綱 平 成 2 8 年 3 月 2 2 日 2 7 小 市 安 第 7 5 7 号 ( 通 則 ) 第 1 条 小 牧 市 地 域 防 犯 カ メ ラ 等 設 置 補 助 金 ( 以 下 補 助 金 と い う )の 交 付 に つ い て は 市 費 補 助 金 等 の 予 算 執 行 に 関 す る 規 則 ( 昭 和

More information

為 が 行 われるおそれがある 場 合 に 都 道 府 県 公 安 委 員 会 がその 指 定 暴 力 団 等 を 特 定 抗 争 指 定 暴 力 団 等 として 指 定 し その 所 属 する 指 定 暴 力 団 員 が 警 戒 区 域 内 において 暴 力 団 の 事 務 所 を 新 たに 設

為 が 行 われるおそれがある 場 合 に 都 道 府 県 公 安 委 員 会 がその 指 定 暴 力 団 等 を 特 定 抗 争 指 定 暴 力 団 等 として 指 定 し その 所 属 する 指 定 暴 力 団 員 が 警 戒 区 域 内 において 暴 力 団 の 事 務 所 を 新 たに 設 暴 力 団 員 による 不 当 な 行 為 の 防 止 等 に 関 する 法 律 の 一 部 を 改 正 する 法 律 暴 力 団 員 による 不 当 な 行 為 の 防 止 等 に 関 する 法 律 例 規 整 備 * 暴 力 団 員 による 不 当 な 行 為 の 防 止 等 に 関 する 法 律 の 一 部 を 改 正 する 法 律 例 規 整 備 公 布 年 月 日 番 号 平 成 24 年

More information

1

1 Excelファイルアクセス 1. 概 要 Excel ファイルアクセスコンポーネントは Microsoft Excel のファイルを 開 いてセルの 値 や 書 式 を 取 得 変 更 したり テーブル 全 体 を 新 しいファイルと して 保 存 したりするために 用 います Excel ファイルアクセスコンポーネントは アプリケーションビルダーのメニューから 以 下 のように 選 びます [コンポーネント

More information

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2 目 次 動 作 環 境 特 長 方 法 方 法 起 動 終 了 方 法 方 法 操 作 方 法 使 方 使 方 使 方 詳 細 設 定 使 方 KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2 KINGSOFT Office 2016 特 長 主 特 長 以

More information

ホワイトワークスタイルの ご提案

ホワイトワークスタイルの ご提案 PrimeDrive Release Note 2015 年 4 月 19 日 リリース ソフトバンクモバイル 株 式 会 社 クラウドサービス 本 部 2015 年 4 月 10 日 1.リリース 機 能 (コーポレート 管 理 者 機 能 ) 1.コーポレート 管 理 者 機 能 1.1 フォルダとファイルの 所 有 者 を 他 のユーザに 移 動 する 機 能 の 追 加 1.2 ユーザのゴミ

More information

国 立 研 究 開 発 法 人 日 本 原 子 力 研 究 開 発 機 構 防 災 業 務 計 画 平 成 17 年 10 月 1 日 制 定 平 成 25 年 3 月 8 日 修 正 平 成 26 年 6 月 19 日 修 正 平 成 27 年 12 月 1 日 修 正 国 立 研 究 開 発 法 人 日 本 原 子 力 研 究 開 発 機 構 国 立 研 究 開 発 法 人 日 本 原 子 力

More information

研究者情報データベース

研究者情報データベース 研 究 者 情 報 管 理 システム 研 究 者 向 けデータ 一 括 登 録 機 能 操 作 マニュアル 2013 年 6 月 4 日 目 次 1. はじめに... 1 1.1 本 マニュアルの 注 意 事 項... 1 2. 操 作 手 順... 2 2.1 データ 登 録 手 順... 2 2.2 データ 読 み 込 みエラー 時 の 対 応 手 順... 13 3. 登 録 データ 一 覧...

More information

スライド 1

スライド 1 Android 版 目 視 録 運 用 操 作 マニュアル 作 成 2012/03/22 更 新 2014/09/26 目 視 録 とは 携 帯 またはパソコンで 施 工 写 真 を 登 録 確 認 できるシステムです ご 利 用 の 為 にはIDとパスワードが 必 要 です TEG ログインID ( ) パスワード ( ) https://teg.mokusiroku.com/

More information

https://www.online3.tdnet.info/onre/jsp/tdzz.download?uji.verb=

https://www.online3.tdnet.info/onre/jsp/tdzz.download?uji.verb= 平 成 21 年 3 月 期 平 成 20 年 7 月 31 日 上 場 会 社 名 松 井 建 設 株 式 会 社 上 場 取 引 所 東 コード 番 号 1810 URL http://www.matsui-ken.co.jp/ 代 表 者 ( 役 職 名 ) 取 締 役 社 長 ( 氏 名 ) 松 井 隆 弘 問 合 せ 先 責 任 者 ( 役 職 名 ) 管 理 本 部 経 理 部 長 (

More information

目 次 1. Web メールのご 利 用 について... 2 2. Web メール 画 面 のフロー 図... 3 3. Web メールへのアクセス... 4 4. ログイン 画 面... 5 5. ログイン 後 (メール 一 覧 画 面 )... 6 6. 画 面 共 通 項 目... 7 7.

目 次 1. Web メールのご 利 用 について... 2 2. Web メール 画 面 のフロー 図... 3 3. Web メールへのアクセス... 4 4. ログイン 画 面... 5 5. ログイン 後 (メール 一 覧 画 面 )... 6 6. 画 面 共 通 項 目... 7 7. Web メール 操 作 説 明 書 京 都 与 謝 野 町 有 線 テレビ 0 目 次 1. Web メールのご 利 用 について... 2 2. Web メール 画 面 のフロー 図... 3 3. Web メールへのアクセス... 4 4. ログイン 画 面... 5 5. ログイン 後 (メール 一 覧 画 面 )... 6 6. 画 面 共 通 項 目... 7 7. メール 一 覧 画 面...

More information

治 験 実 施 管 理 システム NMGCP 向 け Excel 形 式 プロトコール 作 成 手 順 書 V4.0.3 対 応 版 第 1 版 株 式 会 社 富 士 通 アドバンストエンジニアリング All Rights Reserved,Copyright 株 式 会 社 富 士 通 アドバン

治 験 実 施 管 理 システム NMGCP 向 け Excel 形 式 プロトコール 作 成 手 順 書 V4.0.3 対 応 版 第 1 版 株 式 会 社 富 士 通 アドバンストエンジニアリング All Rights Reserved,Copyright 株 式 会 社 富 士 通 アドバン 2014 年 1 月 7 日 治 験 依 頼 者 各 位 新 潟 市 民 病 院 治 験 管 理 室 Excel 形 式 の 電 子 プロトコール 提 出 の 御 依 頼 当 院 では 効 率 的 で 正 確 な 治 験 の 実 施 のため 電 子 カルテ 内 に 専 用 の Excel 形 式 による 電 子 プロトコールを 導 入 しております つきましては 治 験 依 頼 の 際 に 下 記

More information

2 役 員 の 報 酬 等 の 支 給 状 況 役 名 法 人 の 長 理 事 理 事 ( 非 常 勤 ) 平 成 25 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 16,936 10,654 4,36

2 役 員 の 報 酬 等 の 支 給 状 況 役 名 法 人 の 長 理 事 理 事 ( 非 常 勤 ) 平 成 25 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 16,936 10,654 4,36 独 立 行 政 法 人 駐 留 軍 等 労 働 者 労 務 管 理 機 構 の 役 職 員 の 報 酬 給 与 等 について Ⅰ 役 員 報 酬 等 について 1 役 員 報 酬 についての 基 本 方 針 に 関 する 事 項 1 平 成 25 年 度 における 役 員 報 酬 についての 業 績 反 映 のさせ 方 検 証 結 果 理 事 長 は 今 中 期 計 画 に 掲 げた 新 たな 要

More information

-2-

-2- -1- -2- -3- < 別 表 > FLP 演 習 教 育 活 動 補 助 費 の 補 助 項 目 および 補 助 支 出 基 準 ( 取 扱 要 綱 第 3 条 関 係 ) ( 注 記 ) 補 助 額 は 特 段 の 注 記 がない 場 合 は 税 込 額 を 表 示 している 1. 見 学 調 査 補 助 項 目 支 払 対 象 補 助 額 備 考 交 通 費 学 生 参 加 学 生 1 人

More information

01_07_01 データのインポート_エクスポート_1

01_07_01 データのインポート_エクスポート_1 データのインポート/エクスポートについて 概 要 スタッフエクスプレスでは 他 のソフトウェアで 作 成 されたスタッフデータ 得 意 先 データなどを 取 り 込 む(インポートする)ことができます また スタッフエクスプレスに 登 録 済 みのデータを Excel 形 式 CSV 形 式 で 出 力 (エクスポート)す ることができます 注 意 インポートできるデータは 次 の 条 件 を 満

More information

Microsoft Word - Active.doc

Microsoft Word - Active.doc 利 マニュアル 梅 校 メールサーバをご 利 されていた 教 員 の 皆 さまへ 2009 年 1 7 のメールサーバ 移 に 伴 い 学 外 からの 電 メールの 送 受 信 はウェブメール(Active!mail) からのみ 可 能 となりました Active!mail の 利 法 については 本 マニュアルをご 確 認 ください 次 Active!mail にログインする...2 Active!mail

More information

目 次 1. 論 理 関 数 IF... 1 2. IF の 概 要... 1 3. 論 理 式 の 種 類... 2 3.1.1. 等 号... 2 3.1.2. 不 等 号... 2 4. 具 体 的 な 使 い 方... 2 5. ネスト... 3 6. 複 数 の 条 件 を 記 述...

目 次 1. 論 理 関 数 IF... 1 2. IF の 概 要... 1 3. 論 理 式 の 種 類... 2 3.1.1. 等 号... 2 3.1.2. 不 等 号... 2 4. 具 体 的 な 使 い 方... 2 5. ネスト... 3 6. 複 数 の 条 件 を 記 述... 平 成 26 年 12 月 6 日 跡 見 学 園 女 子 大 学 公 開 講 座 パソコンセミナー Excel 入 門 第 1 回 応 用 編 文 学 部 現 代 文 化 表 現 学 科 准 教 授 伊 藤 穣 [email protected] http://www2.mmc.atomi.ac.jp/~j-ito/ 目 次 1. 論 理 関 数 IF... 1 2. IF の 概 要... 1

More information

<4D6963726F736F667420576F7264202D20819B93FC97CD835683588365838082CC91808DEC95FB964081693230313589FC92F994C5816A>

<4D6963726F736F667420576F7264202D20819B93FC97CD835683588365838082CC91808DEC95FB964081693230313589FC92F994C5816A> 岡 山 大 学 情 報 データベースシステムの 操 作 方 法 1 インターネットブラウザの 設 定 まず ご 利 用 のブラウザ 環 境 に 応 じて 以 下 URL に 記 載 されている 設 定 を 行 ってください この 設 定 をしていない 場 合 岡 山 大 学 情 報 データベースシステムを 利 用 できない 場 合 があります Windows の Internet Explorer7.0

More information

・モニター広告運営事業仕様書

・モニター広告運営事業仕様書 秋 田 市 新 庁 舎 動 画 広 告 放 映 事 業 仕 様 書 1 目 的 多 く の 市 民 の 目 に 触 れ る 市 役 所 の 特 性 を 活 か し 映 像 や 音 声 を 活 用 し た モ ニ タ ー に よ る 動 画 広 告 を 新 庁 舎 内 に 導 入 し 新 庁 舎 の 主 要 機 能 の 一 つ で あ る 情 報 発 信 拠 点 と し て の 役 割 を 果 た す

More information

預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可

預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可 ミスミグループ コーポレートガバナンス 基 本 方 針 本 基 本 方 針 は ミスミグループ( 以 下 当 社 グループ という)のコーポレートガバナン スに 関 する 基 本 的 な 考 え 方 を 定 めるものである 1. コーポレートガバナンスの 原 則 (1) 当 社 グループのコーポレートガバナンスは 当 社 グループの 持 続 的 な 成 長 と 中 長 期 的 な 企 業 価 値 の

More information

2 役 員 の 報 酬 等 の 支 給 状 況 平 成 27 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 役 名 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 2,142 ( 地 域 手 当 ) 17,205 11,580 3,311 4 月 1

2 役 員 の 報 酬 等 の 支 給 状 況 平 成 27 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 役 名 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 2,142 ( 地 域 手 当 ) 17,205 11,580 3,311 4 月 1 独 立 行 政 法 人 統 計 センター( 法 人 番 号 7011105002089)の 役 職 員 の 報 酬 給 与 等 について Ⅰ 役 員 報 酬 等 について 1 役 員 報 酬 についての 基 本 方 針 に 関 する 事 項 1 役 員 報 酬 の 支 給 水 準 の 設 定 についての 考 え 方 独 立 行 政 法 人 通 則 法 第 52 条 第 3 項 の 規 定 に 基 づき

More information

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Ⅱ 国 地 方 公 共 団 体 公 共 公 益 法 人 等 の 消 費 税 Q&A ( 問 1) 免 税 期 間 における 起 債 の 償 還 元 金 に 充 てるための 補 助 金 等 の 使 途 の 特 定 Q 地 方 公 共 団 体 の 特 別 会 計 が 消 費 税 の 納 税 義 務 が 免 除 される 課 税 期 間

More information

2 出 願 資 格 審 査 前 記 1の 出 願 資 格 (5) 又 は(6) により 出 願 を 希 望 する 者 には, 出 願 に 先 立 ち 出 願 資 格 審 査 を 行 いますので, 次 の 書 類 を 以 下 の 期 間 に 岡 山 大 学 大 学 院 自 然 科 学 研 究 科 等

2 出 願 資 格 審 査 前 記 1の 出 願 資 格 (5) 又 は(6) により 出 願 を 希 望 する 者 には, 出 願 に 先 立 ち 出 願 資 格 審 査 を 行 いますので, 次 の 書 類 を 以 下 の 期 間 に 岡 山 大 学 大 学 院 自 然 科 学 研 究 科 等 Ⅱ 入 学 者 選 抜 試 験 学 生 募 集 要 項 ( 自 然 科 学 研 究 科 環 境 学 研 究 科 共 通 ) ( 入 学 時 期 : 平 成 18 年 10 月 又 は 平 成 19 年 4 月 ) 1 出 願 資 格 次 の 各 号 のいずれかに 該 当 する 者 です (1) 修 士 の 学 位 若 しくは 専 門 職 学 位 を 有 する 者 又 は 平 成 19 年 3 月 (

More information

事前チェック提出用現況報告書作成ツール入力マニュアル(法人用)

事前チェック提出用現況報告書作成ツール入力マニュアル(法人用) 事 前 チェック 提 出 用 現 況 報 告 書 作 成 ツール 入 力 マニュアル ( 法 人 用 ) 平 成 26 年 7 月 一 般 社 団 法 人 日 本 補 償 コンサルタント 協 会 目 次 1. ツールの 概 要 1 2. 動 作 環 境 1 3. マクロの 設 定 (1) Excel のバージョンの 確 認 2 (2) マクロの 設 定 3 4. 現 況 報 告 書 の 作 成 (1)

More information

文化政策情報システムの運用等

文化政策情報システムの運用等 名 開 始 終 了 ( 予 定 ) 年 度 番 号 0406 平 成 25 年 行 政 レビューシート ( 文 部 科 学 省 ) 文 化 政 策 情 報 システム 運 用 等 担 当 部 局 庁 文 化 庁 作 成 責 任 者 平 成 8 年 度 なし 担 当 課 室 長 官 官 房 政 策 課 政 策 課 長 清 水 明 会 計 区 分 一 般 会 計 政 策 施 策 名 根 拠 法 令 ( 具

More information

0605調査用紙(公民)

0605調査用紙(公民) 社 会 公 民 番 号 2 略 称 東 京 書 籍 書 名 新 編 新 し 公 民 1 基 礎 基 本 確 実 な 定 着 を 図 るため を 促 すため や 個 応 じた 3 単 元 ( 単 元 設 定 4 各 年 ( び や 考 え 展 開 5 特 徴 的 な 単 元 おけ る 課 題 関 わり 等 ア 1 単 位 時 間 ( 見 開 き 2 頁 ) 毎 課 題 を 設 定 し 課 題 関 連

More information

Microsoft Word - ML_ListManager_10j.doc

Microsoft Word - ML_ListManager_10j.doc メーリングリスト 利 用 の 手 引 き(リスト 管 理 者 編 ) for LyrisSynaptive ListManager 10j 第 5 版 目 次... 1 1. メーリングリストとは?... 2 2. メーリングリストの 開 設... 2 2-1 管 理 者 画 面 へのログイン... 2 2-2 リスト 管 理 者 自 身 のパスワードの 変 更... 4 3. メンバーの 登 録...

More information

DN6(R04).vin

DN6(R04).vin page 1 / 2 DataNature6(R04)リリースノート 新 機 能 機 能 改 良 (1) 期 間 項 目 への 締 め 日 の 反 映 年 度 上 期 / 下 期 四 半 期 において 設 定 した 締 め 日 を 反 映 させるかどうかの 設 定 を 追 加 (2) 週 の 設 定 方 法 の 追 加 日 付 から 期 間 の 設 定 で 週 を 追 加 する 場 合 に 週 の"

More information

大田市固定資産台帳整備業務(プロポーザル審査要項)

大田市固定資産台帳整備業務(プロポーザル審査要項) 大 田 市 整 備 業 務 プロポーザル 審 査 要 項 大 田 市 業 務 プロポーザルの 審 査 は 提 案 書 等 を 下 記 のとおり 審 査 評 価 するものとす る. 審 査 の 対 象 事 業 者 審 査 の 対 象 事 業 者 は 次 の()から()に 掲 げる 条 件 をすべて 満 たし 一 つでも 満 たない 場 合 は 審 査 の 対 象 事 業 者 に 該 当 しないものとする

More information

購買ポータルサイトyOASIS簡易説明書 b

購買ポータルサイトyOASIS簡易説明書 b 購 買 ポータルサイト yoasis 簡 易 説 明 書 横 河 電 機 株 式 会 社 本 書 は 購 買 ポータルサイト yoasis の 簡 易 的 な 基 本 操 作 について 記 載 してあります 詳 細 な 操 作 方 法 については 別 冊 の 購 買 ポータルサイト yoasis 操 作 説 明 書 をご 覧 下 さい 本 書 の 内 容 は 性 能 / 機 能 の 向 上 などにより

More information

2 シ ス テ ム が 2 4 時 間 3 6 5 日 安 定 的 に 稼 働 す る 機 材 と 設 置 環 境 を 整 え る こ と ( 2 ) ソ フ ト ウ ェ ア 1 既 に 導 入 実 績 の あ る CMS で あ る こ と 2 Windows7(Windows IE1 1 ) で

2 シ ス テ ム が 2 4 時 間 3 6 5 日 安 定 的 に 稼 働 す る 機 材 と 設 置 環 境 を 整 え る こ と ( 2 ) ソ フ ト ウ ェ ア 1 既 に 導 入 実 績 の あ る CMS で あ る こ と 2 Windows7(Windows IE1 1 ) で 結 の 故 郷 匠 の 技 体 験 観 光 事 業 ウ ェ ブ サ イ ト 構 築 保 守 管 理 業 務 仕 様 書 1. 業 務 名 結 の 故 郷 匠 の 技 体 験 観 光 事 業 ウ ェ ブ サ イ ト 構 築 保 守 管 理 業 務 2. 目 的 こ の 業 務 は 越 前 お お の 雇 用 創 造 推 進 協 議 会 ( 以 下 協 議 会 と い う )が 実 施 す る 実 践

More information

技術報告会原稿フォーマット

技術報告会原稿フォーマット Web 情 報 共 有 サービス 利 用 マニュアル 1. ファイルの 保 存 ブラウザを 開 き https://webshare.kyokyo-u.ac.jp を 開 く.ログイン 画 面 が 表 示 されるので,ユーザ ID(メールの ID) とパスワードを 入 力 し,ログインボタンをクリックする( 図 2). ログインに 成 功 すると,TOP フォルダの 一 覧 が 表 示 される (

More information

<4D6963726F736F667420576F7264202D20457863656C97F195CF8AB72091808DEC90E096BE8F912091E6312E313294C52E646F63>

<4D6963726F736F667420576F7264202D20457863656C97F195CF8AB72091808DEC90E096BE8F912091E6312E313294C52E646F63> Excel 列 変 換 Ver.1.0.3 操 作 説 明 書 第 1.1 版 Copyright (C) 2008 株 式 会 社 恒 河 沙 変 更 履 歴 版 作 成 日 作 成 者 主 な 変 更 点 第 1.0 版 2008/10/29 ( 株 ) 恒 河 沙 東 野 貴 行 新 規 作 成 第 1.1 版 2008/11/04 ( 株 ) 恒 河 沙 東 野 貴 行 - 2 - 目 次

More information