【问题标题】:simulate api calling like happened in flash模拟 api 调用就像在 flash 中发生的一样
【发布时间】:2019-02-06 01:11:10
【问题描述】:

我想知道如何调用在shoretel IP电话远程运行的php函数。

我可以通过简单的 IP 通过浏览器访问它,它是 Flash 播放器脚本,但我想以编程方式做一些事情,但我找不到任何帮助。

Flash 播放器应用正在调用以下 api https:///gateway.php?PHPSESSID=6432fc5f0999d0f4536fced79b95

并且在它的有效载荷中它正在调用像 LSRoom_Remoting.getHeaderInfo 这样的 php 函数

我正在尝试但收到“格式错误的 AMF 消息”之类的错误

这里是代码

static void Main(string[] args)
    {
        ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) => true;
        var content = new StringContent("LSRoom_Remoting.getBoardID", Encoding.UTF8, "application/x-amf");
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Add("Accept","*/*");
            client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate, br");
            client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.9");
            client.DefaultRequestHeaders.Add("Connection", "keep-alive");
            //client.DefaultRequestHeaders.Add("Content-Length", "47");
            //client.DefaultRequestHeaders.Add("Content-Type", "application/x-amf");
            client.DefaultRequestHeaders.Add("Cookie", "PHPSESSID=3cbc7ff268e80e78e1458a4adfdd1f56");
            client.DefaultRequestHeaders.Add("DNT", "1");
            client.DefaultRequestHeaders.Add("Host", "10.6.32.21");
            client.DefaultRequestHeaders.Add("Referer", "https://10.6.32.21/interface/ls_interface.swf");
            client.DefaultRequestHeaders.Add("Origin", "https://10.6.32.21");
            client.DefaultRequestHeaders.Add("X-Requested-With", "ShockwaveFlash/32.0.0.114");
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");
            var result = client.PostAsync(string.Format("https://10.6.32.21/gateway.php?PHPSESSID={0}", "3cbc7ff268e80e78e1458a4adfdd1f56"), content).Result;
            //var result = client.DownloadString("https://10.6.32.21/interface/interface.php?uniqueKey=152322314997139&brand=shoretel&key=");
            var obj = result.Content.ReadAsStringAsync();
            Console.WriteLine(result.Content.ToString());
            Console.ReadKey();
        }
    }

我做错了什么?

【问题讨论】:

    标签: php .net remoting amf


    【解决方案1】:

    PHPSESSID 似乎很可能已过期,而没有使用最近请求中的一个;因为默认超时是 15 分钟。如果它还没有过期,你仍然需要构建一个正确的AMF 消息,它由一个标题和一个正文组成。有一个库:amfphp,它至少应该提供一些线索,尽管它是用PHP 编写的。

    【讨论】:

    • 嗨,马丁,感谢您的调查。我尝试了不同的会话 ID,甚至从浏览器请求,然后捕获该会话 ID 并尝试确保它没有过期。我将研究 amfphp。我想知道,虽然web应用程序是用flash开发的或者需要flash的,但底层模型不应该是简单的请求响应模型吗?因为最后我们需要调用的是一个远程php函数。我们是否必须构建 AMF 消息?
    • @user393014 除了PHPSESSID 之外,可能还设置了更多会话变量,将这些cookie 呈现给发布服务器只是一种奇怪的方式。理想情况下,执行登录的同一客户端应该执行后续请求(因为它在大多数 API 交互或 cURL 脚本中都很常见)。我猜,它可能会抱怨 AMF 消息格式错误,因为它是字符串而不是字节数组:en.wikipedia.org/wiki/Action_Message_Format
    • 这里甚至还有一个AMF 标签:stackoverflow.com/questions/tagged/amf ...目前还不清楚这是AMF self-contained packetAMF0 还是AMF3。无论如何,从HTTPSHTTP切换,那么应该很容易捕获数据包,以便反向和重现请求。
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2021-06-20
    相关资源
    最近更新 更多