2014-12-08 1 views
0

Я пытаюсь использовать mitmproxy для адаптации запросов от клиента (агента мониторинга), который я не могу изменить.Использовать mitmproxy для перевода ключа/значения формы в сообщение тела

Клиент не может получать POST-данные, например. JSON или SOAP XML для запроса. Он может публиковать только пары имен/значений формы (или имя/значения заголовка).

Я пытаюсь обойти это ограничение:

  • получает от клиента отправить форму пары: «phony_key =»
  • с помощью mitmproxy удалить ключ и просто опубликовать данные

Запуск прокси с заменить выражение просто раздеть «phony_key =» выглядел хорошо первоначально

mitmproxy --replace /~bq/phony_param=/ 

... и произвел хороший результат, когда я вызывается запрос от завитка, что-то вроде

curl -d phony_param='<SOAP-ENV:Envelope></SOAP-ENV:Envelope> https://host:port/path 

Но когда вызывается из реального клиента, запрос был отклонен сервером.

Я думаю, что это связано с тем, что полезная нагрузка данных при отправке с реального клиента устарела. Проверка запроса в mitmproxy с использованием шестнадцатеричного варианта показывает это.

0000000000 25 33 43 53 4f 41 50 2d 45 4e 56 25 33 41 45 6e %3CSOAP-ENV%3AEn 
0000000010 76 65 6c 6f 70 65 2b 78 6d 6c 6e 73 25 33 41 53 velope+xmlns%3AS 
0000000020 4f 41 50 2d 45 4e 56 3d 25 32 32 68 74 74 70 25 OAP-ENV=%22http% 

Принимая во внимание запрос, сделанный вызовом curl, показывает некодированный XML в шестнадцатеричном представлении.

С тех пор я пытался сделать инлайн-скрипт, чтобы сделать работу

def request(context, flow): 
    if flow.request.method == "POST": 
     form = flow.request.get_form_urlencoded() 
     real_post = form.get("phony_param")[0] 
     form.__delitem__("phony_param") 
     print real_post 
     flow.request.content = real_post 
     flow.request.set_form_urlencoded(form) 

Выше я пытаюсь удалить имя формы/значение, добавить значение к содержанию запроса и добавить обратно измененная форма. Я не думаю, что я на правильном пути, или, по крайней мере, он пока не работает.

ответ

0

Спасибо mhils за помощь в этом.

Проблема со сценарием заключалась в том, что request.set_form_urlencoded и настройка request.content заменяют содержимое HTTPRequest. Вы должны установить один или другой.

Я ошибался, думая, что должен закодировать свой фильтр прокси, чтобы сохранить любые дополнительные параметры формы во входящем запросе. Но при отражении HTTP POST не смешивает разные типы контента. Поэтому отбрасывание формы правильное.

Исправленный скрипт производит действительный запрос:

def request(context, flow): 
    if flow.request.method == "POST": 
     form = flow.request.get_form_urlencoded() 
     real_post = form.get_first("phony_param") 
     if real_post: 
      flow.request.content = real_post