かずきち。の日記

サーバサイドエンジニアのつぶやき

【悪用厳禁】APIが提供されていないウェブサービスでも無理やりログインセッションをGASのプログラムに実装して、instagramでいいねしまくる【クロスサイトスクリプティング】

クロスサイトスクリプティングって何?

クロスサイトスクリプティングについて解説をします。
そんな言葉聞いたことないよという方でも噛み砕いて説明しますので、ご安心ください。
この記事を読めば、ログイン認証が必要なサイトのプログラムでの突破方法を解説行きますので最後までご閲覧ください。
エンジニアの方も、非エンジニアの方もわかりやすく解説します。

まずクロスサイトスクリプティングがわからん

そりゃそうですよね。
話が難しいです。
そこでまず自分の家の鍵を想像してください。
皆さん家に鍵ついていますよね?

f:id:kazukichi_0914:20220416135400g:plain
引用:
https://www.irasutoya.com/2017/05/blog-post_44.html

そしてたぶん合鍵を作っていたりするかと思います。
クロスサイトスクリプティングとは他人がサイトにアクセスするときの鍵を模造してしまおうという算段です。
他人があるサイトにログインしようとしたら、その時のIDとパスワードは盗まれないけれど、サイトにログインしている状態を奪取されるというイメージです。
なので、別にパスワードは盗んでいないんですけど、実質的にはログイン状態を奪取していることになります。
最近ではこの手の手法を利用したアプリを巷でよく見ます。
moneyforwardであったり、他人のサイトへにログインを使って、他のサービスをする類です。

今回はinstagramのログインをプログラムから行ってみたいと思います

別に犯罪というわけでもなく、普段みなさんが普段コンピュータにやってもらってることをプログラムから起動します。
さっそく解説していきましょう。

f:id:kazukichi_0914:20220416140444g:plain

instagramのログイン画面はこんな画面でここにログインIDとパスワードを使ってサインインします。
すると自分のページに行けるわけです。
金融機関のサイトなどもそうだと思います。
開発者モードでinstagramに送っている情報を表示します。

f:id:kazukichi_0914:20220417204017g:plain

すると今開いているサイトのcsrtokenやsesssionidがわかります。
ブラウザで開いているページがこのcsrtokenやsessionidと等しい値を持っていたら、ウェブサイトは「こやつ本物だな」と認識をします。
なのでここのトークンをコピーしておきます。
あとスクリプトを73行ほど記述します。

/*
instagramのログイン情報をhearderに格納
*/

var headers = {
  "cookie":"sessionid=6193386977%3AHCCgQNNdpXDTxxxxxx;",
    "x-csrftoken":"3AP5HL54eoZCCM395CBycadUxxxxxxxx"
};

まずはこんな形でヘッダー配列にログインセッションを格納します。

function GET_ID_LIST() {
  try {
    var tag = SELECT_TAG();
    var url = "https://www.instagram.com/explore/tags/" + tag + "/?__a=1";
    var options = {
      "method" : "get",
      "headers" : headers
    };
    var reply = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(reply);
    var data = json["data"]["recent"]["sections"];
    var ID_LIST = [];
    for(var i=0; i<data.length; i++) {
      var id_num = data[i]["layout_content"]["medias"][0]["media"]["id"]
      var id = id_num.slice(0,id_num.indexOf("_"))
      ID_LIST.push(id);
    };
    return ID_LIST;
  } catch(error) {
    console.log("GET_ID_LISTでエラー発生")
  };
};

ここでinstagramにGETリクエストをするときにheaderに自身で取得したヘッダー情報を埋め込みます。
するとinstagramは「こやつ本物だな」と認識をします。

ログインができたらいいねしまくったりします
/*
タグをつけて投稿しているユーザのIDを取得
*/

function GET_ID_LIST() {
  try {
    var tag = SELECT_TAG();
    var url = "https://www.instagram.com/explore/tags/" + tag + "/?__a=1";
    var options = {
      "method" : "get",
      "headers" : headers
    };
    var reply = UrlFetchApp.fetch(url, options);
    var json = JSON.parse(reply);
    var data = json["data"]["recent"]["sections"];
    var ID_LIST = [];
    for(var i=0; i<data.length; i++) {
      var id_num = data[i]["layout_content"]["medias"][0]["media"]["id"]
      var id = id_num.slice(0,id_num.indexOf("_"))
      ID_LIST.push(id);
    };
    return ID_LIST;
  } catch(error) {
    console.log("GET_ID_LISTでエラー発生")
  };
};

/*
指定したinstagramのタグに10秒間のsleepを入れて自動いいねします(GASの連続実行はGsuteBasicでは10分間のため)
*/

function Create_Favorite() {
  try {
    var ID_LIST = GET_ID_LIST();
    for (var i in ID_LIST) {
      var url = "https://www.instagram.com/web/likes/" + ID_LIST[i] + "/like/";
      var options = {
        "method" : "post",
        "headers" : headers
      };
      var ResponseCode = UrlFetchApp.fetch(url, options).getResponseCode();
      Utilities.sleep(10 * 1000);
      console.log(ResponseCode);
    };
  } catch(error) {
    console.log("Create_Favoriteでエラー発生");
  };
};

これで特定のタグを付けている人の投稿を一網打尽にいいねします。
instagramにアカウント停止を喰らわないようにsleepを入れて1日の上限に達しないように正しく運用しましょう♪
SELECT_TAG()には自分の好きなタグを入れておきましょう!