python3中需要Base64编码类似对象的字节

python3中需要Base64编码类似对象的字节,python,Python,我的代码是: _cmd = "|| echo " + base64.b64encode(args.cmd) + "|base64 -d|bash" p.update({"form_284": _cmd}) 我的错误是: Traceback (most recent call last): File "openemr_rce.py", line 136, in <module> _cmd

我的代码是:

_cmd = "|| echo " + base64.b64encode(args.cmd) + "|base64 -d|bash"
   p.update({"form_284": _cmd})
我的错误是:

Traceback (most recent call last):
  File "openemr_rce.py", line 136, in <module>
    _cmd = "|| echo " + base64.b64encode(args.cmd) + "|base64 -d|bash"
  File "/usr/lib/python3.8/base64.py", line 58, in b64encode
    encoded = binascii.b2a_base64(s, newline=False)
TypeError: a bytes-like object is required, not 'str'
回溯(最近一次呼叫最后一次):
文件“openemr_rce.py”,第136行,在
_cmd=“||echo”+base64.b64encode(args.cmd)+“| base64-d | bash”
b64encode中的文件“/usr/lib/python3.8/base64.py”,第58行
encoded=binascii.b2a_base64(s,换行符=False)
TypeError:需要类似字节的对象,而不是“str”
编辑:


当您在python2中运行它时没有问题,您的
args.cmd
是一个字符串

如果需要,请尝试
base64.b64encode(args.cmd.encode(“ascii”)).decode(“ascii”)


如果您的命令包含非ascii字符,则bash cmd采用依赖于系统的编码,您可以使用
sys.getdefaultencoding()
获取它。

正如错误所述,您必须将“类似字节的对象”传递给
b64encode
,而不是字符串。要从字符串中获取字节,可以调用
encode()


args.cmd
是一个
str
,它应该是一个
bytes
对象,以便与base 64编码兼容。如果不知道它从哪里来,我们就不知道它为什么是错误的类型。需要一个完整的答案。我想知道你是否在玩我最近看到OpenEMR用作目标的同一个CTF…是的@CharlesDuffy。这是一个开放的部分code@CharlesDuffy我不是对base64进行编码,我是对base64的输入进行编码,它可以是任何内容。@vortext你是什么意思?解决方案出了什么问题?回溯(上次的最新调用):文件“openemr_rce.py”,第136行,在_cmd=“| echo”+base64.b64encode(args.cmd.encode(“ascii”)+“| base64-d | bash”类型错误:只能连接str(而不是“字节”)来strIf解决方案帮助您,您可以通过单击答案旁边的绿色复选标记来选择接受答案。有关更多信息,请参阅@vortext。实际上,您还需要解码答案。适当更新了.Traceback(上次调用):文件“openemr_rce.py”,第136行,在_cmd=“|echo”+base64.b64encode(args.cmd.encode('utf8'))+“| base64-d|bash”类型错误:只能将str(而不是“字节”)连接到str@vortext请用当前代码发布新问题。提示:问题非常相似。您需要匹配正确的类型。
base64.b64encode(args.cmd.encode('utf8'))