Socket发送字符串报错:TypeError: a bytes-like object is required, not 'str'
解决Socket发送模糊测试Payload时的TypeError问题
嘿,我帮你搞定这个问题!这个错误其实是Python socket编程里的常见坑——socket.send()只接受字节对象,但你传的是字符串拼接后的str类型,所以才会抛出TypeError: a bytes-like object is required, not 'str'。
问题根源分析
看你的代码,在Send类的send_payload方法里,self.path + payload是两个字符串拼接,结果还是str类型,直接传给s.send()就会触发类型错误。你之前尝试用encode()但没生效,大概率是只给其中一部分做了编码(比如只给payload编码),但字符串和字节不能直接拼接,反而会引发新的错误。
具体修复方案
有两种简单的方式解决这个问题,选哪种都可以:
方案1:先拼接字符串,再统一编码为字节
修改send_payload方法里的发送行,把拼接后的完整字符串编码成字节再发送:
def send_payload(self, payload): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(2) s.connect((self.ip, self.port)) s.recv(1024) # 先拼接完整的请求内容,再编码为UTF-8字节 send_data = self.path + payload s.send(send_data.encode('utf-8')) s.close() except Exception as e: print(f"Exception In send: {e}") sys.exit()
方案2:分别编码字符串,再拼接字节对象
如果self.path和payload是独立的字符串,也可以分别编码后再拼接字节:
def send_payload(self, payload): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(2) s.connect((self.ip, self.port)) s.recv(1024) # 分别编码后拼接字节 s.send(self.path.encode('utf-8') + payload.encode('utf-8')) s.close() except Exception as e: print(f"Exception In send: {e}") sys.exit()
额外提示
- 如果你之后需要处理
recv()返回的内容,记得用decode('utf-8')把字节转成字符串,比如response = s.recv(1024).decode('utf-8') - 针对vulnserver的模糊测试,确保
self.path是正确的命令前缀(比如"TRUN /."),编码格式用UTF-8或者ASCII都可以,因为vulnserver对编码要求不严格
这样修改后,你的100个'A'的payload就能正常发送,不会再触发类型错误啦!
内容的提问来源于stack exchange,提问作者3therk1ll
相关产品推荐
相关产品推荐

