You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:12:03