PHPで画像XSSの一味変わった対策。
IE仕様?をついた画像ファイルを使用したXSSというのがあります。なかなか決定的な対策がなく、私も困っています。画像の再コンバートとか、画像のファイルヘッダを確認するのも。コメントとかカラーパレットとかで、決定的なものがありません。
が、ちょっと作ってみたのが、
1.空の画像を作って
2.ユーザのアップロードしてきた画像を空の画像にコピーする
これだといけそうな気がしたので作っていました。
PHPのimagecopyを使って画像XSSをやっつける。どうぞHACKしてください。
http://tepppei.com/hackme/img.php
画像XSSの詳しくは有名な方々のブログの方にお任せ。
<html>
画像XSSの対策をしました。<br>
任意の画像ファイルをアップロードしてください。<br>
完了したら対策した画像のリンクが出ます。<br>
XSSが動いたらおめでとうですね。連絡ください。cybert.jp@gmail.com<br>
<form action="img.php" method="post" enctype="multipart/form-data">
<input type="file" name="userfile">
<input type="submit" name="submit" value="送信">
</form>
<?
if(!$_FILES['userfile']['name']){
die();
}
$user_filename = $_FILES['userfile']['name'];
$user_file = $_FILES['userfile']['tmp_name'];
//画像ファイルの高さ、幅のサイズ取得を試みる
list($width, $height) = getimagesize($user_file);
if(0 < $width + $height){} else {die("エラー:SIZEエラー");}
//拡張子を調べる
if(preg_match("/^.+\.jpeg$/i",$user_filename) OR preg_match("/.+\.jpg$/i",$user_filename)){
$ftype = "JPG";
}elseif(preg_match("/^.+\.png$/i",$user_filename)){
$ftype = "PNG";
}elseif(preg_match("/^.+\.bmp$/i",$user_filename)){
$ftype = "BMP";
}elseif(preg_match("/^.+\.gif$/i",$user_filename)){
$ftype = "GIF";
}else{
die("エラー:サポートしてません");
}
//空の画像を作ります
$blank_img = imagecreatetruecolor($width + 1,$height + 1);
//イメージIDをGETします
switch ($ftype) {
case "JPG":
$user_img = imagecreatefromjpeg($user_file);
break;
case "PNG":
$user_img = imagecreatefrompng($user_file);
break;
case "BMP":
$user_img = imagecreatefromwbmp($user_file);
break;
case "GIF":
$user_img = imagecreatefromgif($user_file);
break;
default:
die("エラー");
}
//ここがポイント。空の画像に、ユーザの画像をコピーします。
imagecopy($blank_img,$user_img,0,0,0,0,$width + 1,$height + 1);
//コピーした画像を上書きします
switch ($ftype) {
case "JPG":
imagejpeg($user_img,$user_file);
break;
case "PNG":
imagepng($user_img,$user_file);
break;
case "BMP":
imagewbmp($user_img,$user_file);
break;
case "GIF":
imagegif($user_img,$user_file);
break;
default:
die("エラー");
}
//メモリ上の画像を破棄します
imagedestroy($blank_img);
imagedestroy($user_img);
$fname = time() . "." . $ftype;
move_uploaded_file($_FILES['userfile']['tmp_name'], dirname(__FILE__) . "/". $fname );
print "<a href=\"{$fname}\">アップロード完了</a>";
Re:ウェブアプリケーションセキュリティとバッドノウハウ、そしてグッドラッパーの関係
kanatokoさんが、「ウェブアプリケーションセキュリティとバッドノウハウ、そしてグッドラッパーの関係」という記事をかかれてます。
私のように、にわかセキュリティ屋にとって一つの答えとなるものがあります。
開発とセキュリティにおいての3つの役割
kanaokoさんは、以下のように書かれています。
引用
- -
3つの役割
- -
さらに考察を進めるために、ウェブアプリケーション開発とセキュリティにおいて存在する3つの役割を示す。
・ウェブアプリケーション開発者
・グッドラッパー提供者
・セキュリティ研究者これら3つの役割はそれぞれ異なる目的を持ち、また異なる活動を行う。
私はおそらく、
・ウェブアプリケーション開発者 1割
・グッドラッパー提供者 4割
・セキュリティ研究者 5割
に当てはまると思います。
・グッドラッパー提供者が、セキュリティ屋から必要な情報(バッドノウハウ)を集めて開発者に分かり易い形にして(ラッパー)、情報を提供するのが大事
セカンドライフのLSLのセキュリティについて
書くつもり。乞うご期待。でもほんとにあったら、先にIPAだね
デジタル家電のセキュリティを問う(ルーターには脆弱性がいっぱい)
Webアプリケーションは、今では様々な家電でも動いています。携帯で録画できるHDDレコーダ、エアコン等様々なものがあります。イメージが沸きにくいかもしれませんが、PCのブラウザや携帯のi-mode等で、HDDレコーダの録画予約をしたり、エアコンの温度を設定したりすることができる物の大体が、デジタル家電に組み込まれたWebアプリケーションが制御しているものです。
Webアプリケーションの脆弱性は日々発見されていて、クロスサイトスクリプティングやSQLインジェクション等、最近はかなり知られて来るようになり、対策が施されたWebアプリケーションが多くなってきました。
しかし、デジタル家電に組み込まれたWebアプリケーションのぜい弱性はどうでしょうか?現在ブロードバンドルータのほとんどは、Webアプリケーションで設定するものがほとんどだと思います。
私のルータには
CSRF
XSS
認証の回避
ができることがわかりました。CSRFによるDNSサーバの不正登録、グローバルからのルータ管理画面へのアクセス許可設定されてしまうのが一番怖いかなと思いました