#python #mitmproxy
#питон #mitmproxy
Вопрос:
Я пытаюсь заменить ответ в mitmproxy результатом повторной отправки того же запроса снова. Это мой текущий сценарий:
from mitmproxy import http from mitmproxy import ctx import requests import re class ReplaceToken: nextToken = "" def response(self, flow: http.HTTPFlow): m = re.search('localhost.local:8085/test/index.php/(. ?)" method=', str(flow.response.content)) if m: self.nextToken = m.group(1) ctx.log.info("Next token: " self.nextToken) m = re.search('Wrong token!lt;brgt;', str(flow.response.content)) if m: flow = flow.copy() request = flow.request.copy() ctx.log.info("Found wrong token! Resend request with correct token...") request.path = re.sub("/[^/]*$", "/" self.nextToken, flow.request.path) playback = ctx.master.addons.get('clientplayback') flow.request = request playback.start_replay([flow]) addons = [ReplaceToken()]
В ответе я хочу обнаружить условие ошибки (например, неправильный токен CSRF). Если это условие присутствует, я хочу повторно отправить запрос с правильным маркером, дождаться правильного ответа и заменить исходные данные ответа на правильные.
Однако в приведенном выше сценарии ответ не заменяется. И правильный запрос делается только в mitmprox внутренне.
Возможным обходным путем было бы использовать $random-http-lib
для выполнения HTTP-запроса в обход mitmproxy. Например, следующий PoC:
import requests def response(self, flow: http.HTTPFlow): r = requests.get("http://www.example.com") ctx.log.info(r.text) flow.response.text = r.text
Однако для этого потребуется вручную «скопировать» каждый аспект из исходного запроса (метод HTTP, путь, заголовки, тело и т. Д.) Во внешнюю библиотеку HTTP, чего я хотел бы избежать.
Есть ли какой-либо способ добиться этого, используя только саму mitmproxy?