4

親愛なる同僚!あなたの助けが必要です。

まず第一に、これは広告ではありません。現在の日付にチケットがあるかどうかを知るために、鉄道チケットの Web サイトhttp://booking.uz.gov.ua/en/で POST リクエストを作成しようとしています。しかし... 問題があります。VBScript を使用して要求を作成しています。Web サイトで送信する HTTP ヘッダーと POST リクエストを知るために、Chrome の組み込み開発ツールを使用しました。

これが私のスクリプトです:

    Dim URL
    Dim URL2
    Dim URL3
    Dim sRequest
    Dim sCookies

    'This is web page where I need to enter information.
    URL = "http://booking.uz.gov.ua/en/"
    'This is path that Chrome shows to send POST request.
    URL2 = "http://booking.uz.gov.ua/en/purchase/search/"
    'Optional URL, Chrome shows this link near of URL2. I think this is .js that works                 on info I enter on web site (URL).
    'URL3 = "http://booking.uz.gov.ua/i/js/common.138.js"
    'POST request that Chrome shows to send.
    sRequest ="station_id_from=2200001&station_id_till=2208001&station_from=Kyiv&station_till=Odesa&date_        dep=09.19.2013&time_dep=00%3A00&search="
    'Here I'm using GET request to retrieve Set-Cookie Header (SessionID first of all)         to reuse in my second POST request.
    sCookies = GetSetHeader(URL)
    'Here I'm calling function to make POST request.
    Result = HTTPPost(URL2, sRequest)

    Function GetSetHeader(URL)
       Set objhttp = CreateObject("Microsoft.XmlHttp")
       objhttp.open "GET", URL, FALSE
       objhttp.Send
       'I'm getting only SessionID + other cookies that Chrome shows.
       GetSetHeader = Left (objhttp.getResponseHeader("Set-Cookie"), 38) & " " &         "HTTPSERVERID=server1; _gv_lang=en;         __utma=31515437.675496133.1376934004.1376934004.1376934004.1;         __utmb=31515437.2.10.1376934004; __utmc=31515437; __utmz=31515437.1376934004.1.1.utmcsr=        (direct)|utmccn=(direct)|utmcmd=(none)"
    End Function

    Function HTTPPost(URL2, sRequest) 
       'Header I just took from Chrome.
       Set objhttp = CreateObject("Microsoft.XmlHttp")
       objHTTP.open "POST", URL2, false
       objHTTP.setRequestHeader "Connection", "keep-alive"
       objHTTP.setRequestHeader "Host", "booking.uz.gov.ua"
       objHTTP.setRequestHeader "Connection", "keep-alive"
       objHTTP.setRequestHeader "Content-Length", "Len(Request)"
       objHTTP.setRequestHeader "GV-Token", "64214392f178b9f91e3b61a069915cd1"
       objHTTP.setRequestHeader "Origin", "http://booking.uz.gov.ua"
       objHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64)         AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
       objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
       objHTTP.setRequestHeader "GV-Unique-Host", "1"
       objHTTP.setRequestHeader "GV-Ajax", "1"
       objHTTP.setRequestHeader "GV-Screen", "1366x768"
       objHTTP.setRequestHeader "GV-Referer", "http://booking.uz.gov.ua/en/"
       objHTTP.setRequestHeader "Accept", "*/*"
       objHTTP.setRequestHeader "Referer", "http://booking.uz.gov.ua/en/"
       objHTTP.setRequestHeader "Accept-Encoding", "gzip,deflate,sdch"
       objHTTP.setRequestHeader "Accept-Language", "ru-RU,ru;q=0.8,en-        US;q=0.6,en;q=0.4"
       'Here I use cookies retrieved with first GET request.
       objHTTP.setRequestHeader "Cookie", "sCookies"
       objHTTP.send sRequest
       'I use this msg to check that right cookies send with POST request.
        WScript.Echo sCookies
        HTTPPost =  objHttp.responseText
       'Write answer to TXT file.
       Set FSO = CreateObject("Scripting.FileSystemObject")
       Set oFile = FSO.OpenTextFile("D:\Results.txt", 2, True)
       oFile.Write(objHttp.responseText)
       oFile.Close
       Set oFile = Nothing
       Set FSO = Nothing
    end Function

スクリプトを機能させることはできません。URL2 を使用してリクエストを送信すると、空の TXT ファイルが返されます。URL3 (Chrome が表示するスクリプトへのパス) を使用してリクエストを送信すると、TXT ファイルで common.138.js の内容を受け取るだけです。しかし、Chrome の応答に示されているように、JSON 型で情報を受け取ることを期待しています。

私が気づいたこと、まず、ウェブサイトを更新して古いリクエストを再送信しようとすると、エラーが発生します。

NetworkError: 400 Bad Request - http://booking.uz.gov.ua/en/purchase/search/ "

おそらく、SessionID が変更されたためです。

次に、単純に駅名を書くことはできず、ドロップダウン リストから選択する必要があります (このサイトを UI モードで操作する場合)。またはエラーが発生しました - ドロップダウンリストから出発地を選択してください。

第 3 に、検索するサイトのボタンをクリックするだけでリクエストを送信しようとすると、Status Code:400 Bad Request というエラーが表示されます。SessionID の有効期限が切れたようです。

InternetExplorer.Application システム オブジェクトを使用した動作するスクリプトがありますが、決定ではありません。リクエストを送信して機能させたい。将来的にはphpでやってみたいです(学習プロセスの一部として)。

多分それは私のような人々からのある種の防御ですか?私のスクリプトを機能させる方法はありますか???? GET リクエストと POST リクエストの間で SessionID が変わるのではないでしょうか?? あるいは、VBScript では解決できず、たとえば PHP が必要なのかもしれません。

この問題を解決する方法がわかりません。お願い助けて。眠れない。食べられません。どうもありがとうございました。

4

3 に答える 3

5

間違ったGV-Tokenヘッダーを UZ サイトに送信しているため、「400」が返されます。最終的にGV-tokenは、いくつかのセッション依存変数の md5 です (セッションは_gv_sessid Cookie によって識別されます)。

このトークンは JavaScript で難読化されており、次のようにページ本文に存在します。

...
$$_.$_=($$_.$_=$$_+"")[$$_.$_$]+($$_._$=$$_.$_[$$_.__$])+($$_.$$=($$_.$+"")[$$_.__$])+((!$$_)+"")[$$_._$$]+($$_.__=$$_.$_[$$_.$$_])
...

これは次のように評価されます

localStorage.setItem('gv-token',4619709a341b4ffdacce3dafd2f85af3)

その後、すべての UZ Ajax リクエストに対して実行されます。

だから私はあなたが難読化を解除してくれることを願っています:))(弱い人向けではありません)

PSまた、アプリの構成またはリフレクションを介して.NET useUnsafeHeaderParsingを必ずオンにしてください。

UPD: ご覧のとおり、このトピックはまだ生きているので、難読化解除コードを作成しました。基本的な正規表現と文字列の検索と置換で十分なようです。

pageHTMLにUZ スタート ページ HTML があるとします。それを機能させるには、C# で次のようなもの (有効性チェックなし) が必要です。

難読化されたコードにはいくつかのトークンが含まれており、それぞれが 0 から F までの 16 進数に評価され、直接置き換えることができます。対応辞書は次のとおりです。

var subsitutes = new Dictionary<string, string>
{
    {"$$_.$$$", "7"},
    {"$$_.$$$$", "f"},
    {"$$_.$$$_", "e"},
    {"$$_.$$_", "6"},
    {"$$_.$$_$", "d"},
    {"$$_.$$__", "c"},
    {"$$_.$_$", "5"},
    {"$$_.$_$$", "b"},
    {"$$_.$_$_", "a"},
    {"$$_.$__", "4"},
    {"$$_.$__$", "9"},
    {"$$_.$___", "8"},
    {"$$_._$$", "3"},
    {"$$_._$_", "2"},
    {"$$_.__$" ,"1"},
    {"$$_.___", "0"},
};

次に、正規表現を使用して、興味のある難読化されたコードの一部を取得します

var scramble = Regex.Match(pageHTML, @"\$\$_\.\$\(\$\$_\.\$\((.*)\)\(\)\)\(\);");

上記のトークンを実際の意味に置き換えます

var keysSorted = subsitutes.Keys.OrderByDescending(key => key.Length);   
var halfBakedDeobfuscated = keysSorted.Aggregate(scramble.Groups[1].Value, (current, key) => current.Replace(key, subsitutes[key]));

ほぼ完了、ゴミを切り取る

var start = Regex.Escape(new string(new[] { '"', '\\', '\\', '\\', '"', ',', '\\', '\\', '"', '+' }) + "4+0+" + new string(new[] { '\"', '\\', '\\', '\\', '\"', '\"', '+' }));
var end = Regex.Escape(new string(new[] { '+', '"', '\\', '\\', '\\', '"', ')' }));    
var core = Regex.Match(halfBakedDeobfuscated, start + "(.*)" + end).Groups[1].Value;

現在、コアには gvToken のほぼクリーンなバージョンが含まれている7+0+f+a+7+7+9+8+5+7+e+b+3+3+a+8+3+c+7+8+3+b+d+d+e+f+4+8+7+7+f+7 ため、最後のステップはこれらの+シンボルを削除することです

var gvToken = string.Join(string.Empty, core.Split('+'));

最後に、gvTokenには、UZ サイトに提供する必要があるもの (. のような文字列) が含まれています70fa779857eb33a83c783bddef4877f7

JS ライブラリはなく、もちろん InternetExplorer も必要ありません。

于 2014-03-02T10:43:26.823 に答える
0

興味深いことに、InternetExplorer.Applicationを使用する必要があります。たとえば、powershell コードを一覧表示します。

$erroractionpreference = "Continue"
$ie = New-Object -ComObject "InternetExplorer.Application"
$ie.navigate("http://booking.uz.gov.ua/en/")
$ie.visible = $true
sleep 5
while($ie.ReadyState -ne 4) {start-sleep -m 100}
$ie.document.getElementByID("station_id_from").Value = "2200001"
$ie.document.getElementByID("station_id_till").Value = "2208001"
$ie.document.getElementsByName("station_from").Item(1).Value = "Kyiv"
$ie.document.getElementsByName("station_till").Item(1).Value = "Odesa"
$ie.document.getElementByID("date_dep").Value = "12.26.2014"
$ie.document.getElementByID("time_dep").Value = "00:00"
$ie.document.getElementByID("search").Click()  

このような場合、 GV-Tokenを含む Cookie を転送する必要はありません。InternetExplorer.Applicationなしで書く方法があると思いますが、コードでブラウザをエミュレートします。それを探索する必要があります。

于 2014-12-18T09:31:19.557 に答える