凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 47049
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

みなさん、エイプリルフールはいかがでしたか? ネットでの1年に一度のお祭りですからね。楽しまない手はありません。

当blogでは3本のエイプリルフールネタを用意しました。

わんくま同盟ではエイプリルフールネタは先頭に*をつけるようになっています。 そのほかのエイプリルフールネタは こちらをどうぞ。

種明かし

*で隠されたパスワードがJavaScriptによって抜取られる

これはJavaScriptを用いたセキュリティホールっぽいネタでした。

参照している元ネタ記事は本物で、JavaScriptを使うことでpasswordフィールドの値を 参照できてしまいます。のんきに「便利~」とか言っているのはいかがかと思うのですが…。

サンプルコードのHTMLを実際に試すと分かるのですが、 iFrameの外からもpasswordフィールドを参照できます。これも本当。

では、他のページをFrame内に表示させてpasswordフィールドを参照できるかというとできない。 これは、JavaScriptのサンドボックスによって阻まれます。 ドメインが違った場合は参照できないようになっているんですね。

ただし、アドレスバーでのJavaScriptは該当ドメインでのスクリプトとみなされるので アドレスバーのスクリプトであればどこのページでも読み込むことができます。

* Microsoft J#に代わる新しいJava互換言語

こちらは純粋に嘘記事ですね。

script APIによるサンプルは本物で、実際のコードもそのようになります。 ただし、拡張子csに対するスクリプトエンジンは現時点では存在しないでしょうから 実際には実行時エラーになることでしょう。

もし、拡張子csに対するスクリプトエンジンの実装があれば、本当に動くコードです。

*演算子を用いてJavaでポインタを扱う

JavaでC言語的なポインタは当然扱えないわけですが、 提示のサンプルプログラムは本当に動くので性質が悪い。

ソースをコピー&ペーストしてEclipseに乗っけて見た人は、 本当にコンパイルエラーが出ず、本当に実行すると8という計算結果がコンソールに出力され驚いたかもしれません。

public class Test {
    public static void main(String[] args) {
        int i = 5;
        // #start unsafe# http://java.sun.com\u000a\u002f\u002a
        int *ip = &i;
        // ポインタの内容に3を加算
        *ip += 3;
        // 演算結果をiに代入
        i = *ip;
        // #end unsafe# http://java.sun.com\u002a\u002fi+=\u0033\u003b
        System.out.println(i);
    }
}

これは、Javaのソースで\uXXXXという形式でUnicodeによる文字エスケープする機能を利用しています。

サンプルコードにある\uXXXXを該当の文字に変更すると

public class Test {
    public static void main(String[] args) {
        int i = 5;
        // #start unsafe# http://java.sun.com
        /*
        int *ip = &i;
        // ポインタの内容に3を加算
        *ip += 3;
        // 演算結果をiに代入
        i = *ip;
        // #end unsafe# http://java.sun.com*/i+=3;
        System.out.println(i);
    }
}

というコードになります。このエスケープが入ってからコンパイルが行われるわけです。

\u000aがポイントで、改行コードですね。 これにより//コメントの後ろで改行を行って、コメントではなくして処理を書いているというカラクリ。

Eclipseのエディタは行単位で構文解析しているっぽく、この改行コードを検出できないようです。 そのため、エディタ上のハイライトではコメントの色に変ってくれない。

そういうわけで、なまじJavaがわかって、本当にエディタにコピーしてみた人ほど首を傾げることになります。

投稿日時 : 2008年4月2日 13:05
コメント
  • # re: エイプリルフールの種明かし
    myugaru
    Posted @ 2008/04/02 13:35
    なるほどポインタの謎はやはりコメントでしたかー。
    そういうプリプロセスが噛むんですねえ。
    C++→C#になってソースコードをプリプロセスする概念が皆無になってしまったので(条件#ifしか無い)コードに対する思想の違いが感じられますね。
    私はこの点はJavaの方が好きです。
    ちなみにC#のソースコードで一部の日本語コードをコメントに書くとエディタ上で表示がバグって表示されなくなるんです。(具体的には÷という文字をコメントに書けないです)
    まだまだC#はソースに対して(特に多言語対応に対して)発展途上なんだと思います。

  • # re: エイプリルフールの種明かし
    シャノン
    Posted @ 2008/04/02 13:43
    ÷って、UTF-16で0x00f7なんですねぇ。
  • # re: エイプリルフールの種明かし
    myugaru
    Posted @ 2008/04/02 13:44
    ・・・とコメントしておいて
    ほんとかなあ?って確認したら、

    どうやらVS2008になって×や÷がバグるのは修正されてたようです。
    VS2005までは÷とか×とかの文字がバグっていました。

    まあ今頃修正してるんだから”発展途上だ”って発言は有効ということで^^
    訂正させてもらいますm(_)m
  • # re: エイプリルフールの種明かし
    シャノン
    Posted @ 2008/04/02 14:15
    Unicode のコードポイント表記を目立たなくするために URL に見せかけているのが秀逸ですね。
  • # re: エイプリルフールの種明かし
    かずき
    Posted @ 2008/04/02 18:55
    おぉ~
    エイプリルフールネタということで動かないだろうと思って試してませんでしたorz
    脱帽です。
  • # re: エイプリルフールの種明かし
    囚人
    Posted @ 2008/04/02 19:20
    スゲー!
    芸が細かい。
  • # re: エイプリルフールの種明かし
    おぎわら
    Posted @ 2008/04/03 3:14
    すげー!
    感動しました!
    勉強になりました!
  • # re: エイプリルフールの種明かし
    凪瀬
    Posted @ 2008/04/03 12:55
    嘘のはずのコードが動くように見えるという嘘だったというわけです。
    「動くわけないじゃん」
    「こ、こいつ…。動くぞ…!」
    ってなシチュエーションを考えていたのですけども。
    凝りすぎたためか、あまりひっかかってくれなかったなぁ…。
  • # UFNzxMoWgbuaBOG
    http://247options.com/
    Posted @ 2011/12/23 18:29
    Of course, I understand a little about this post but will try cope with it!!...
  • # re: エイプリルフールの種明かし
    悪用厳禁
    Posted @ 2019/08/30 7:56
    こんにちは。拝読しました。

    このネタはnativeメソッドと組み合わせることでいろんなことができそうだなと思ったのでまとめてみました。
    実際に動くかは試していないのでわかりません(笑)

    https://www.eeb.co.jp/wordpress/?p=476 を参考にjavaのnativeメソッドtest()をC言語で実装する。
    printf("warning: you've been hacked!!");

    ②test()の呼び出しを行うjavaファイルを次のように書く
    /**/native /**/ test();
    ///*
    void test(){System.out.println("test");}
    //*/


    「*/native /*」 をユニコードエスケープする

    さらに///*の/*と//*/の*/をユニコードエスケープし、その左に改行のエスケープも入れる

    ⑤ここまででみかけは次のようになる。(?はユニコードエスケープ)

    /*?????????*/ test();
    //?????????
    void test(){System.out.println("test");}
    //?????????

    コメントを取り除くと
    test();
    void test(){System.out.println("test");}

    ⑥だがユニコードエスケープより、本当は次のようになっている
    /**/native /**/ test();
    //
    /*
    void test(){System.out.println("test");}
    //
    */

    コメントを取り除くと
    native test();

    ⑦以上の理論により、
    「test」と表示されそうなところが「warning: you've been hacked!!」と表示される


    悪用すればEclipseからウイルスを呼ぶこともできちゃうだろうし金銭とか扱うプログラムでやられれば実害も出そう。
タイトル
名前
Url
コメント