在过去的几天里,我一直在修补一个we服务器漏洞,我被Python中的一部分给难住了。我用python编写了一个格式错误的http POST数据,当我将其粘贴到Http Live头文件中并重放请求时,100次中有100次可以正常工作。
问题是,当我尝试删除Replay头部分并只使用python来完成整个操作时,python似乎没有发送完整的POST命令。
我使用的是:
send = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
send.connect(('hostname', 80))
send.send(PostCommand)
send.close()PostCommand大约为36000个字符。当我查看Python方法之后的堆栈时,它至少能够导致异常,但不能发送足够的数据来覆盖SEH。每次都有不同数量的信息进入web服务器。
有没有可能缺少一个参数来强制Python发送整个命令,或者只是HTTP头在后台做了一些我没有意识到的事情?
在发送之前,我正在将PostCommand写入磁盘,下面是它的样子:
POST /PATH HTTP/1.1
Host: hostname 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://hostname/path.htm
Proxy-Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------1234567890
Content-Length: 139
If-Modified-Since: *
-----------------------------1234567890
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA... (continued to 36000+)发布于 2016-03-12 02:56:49
socket.send()方法将写入尽可能多的内容,直到您提供给它的缓冲区的大小。但是由于许多原因,写入的字节数可能小于缓冲区大小。
应用程序始终负责检查是否写入了完整的缓冲区,并在需要时自行重新发送缓冲区。这来自底层的C套接字库。请参阅man send(2)或有关socket.send()方法的文档。
执行此操作的方法通常是:
nsent = 0
while nsent < len(buffer):
    nsent += sock.send(buffer[nsent])https://stackoverflow.com/questions/35947433
复制相似问题