fiddler二次转发实现动态改包
问题场景描述
正如我上一篇所提到的,如何更加精确有状态地实现动态修改请求返回包?对有状态这里理解可能有点问题,我描述一个场景会更直观一点。
一个应用软件向服务器请求时间戳,第一次请求返回为A,通过修改返回包,使第二次返回A+B,第三次返回A+B+B…..这里面有一个递增的关系,这就是我所描述的状态。
常见的改包是无状态的,即我使用burp,他的自动改包是一个正则表达式匹配的字符串替换;使用fiddler,通过的他脚本进行返回包修改,但修改函数是无状态的,每请求一次,函数便重新运行一次,是无法计数的,也就是我所说的无状态。
解决问题思考
要解决这个问题,首先想到的是重写的一个代理,但这部分工作我觉得并不是那么简单,要做到像burp或者fiddler那样成熟的工具,并不是个简单的活。
偶然间的想法,让我想到可以在fiddler这一层代理上,进行一个请求的二次“转发”,这个转发有点歧义,我所说的转发是将请求的返回结果进行一次转发,再发送到一个第三方服务器,这个服务器返回我们要的结果。自然,这个第三方服务器是我们可以控制的,自然。
fiddler发送请求实现
查找资料发现fiddler的script可以通过以下三个函数进行请求发送:
- FiddlerApplication.oProxy.SendRequest
- FiddlerApplication.oProxy.SendRequestAndWait
- FiddlerObject.utilIssueRequest
SendRequest和SendRequestAndWait用法是一样的,区别在于一个只是发送了请求,并不能处理返回包,SendRequestAndWait可以处理返回包,所以SendRequestAndWait就是我们需要的函数。utilIssueRequest也是发送请求无法处理返回包。
这里也简单提一下utilIssueRequest的使用方法,utilIssueRequest的使用比另外两个函数要简单得多,只是处理字符串,然后拼接成一个请求头,而SendRequest和SendRequestAndWait得两个参数分别是HTTPRequestHeaders和Byte[]类型。utilIssueRequest使用简单demo如下,即向http://localhost:9090/发送了一个POST请求:
1 | var method:String = 'POST'; |
回到真正所需要得SendRequestAndWait函数,这个函数用法挺难找的,所幸还是找到了,我最后写的代码如下:
1 | if (oSession.HostnameIs("www.humblegames.cn")&& oSession.uriContains('fightingx/utils/timeUtil2.php')){ |
代码实现的内容:首先获取当前请求的返回包,将返回包的body通过POST请求转发到127.0.0.1:9090,再将127.0.0.1:9090返回的结果当作最后此次请求的返回body。
在9090端口也是一个简单的flask服务器,这里通过一个计数器便可以解决上面的状态问题:
1 | # -*- coding: utf-8 -*- |
这上面两段代码也就解决了我一开始所描述的场景问题。
又一个问题
这里我所实现的第三方服务器是一个flask,但当请求返回的结果是一个复杂的html时,里面有各种换行各种符号等等,将这种数据作为POST请求的data,在flask这边是很难处理的。是否有更优雅更加完备的第三方服务器实现方式,能够获取所有POST数据,处理这种问题?